OpenCV光流断言

18

我正在尝试使用Python 2.7和OpenCV 2.4.11通过dsift获取面部特征轮廓来跟踪关键点。我希望能够在帧之间跟踪这些特征。

然而,我收到了以下错误提示。我已经检查过输入图像是1通道等尺寸的(并且是无符号8位类型),以及之前的点也是如此:

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

问题出现的那一行代码:

new_pts, ttl, err = cv2.calcOpticalFlowPyrLK(self.old_img, i_img, i_old_pts, None)

有人知道我该从哪里开始调试吗?


2
仍未解决,如果有人想帮忙。 - lukemtesta
3个回答

36

我在基于光流的跟踪中也遇到了同样的问题,尝试了很多不同的方法来解决,但都无济于事。

最后,在一个示例程序中,他们使用了shi-tomsi角点检测进行跟踪,这些点被用于LK算法,效果非常好。所以我探究了Shi-Tomasi检测器输出的数据类型和维度,并确保要跟踪的点是相同类型的。它奏效了!

以下是需要知道的:

  • 确保图像为灰度。
  • 您的坐标参数i_old_pts应该是单精度浮点数,即float32。此类型在numpy中可用,请使用它。Python中的float为float64。
  • 您的坐标参数i_old_pts(来自您的程序)应该是一个numpy数组,其维度为(n,1,2),其中n表示点的数量。

这应该会起作用。


np.float32(coorX), np.float32(coorY) 帮助了我。 - Deepak Sharma
4
我需要将我的numpy数组初始化为np.float32类型。 - Mateen Ulhaq
3
非常感谢!我花了好几个小时才弄清楚出了什么问题... 在文档中,cv2 Python绑定应该明确提到预期的参数类型。 就C函数签名而言,它们会这样做(例如,在cornerSubPix函数的角点阵列的情况下,其类型为CvPoint2D32f * corners)。 假设corners是我的初始角落数组,那么我使用了corners.astype(np.float32) - trueter
非常感谢!如果没有您明确地写出这些数据类型和数组形状,它们真的很难弄清楚。OpenCV为什么不直接告诉我们呢?天哪! - Sibbs Gambling
这个人是个神。 - ntakouris

0

我按照OpenCV光流示例进行操作时遇到了同样的问题。在我的情况下,问题出在我读取的视频文件类型上。我是从MKV文件中读取的,但无法正常工作。


0

我不确定为什么,但经过大量的代码评估和调试,我发现我的视频的第一帧(我从网络摄像头捕获视频)是一个空的黑色图像。因此,我使用了第二帧:

ret, prevframe = cap.read();
ret, prevframe = cap.read(); # the first frame was black and I was not sure why!!!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接