What do the values of the mask parameter returned by findHomography represent?
Solution 1
The mask returned by findHomography
is an 8-bit, single-channel cv::Mat
(or std::vector<uchar>
, if you prefer) containing either 0
or 1
indicating the outlier status.
EDIT: You access each element of the mask by calling .at<double>
, which is leading to the confusing output. You should be using .at<uchar>
, which will interpret the matrix value correctly.
Solution 2
I used the findHomography method after applying keypoint matching.
- Inliers are matched keypoints that are calculated to be true positives (correct matches);
- Outliers are matched keypoints that are calculated to be false positives (false matches).
Then you can use the mask output to extract the subset of correct matches from all matches.
There is an example in Python 3.6 & OpenCV 3.4.1:
good_kp = [gray_kp[m.queryIdx].pt for m in good_matches] correct_matched_kp = [good_kp[i] for i in range(len(good_kp)) if mask[i]]
jsalvador
Updated on June 05, 2022Comments
-
jsalvador almost 2 years
I am using the function
findHomography
of OpenCV with the RANSAC method in order to find the homography that relates two images linked with a set of keypoints.The main issue is that I haven't been able to find anywhere yet what are the values of the mask matrix that the function outputs.
The only information that I know is that 0 values are outliers, and non zero values are inliers. But what does it mean the inliers value? Does anyone know?
Piece of code where I call
findHomography
:cv::Mat H12; cv::Mat mask; H12 = cv::findHomography(FvPointsIm1, FvPointsIm2, mask, CV_RANSAC, 5); ui->Debug_Label->setText(Mat2QString(mask));
-
jsalvador about 11 yearsTo convert the values of the mask to QString I use the following for each matrix field: ` QString::number(mask.at<double>(i,j)) `
-
jsalvador about 11 yearsNice, that was the mistake. Thank you very much!
-
JonasVautherin about 11 yearsI cannot print the value correctly by using:
mask.at<uchar>(0, 0)
. It prints a small matrix icon with values "0 0, 0 1"... Do you know why? -
JonasVautherin about 11 yearsOkay... It is just that I call findHomography() exactly as he does, and when I print
cout << mask.at<uchar>(0, 0) << endl;
as you proposed, I don't get a 0 or a 1. I will see to ask another question if you think it is different as here. -
Aurelius about 11 years@user1368342 I've reproduced your problem. Cast the result to an
int
to see the numerical value, like so:cout << (int)mask.at<uchar>(0,0) << endl;
-
JonasVautherin about 11 yearsExactly what I needed! Thanks a lot!
-
rbaleksandar almost 10 years@Aurelius, you are right: stackoverflow.com/questions/24456788/… Here is the question and also the answer. It was quite trivial after all. :P