获取在findHomography中RANSAC所使用的5个点(针对Android平台的OpenCV)

3
在OpenCV for Android中,函数org.opencv.Calib3d.findHomography(..)返回齐次变换矩阵。例如,此函数仅返回单应性变换矩阵:
Mat homography = Calib3d.findHomography(points1, points2, Calib3d.RANSAC, 0.5);

有没有一种方法可以从Android OpenCV API中返回RANSAC实际使用的点?
1个回答

9

更新

我不确定这是否是OpenCV的新功能,还是我之前错过了,但是 findHomography() 函数实际上可以给出内点(OpenCV 2.4.2)。最后一个参数 mask 默认为空,将填充使用RANSAC找到的内点的索引处的值为1(或255)。

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

旧答案

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

提取它们的一种方法是修改findHomography函数(和相应的RANSAC函数)。但这很丑陋。

另一种更干净的方法是测试输入中哪些点对匹配了单应性:

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

正确的函数名称和输入参数顺序为: void perspectiveTransform(InputArray src, OutputArray dst, InputArray m),在这种情况下是cv::perspectiveTransform(points1, points1_dest, homography) OpenCV透视变换

使用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));

两点之间的距离也可以使用勾股定理计算。

为了查看哪些点与points2中的对应点足够接近,可以使用距离。该距离应小于或等于min_distance^2。在您的情况下,0.5*0.5 = 0.25


如果直接修改RANSAC代码,那么保存使用的点的确切位置在哪里?会在循环内部吗if( goodCount > MAX(maxGoodCount, modelPoints-1) ){} ??? 因此,在此时存储ms1和ms2的值? - Jav_Rock

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