Я пытаюсь рассчитать оптический поток некоторых точек, извлеченных с помощью openCv goodFeaturesToTrack. Функция calcOpticalFlowPyrLK прекрасно работает до тех пор, пока я отправляю ей точки, извлеченные непосредственно из goodFeaturesToTrack, или точки, измененные с помощью функции numpy. np.array_like и np.squeeze оба совместимы. Однако, если я отправляю эти точки из фрагмента массива float32, он зависает, и я получаю следующую ошибку:
error: OpenCV(4.1.0) D:\Build\OpenCV\opencv-4.1.0\modules\video\src\lkpyramid.cpp:1229: error: (-215:Assertion failed) (npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0 in function 'cv::`anonymous-namespace'::SparsePyrLKOpticalFlowImpl::calc'
Ниже приведен пример кода:
cap = cv2.VideoCapture(fname)
ret,frame = cap.read()
gr_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
candidate_feats = cv2.goodFeaturesToTrack( image = gr_img,
maxCorners = 5,
qualityLevel = 0.3,
minDistance = 7,
mask = None,
blockSize = 7)
pts_candidate = np.squeeze(candidate_feats, 1) #this one works fine
pts = np.zeros_like(pts_candidate) #this works fine too
pts = np.zeros(pts_candidate.shape, dtype=np.float32) #this one works
#the feature array from which I want to take a slice
feats = np.zeros([len(pts_candidate),13], dtype=np.float32)
feats[:,6:8] = pts_candidate
pts = feats[:,6:8] #this one hangs
pts_candidate, st, err = cv2.calcOpticalFlowPyrLK(prevImg = gr_img,
nextImg = gr_img,
prevPts = pts,
nextPts = None,
winSize = (15,15),
maxLevel = 2,
criteria = (cv2.TERM_CRITERIA_EPS |
cv2.TERM_CRITERIA_COUNT,
10, 0.03))
Есть предложения?