OpenCV 光流断言

问题描述 投票:0回答:4

我正在尝试使用 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)

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

python opencv video-tracking
4个回答
38
投票

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

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

这是你需要知道的。

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

这应该有效。


0
投票

我在关注 opencv 光流样本时也遇到了同样的问题。就我而言,问题在于我正在读取的视频文件的类型。我正在读取 mkv 文件,但它不起作用。


0
投票

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

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

0
投票

就我而言,一切都工作正常,直到一个非常特定的时刻,我实现了一种不同的方法,当没有要跟踪的重要点时,

i_old_pts
的值返回为
None
。我的解决方法是添加这一行:

if len(i_old_pts) == 1: i_old_pts = np.zeros((1,2), dtype=np.float32)

这样至少会有一个零数组供光流读取。

由于

i_old_pts
变量包含要跟踪的所有角,因此它包含一个 numpy 坐标数组。就我而言,有一种情况,
i_old_pts
的值返回为
None
,所以我只是利用了这样一个事实:此时
i_old_pts
的长度仅为1(只有
None
)值)并在任意点进行替换。

如果您遇到相同的错误,您始终可以将前一帧中的一两个坐标点存储到子帧中,以防出现

NoneType
错误。当我测试一个快速视频剪辑时,这种情况特别发生在我身上,它突然切换了场景,所以我只是为该过渡场景插入一个随机点,并允许光流在场景继续时恢复工作。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.