OpenCV 的 findHomography 函数生成无意义的结果。

5
我正在制作一个使用OpenCV(2.43) ORB追踪特征的程序。我遵循了这个教程,并使用了这里的建议
我的目标是在视频中追踪物体(人脸)并在其周围画一个矩形。
我的程序能够正确地找到关键点并将它们匹配。但是当我尝试使用findHomography+perspectiveTransform来查找图像的新角落时,通常会返回一些无意义的值(尽管有时会返回正确的单应性矩阵)。
以下是一个示例图片:example 以下是相关的问题部分:
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 );

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

P.S. 要跟踪的源图像是从视频输入中复制的区域,然后在来自该输入的新图片中进行跟踪,这会有影响吗?


提供更多信息,例如输出的图像,将会很有用。 - Jacob Parker
好的,它类似于这里:http://dl.dropbox.com/u/5481096/Clipboard02.jpg。 - user2184001
我已经在你的问题中编辑了图片。如果你想在将来提供更多信息,最好编辑你的问题,这样更多的人就可以轻松地看到它。 - Jacob Parker
似乎你的点非常接近一条直线。在这种情况下,估计单应性是不可能的。 - Ela782
为什么不使用Viola Jones跟踪人脸而不是特征描述符?您可以查看此主题:https://dev59.com/6G025IYBdhLWcg3wwo6m - flaviussn
1个回答

0

函数perspectiveTransform在假设对应点集没有误差时估计单应性矩阵。但是,在现实世界的数据中,您不能这样假设。解决方案是使用鲁棒估计函数,例如RANSAC将单应性问题作为超定方程组来解决。

相反,您可以使用findHomography函数返回单应性矩阵。该函数的输入是一组点。此集合至少需要4个点,但更大的集合更好。单应性只是一个估计值,但更加鲁棒抗错误。通过使用CV_RANSAC标志,它能够内部去除异常值(错误点对应)。


即使使用了RANSAC标志,仍然存在相同的问题。 - Mew

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