我正在制作一个程序来跟踪来自 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 );
其余代码实际上与我提供的链接中的相同。
绘制的线条似乎完全随机,我的目标只是在新场景中获得源对象的最小矩形,所以如果有使用单应性的替代方法也可以。
P.S.要跟踪的源图像是从视频输入复制的区域,然后在来自该输入的新图片中进行跟踪,这有关系吗?
最佳答案
函数 perspectiveTransform
在假设您的相应点集不易出错的情况下估计单应性。但是,在现实世界的数据中,您不能假设。解决方案是使用稳健的估计函数(例如 RANSAC)来解决单应性问题作为超定方程组。
您可以使用 findHomography
函数代替它返回单应性。这个函数的输入是一组点。这组至少需要 4 点,但更大的组更好。单应性只是一种估计,但它对错误的抵抗力更强。通过使用 CV_RANSAC 标志,它能够在内部删除异常值(错误的点对应)。
关于c++ - OpenCV 的 findHomography 产生无意义的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15487176/