更新
我不确定这是否是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
。