Getting the 5 points used by RANSAC in findHomography (OpenCV for Android)

前提是你 提交于 2020-02-28 08:43:51

问题


In OpenCV for Android, the function org.opencv.Calib3d.findHomography(..) returns the homogeneous transformation matrix. For example, this only returns the homography:

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

Is there a way to return the points that RANSAC actually uses from the Android OpenCV API?


回答1:


Update

I am not sure whether it's a new addition to OpenCV or I've just missed it, but the findHomography() function actually can give you the inliers (OpenCV 2.4.2). The last parameter, mask, which is empty by default, will be filled with ones (or 255) at the indexes of the inliers foound by RANSAC.

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

Old answer

The points used by RANSAC to estimate the homography (called inliers in technical docs) cannot be extracted directly. They are computed internally, but then the list is deleted.

A way to extract them is to modify the findHomography function (and the corresponding RANSAC functions). But this is ugly.

Another, cleaner way is to test what point pairs in the input match th homography:

use the projectPoints(points1, homography, points1_dest) (i hope this is the function name) to apply homography to points1.

The correct function name and input arguments order is: void perspectiveTransform(InputArray src, OutputArray dst, InputArray m), in this case cv::perspectiveTransform(points1, points1_dest, homography) OpenCV Perspective Transform

use cv::distance(points1_dest, points2)

The correct function name and input arguments order is: double norm(InputArray src1, int normType=NORM_L2, InputArray mask=noArray())

possible implementation:

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

Distance between two points can be also calculated using Pythagorean theorem

to see which of them are close enough to their pair in points2. The distance should be smaller or equal to min_distance^2. In your case, 0.5*0.5 = 0.25.



来源:https://stackoverflow.com/questions/10059162/getting-the-5-points-used-by-ransac-in-findhomography-opencv-for-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!