在 OpenCV for Android 中,函数 org.opencv.Calib3d.findHomography(..) 返回齐次变换矩阵。例如,这仅返回单应性:
Mat homography = Calib3d.findHomography(points1, points2, Calib3d.RANSAC, 0.5);
有没有办法从 Android OpenCV API 返回 RANSAC 实际使用的点?
在 OpenCV for Android 中,函数 org.opencv.Calib3d.findHomography(..) 返回齐次变换矩阵。例如,这仅返回单应性:
Mat homography = Calib3d.findHomography(points1, points2, Calib3d.RANSAC, 0.5);
有没有办法从 Android OpenCV API 返回 RANSAC 实际使用的点?
更新
我不确定它是 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 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));
两点之间的距离也可以使用勾股定理计算
看看他们中的哪一个在points2上与他们的对足够接近。距离应小于或等于min_distance^2
。在你的情况下,0.5*0.5 = 0.25
.