What do the values of the mask parameter returned by findHomography represent?
Asked Answered
C

2

13

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));
Cyclamen answered 4/4, 2013 at 15:21 Comment(6)
Are you asking about the meaning of the inlier/outlier distinction, or about the numerical values in the mask?United
About the numerical values in the mask.Cyclamen
Do you ever get values other than 0 or 1?United
Outliers are 0. Inliers get values, most of them very small. They order of magnitude is between e^-200 and e^-400.Cyclamen
Could you post the code where you call findHomography and then examine the mask values? It would be nice to know the type of your mask input.United
I've just updated it in the top. Thank for the interest.Cyclamen
U
15

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.

United answered 4/4, 2013 at 16:25 Comment(6)
To convert the values of the mask to QString I use the following for each matrix field: ` QString::number(mask.at<double>(i,j)) `Cyclamen
Nice, that was the mistake. Thank you very much!Cyclamen
I 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?Droplet
Okay... 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.Droplet
@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;United
@Aurelius, you are right: #24457288 Here is the question and also the answer. It was quite trivial after all. :PRural
A
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]]
    
Alonzo answered 26/6, 2018 at 8:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.