在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的内部索引处填充一个(或255).
Mat findHomography(InputArray srcPoints, InputArray dstPoints,
int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )
// ^
// |
老答案
RANSAC用于估计单应性的点(在技术文档中称为inlier)不能直接提取.它们在内部计算,但随后删除列表.
提取它们的方法是修改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));
也可以使用毕达哥拉斯定理计算两点之间的距离
看看它们中哪一个足够接近它们的对2.距离应小于或等于min_distance ^ 2.在你的情况下,0.5 * 0.5 = 0.25.