我正在尝试在Python OpenCV中创建一个程序,用户可以在该程序上定义视频上的点,然后光学流将对其进行跟踪。

我试图以numpy数组的形式创建自己的坐标,并试图将其传递到OpenCV中的calcOpticalFlowPyrLK方法中,但是却出现错误:

Traceback (most recent call last):
    p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, d, None, **lk_params)
error: /build/buildd/opencv-2.4.8+dfsg1/modules/video/src/lkpyramid.cpp:593:
error: (-215) (npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0 in function calcOpticalFlowPyrLK

我的代码:
# params for ShiTomasi corner detection
feature_params = dict( maxCorners = 1,
                       qualityLevel = 0.01,
                       minDistance = 10,
                       blockSize = 7 )


p0 = np.array([[[348.0, 251.0]]])
# calculate optical flow
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)

我知道这是由p0变量引起的,因为如果我将p0设为:
p0 = cv2.goodFeaturesToTrack(old_gray, mask = mask_use, **feature_params)

并将其传递给calcOpticalFlowPyrLK参数,它可以正常工作。但是,我试图制作一个用户定义点的程序,因此,如果我创建自己的坐标并将p0传递给calcOpticalFlowPyrLK参数,如下所示:
d = np.array([[[348.0, 251.0]]])
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, d, None, **lk_params)

然后我最终得到了错误。

我必须创建calcOpticalFlowPyrLK方法接受的numpy数组吗?

最佳答案

从文档:



所以p0必须是2D点的 vector :

p0 = [[x0, y0], [x1, y1], [x2, y2]]

因此,仅凭您的一点,我希望它能起作用:
p0 = [[348.0, 251.0]]

我认为您使用了太多的括号,然后使用了太多。

08-18 07:50