findHomography用法opencv

时间:2016-04-05 14:03:05

标签: c++ opencv object-detection motion-detection

我正在使用opencv c ++并且是新用户。我对物体检测问题很感兴趣。到目前为止,我已经研究并在一个固定摄像机的视频中实现了稀疏光流(Lucas Kanade方法)的使用。在尝试k均值和背景减法后,我决定转向更难的问题,即移动摄像机。

我到目前为止研究了一些文档并发现我可以使用cv :: findHomography来查找视频中帧序列中的内点或异常值,然后从返回的值中了解由于相机运动和由于物体运动引起的。另外,我可以使用SURF功能跟踪一些对象,然后决定哪些是好点。

然而,我想知道如何实施这一理论。例如,我应该使用第一帧作为基础事实并使用SURF检测某些功能,然后对于视频的其余部分使用每帧的findHomography?欢迎任何想法/帮助!

1 个答案:

答案 0 :(得分:1)

从移动的摄像机中检测移动物体是一项非常具有挑战性的任务,并且需要对多视图几何体有充分的了解,此外关于该主题的信息较少(例如,关于运动的结构),所以要注意! / p>

无论如何,单应矩阵不是检测移动物体的好选择(除非你100%确定你的背景可以用足够精确的平面表示)。你应该使用基本矩阵或三焦张量。

Fundamental matrix是根据2帧之间的点对应计算的。它将一个图像上的点与其他图像上的线(所谓的极线)相关联,这样它就独立于场景结构。在使用一些稳健的估计方法(例如RANSACLMEDS(RANSAC似乎更适合此类任务)获得F矩阵后,您可以计算每个点的重投影误差。 F矩阵无法准确描述与场景独立移动的对象,并且会产生更大的误差。因此,根据两帧上的图像匹配计算的F矩阵的异常值可以被认为是移动对象。但需要注意的是 - 这种方法无法检测到沿着极线移动的物体,因为它们的视差也可以通过某种深度水平来描述。

Trifocal tensor没有沿着极线移动的对象的深度/运动模糊度,但是它更难估计并且不包含在OpenCV中。它可以从3帧的对应关系计算出来,其用法可以概念性地描述为从2个视图中对点进行三角测量,然后在第3个视图上计算重投影误差。

至于匹配 - 如果你使用视频序列,我仍然认为LK tracking会优于SURF匹配,因为在这种情况下你不需要将非常远的点视为匹配,并且跟踪通常比检测+匹配更快。