OpenCV 的 findHomography 产生无意义的结果

Posted

技术标签:

【中文标题】OpenCV 的 findHomography 产生无意义的结果【英文标题】:OpenCV's findHomography produces nonsense results 【发布时间】:2013-03-18 21:21:02 【问题描述】:

我正在制作一个程序,使用我关注的 OpenCV (2.43) 中的 ORB 跟踪功能 this tutorial 并使用了建议 from here。

我的目标是跟踪视频源(面部)中的对象并在其周围绘制一个矩形。

我的程序找到关键点并正确匹配它们,但是当我尝试使用 findHomography + perspectiveTransform 为图像查找新角时,通常会返回一些无意义的类型值(尽管有时它会返回正确的单应性)。

这是一个示例图片:

这里是对应的有问题的部分:

Mat H = findHomography( obj, scene, CV_RANSAC );  

//-- Get the corners from the image_1 ( the object to be "detected" )
std::vector<Point2f> obj_corners(4);
obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( img_object.cols, 0 );
obj_corners[2] = cvPoint( img_object.cols, img_object.rows ); obj_corners[3] = cvPoint( 0, img_object.rows );
std::vector<Point2f> scene_corners(4);

perspectiveTransform( obj_corners, scene_corners, H);

//-- Draw lines between the corners (the mapped object in the scene - image_2 )
line( img_matches, scene_corners[0] + Point2f( img_object.cols, 0), scene_corners[1] + Point2f( img_object.cols, 0), Scalar(0, 255, 0), 4 );
line( img_matches, scene_corners[1] + Point2f( img_object.cols, 0), scene_corners[2] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
line( img_matches, scene_corners[2] + Point2f( img_object.cols, 0), scene_corners[3] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
line( img_matches, scene_corners[3] + Point2f( img_object.cols, 0), scene_corners[0] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );

其余代码实际上与我提供的链接中的相同。 绘制的线条似乎完全随机,我的目标只是在新场景中获得源对象的最小矩形,所以如果有替代使用单应性的方法也可以。

附:要跟踪的源图像是从视频输入复制的区域,然后在该输入的新图片中进行跟踪,这有关系吗?

【问题讨论】:

提供更多信息,例如输出的图像会很有用。 嗯,就像这里:dl.dropbox.com/u/5481096/Clipboard02.jpg. 我将图像编辑到您的问题中。如果您想在将来提供更多信息,最好编辑您的问题,以便更多人可以轻松查看。 看起来你的点在一条线上非常接近。在这种情况下,无法估计单应性。 为什么不使用 Viola Jones 来跟踪人脸而不是特征描述符?你可以查看这个话题:***.com/questions/5808434/… 【参考方案1】:

perspectiveTransform 函数在您的对应点集不易出错的假设下估计单应性。但是,在现实世界的数据中,您不能假设。解决方案是使用稳健的估计函数(例如 RANSAC)来解决作为超定方程组的单应性问题。

您可以使用 findHomography 函数代替它返回单应性。该函数的输入是一组点。这组至少需要 4 分,但更大的一组更好。单应性只是一个估计,但对错误更稳健。通过使用 CV_RANSAC 标志,它能够在内部删除异常值(错误的点对应)。

【讨论】:

以上是关于OpenCV 的 findHomography 产生无意义的结果的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV findHomography 错误

openCV 特征点识别 与findHomography算法过滤

s_i 在 OpenCV findHomography() 函数中代表啥?

openCV中的findHomography函数分析以及RANSAC算法的详解

与 OpenCV findHomography 和 warpPerspective 混淆

opencv cv2.findHomography sift、surf特征匹配 单应性矩阵理解