OpenCV光流断言

luk*_*sta 9 python opencv video-tracking

我试图跟踪通过dsift与python 2.7和openCV 2.4.11获得的面部特征轮廓的地标.我想跟踪帧之间的这些功能.

但是我收到以下错误.我已检查输入图像是1通道相等尺寸(和无符号8位类型),同样与prev点:

OpenCV Error: Assertion failed ((npoints = prevPtsMat.checkVector(2, CV_32F, tru
e)) >= 0) in cv::calcOpticalFlowPyrLK, file ..\..\..\modules\video\src\lkpyramid.cpp
cv2.error: ..\..\..\modules\video\src\lkpyramid.cpp:845: error: (-215) (npoints
= prevPtsMat.checkVector(2, CV_32F, true)) >= 0 in function cv::calcOpticalFlowP
yrLK
Run Code Online (Sandbox Code Playgroud)

导致问题的行:

new_pts, ttl, err = cv2.calcOpticalFlowPyrLK(self.old_img, i_img, i_old_pts, None)
Run Code Online (Sandbox Code Playgroud)

有谁知道我可以在哪里开始调试这个?

Kau*_*kar 16

当我进行基于光流的跟踪时,我遇到了同样的问题.我尝试了很多不同的方法来解决这个问题.但徒劳无功.

最后,有一个示例程序,他们使用shi-tomsi角点检测跟踪,这些点在LK算法中使用,并且它工作得很好.所以我探讨了Shi-Tomsi探测器输出的数据类型和尺寸,我确保跟踪的点数属于同一类型.它开玩笑了!

这是你需要知道的.

  • 确保图像是灰度的.
  • 你的坐标参数i_old_pts应该是单精度浮点数,意思是float32.这种类型可以使用numpy.python中的float是float64
  • 坐标参数i_old_pts(来自您的程序)应该是一个numpy数组,其维度为(n,1,2),其中n表示点数.

这应该工作.

  • 我必须将numpy数组初始化为`np.float32`类型。 (2认同)
  • 非常感谢!我花了几个小时试图弄清楚发生了什么.. cv2 python 绑定应该在文档中明确提到预期的参数类型。他们为 C 函数签名做这件事(例如,在cornerSubPix 函数的角数组的情况下,它的 CvPoint2D32f* 角)。让 `corners` 作为我的初始角数组,然后我使用 `corners.astype(np.float32)` (2认同)