Kreuzes hereMaske in FlannBasedMatcher :: Spiel funktioniert nicht normal
Ich stelle fest, die Funktion FlannBasedMatcher::match
haben einen Parameter mask
, so dass ich einen Versuch geben mit folgenden Code:
#include<opencv.hpp>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
using namespace cv;
using namespace std;
int main() {
Mat rightImg = imread("right.jpg", 0);
Mat leanImg = imread("lean.jpg", 0);
if (!rightImg.data || !leanImg.data) {
cout << "Fail to read your image. Please check your path.\n";
return -1;
}
resize(leanImg, leanImg, rightImg.size());
int minHessian = 400;
SurfFeatureDetector detector(minHessian);
vector<KeyPoint> keypoints_right, keypoints_lean;
detector.detect(rightImg, keypoints_right);
detector.detect(leanImg, keypoints_lean);
Mat med_right, med_lean;
drawKeypoints(rightImg, keypoints_right, med_right);
drawKeypoints(leanImg, keypoints_lean, med_lean);
SurfDescriptorExtractor extractor;
Mat descriptors_right, descriptors_lean;
extractor.compute(rightImg, keypoints_right, descriptors_right);
extractor.compute(leanImg, keypoints_lean, descriptors_lean);
FlannBasedMatcher matcher;
vector<DMatch> matches;
Mat mask(descriptors_right.rows, descriptors_lean.rows, CV_8UC1, Scalar(0));
Mat target(rightImg.size(), CV_8UC1, Scalar(255));
ellipse(target, Point(rightImg.cols/2, rightImg.rows/2), Size(rightImg.cols/2, rightImg.rows/2), 0, 0, 360, Scalar(0), CV_FILLED);
for (int i = 0; i < mask.rows; i++) {
uchar* pixrow = mask.ptr<uchar>(i);
for (int j = 0; j < mask.cols; j++) {
if (target.at<uchar>(keypoints_right[i].pt) == 255)
pixrow[j] = 255;
}
}
matcher.match(descriptors_right, descriptors_lean, matches/*, mask*/);//use it or not to test
Mat img_matches;
drawMatches(rightImg, keypoints_right, leanImg, keypoints_lean,
matches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
return 0;
}
Und das ist meine right.jpg und lean.jpg. Ich interessiere mich nicht für diese Punkte in der Mitte right.jpg
. Also mache ich eine Maske dafür. Aber ich bemerke, dass ich das gleiche Ergebnis vollständig erhalten werde, ob ich das mask
in der Funktion FlannBasedMatcher::match
verwende. Sie können die Maske verwenden oder nicht, um sie zu reproduzieren. Habe ich etwas verpasst oder der OpenCV hat einen Bug in meinem 2.4.13
? Kann mir jemand sagen, wie man die mask
in der FlannBasedMatcher::match
verwendet? Ich denke, es ist ein nützlicher Parameter ..
Ich beachte die v3.3.1 haben keine solche Anweisung in ihrer Dokumentation .. – yode
'matcher.isMaskSupported()' Return 'false 'in der Tat. Aber ich hoffe, 'maske' zu benutzen, gibt es irgendeine Workaround? – Make