OpenCV的findHomography产生无意义的结果

时间:2013-03-18 21:21:02

标签: c++ opencv

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

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

我的程序找到关键点并正确匹配它们,但是当我尝试使用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。要跟踪的源图像是从视频输入中复制然后在该输入的新图片中跟踪的区域,是否重要?

1 个答案:

答案 0 :(得分:0)

函数 perspectiveTransform 在假设您的对应点设置不容易出错的情况下估计单应性。但是,在现实世界的数据中,你无法想象。解决方案是使用强大的估计函数(例如RANSAC)来解决单应性问题,作为超定方程组。

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