15

我正在尝试使用 python 2.7 和 openCV 2.4.11 沿着通过 dsift 获得的面部特征轮廓跟踪地标。我想在帧之间跟踪这些特征。

但是我收到以下错误。我已经检查了输入图像是 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

导致问题的线路:

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

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

4

3 回答 3

34

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

最后,有一个示例程序,他们在其中使用 shi-tomsi 角点检测进行跟踪,这些点用于 LK 算法并且运行良好。因此,我研究了 Shi-Tomsi 检测器输出的数据类型和维度,并确保要跟踪的点属于同一类型。它醒了!

这是你需要知道的。

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

这应该有效。

于 2016-05-12T04:15:26.527 回答
0

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

ret, prevframe = cap.read();
ret, prevframe = cap.read(); # the first frame was black and I was not sure why!!!
于 2021-10-29T22:03:32.643 回答
0

我正在关注用于光流的 opencv 示例也有同样的问题。就我而言,问题是我正在阅读的视频文件的类型。我正在从不起作用的 mkv 文件中读取。

于 2018-04-19T19:50:08.173 回答