获取RANSAC在findHomography中使用的5个点(适用于Android的OpenCV)

时间:2012-04-07 23:20:06

标签: android opencv homography

在OpenCV for Android中,函数org.opencv.Calib3d.findHomography(..)返回齐次转换矩阵。例如,这只返回单应性:

Mat homography = Calib3d.findHomography(points1, points2, Calib3d.RANSAC, 0.5);

有没有办法从Android OpenCV API返回RANSAC实际使用的点?

1 个答案:

答案 0 :(得分:8)

<强>更新

我不确定它是OpenCV的新增内容还是我错过了它,但findHomography()函数实际上可以为你提供内部函数(OpenCV 2.4.2)。最后一个参数mask在默认情况下为空,将在RANSAC的内部索引处填充一个(或255)。

Mat findHomography(InputArray srcPoints, InputArray dstPoints, 
     int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )
//                                                               ^
//                                                               |

旧答案

RANSAC用于估计单应性的点(在技术文档中称为inlier)无法直接提取。它们在内部计算,但随后删除列表。

提取它们的方法是修改find​​Homography函数(以及相应的RANSAC函数)。但这很难看。

另一种更清洁的方法是测试输入中的点对与单应性匹配:

使用projectPoints(points1, homography, points1_dest)(我希望这是函数名称)将单应性应用于points1。

正确的函数名称和输入参数顺序为: void perspectiveTransform(InputArray src,OutputArray dst,InputArray m),在本例中为cv :: perspectiveTransform(points1,points1_dest,homography) OpenCV Perspective Transform

使用cv::distance(points1_dest, points2)

正确的函数名称和输入参数顺序为: double norm(InputArray src1,int normType = NORM_L2,InputArray mask = noArray())

可能的实施:

std::array<cv::Point2f, 1> pt1;
pt1[0] = points1_dest;
std::array<cv::Point2f, 1> pt2;
pt2[0] = points2;
distance = cv::norm(pt1,  pt2));

OpenCV norm function

两点之间的距离也可以用毕达哥拉斯定理计算

看看它们中哪一个足够接近它们在point2中的对。距离应小于或等于min_distance^2。在您的情况下,0.5*0.5 = 0.25