2017-11-16 1 views
0

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 ..

Antwort

1

Aus der docs: "FlannBasedMatcher unterstützt keine Maskierung zulässigen Übereinstimmungen von Deskriptor-Sets, weil Flann :: Index dies nicht unterstützt." In der Methode DescriptorMatcher::isMaskSupported können Sie testen, ob der Matcher die Maskierung unterstützt.

+0

Ich beachte die v3.3.1 haben keine solche Anweisung in ihrer Dokumentation .. – yode

+0

'matcher.isMaskSupported()' Return 'false 'in der Tat. Aber ich hoffe, 'maske' zu ​​benutzen, gibt es irgendeine Workaround? – Make

Verwandte Themen