Es wurde versucht, zwei Bilder mit Sift in OpenCv abzugleichen, aber es wurden zu viele Übereinstimmungen gefunden

Ich versuche, ein Programm zu implementieren, das zwei Bilder eingibt. Eines ist ein Bild einer Box und eines, das die Box in die Szene einschließt. Grundsätzlich soll das Programm Schlüsselpunkte in diesen beiden Bildern finden und die Bilder mit übereinstimmenden Schlüsselpunkten anzeigen. Das heißt, ich erwarte am Ende ein angefügtes Bild von zwei Eingabebildern zusammen mit ihren übereinstimmenden verbundenen Schlüsselpunkten. Mein Code lautet wie folgt:

<code>#include <opencv2\opencv.hpp>
#include <iostream>

int main(int argc, const char* argv[]) {
   cv::Mat input1 = cv::imread("input.jpg", 1); //Load as grayscale
   //cv::cvtColor(input1,input1,CV_BGR2GRAY);
   //second input load as grayscale
   cv::Mat input2 = cv::imread("input2.jpg",1);
   cv::SiftFeatureDetector detector;
   //cv::SiftFeatureDetector
   detector(
      1, 1,
      cv::SIFT::CommonParams::DEFAULT_NOCTAVES,
      cv::SIFT::CommonParams::DEFAULT_NOCTAVE_LAYERS,
      cv::SIFT::CommonParams::DEFAULT_FIRST_OCTAVE,
      cv::SIFT::CommonParams::FIRST_ANGLE );
   std::vector<cv::KeyPoint> keypoints1;
   detector.detect(input1, keypoints1);
   // Add results to image and save.
   cv::Mat output1;
   cv::drawKeypoints(input1, keypoints1, output1);
   cv::imshow("Sift_result1.jpg", output1);
   cv::imwrite("Sift_result1.jpg",output1);
   //keypoints array for input 2
   std::vector<cv::KeyPoint> keypoints2;
   //output array for ouput 2
   cv::Mat output2;
   //Sift extractor of opencv
   cv::SiftDescriptorExtractor extractor;
   cv::Mat descriptors1,descriptors2;
   cv::BruteForceMatcher<cv::L2<float>> matcher;
   cv::vector<cv::DMatch> matches;
   cv::Mat img_matches;
   detector.detect(input2,keypoints2);
   cv::drawKeypoints(input2,keypoints2,output2);
   cv::imshow("Sift_result2.jpg",output2);
   cv::imwrite("Sift_result2.jpg",output2);
   extractor.compute(input1,keypoints1,descriptors1);
   extractor.compute(input2,keypoints2,descriptors2);
   matcher.match(descriptors1,descriptors2,matches);
   //show result
   cv::drawMatches(input1,keypoints1,input2,keypoints2,matches,img_matches);
   cv::imshow("matches",img_matches);
   cv::imwrite("matches.jpg",img_matches);
   cv::waitKey();
   return 0;
}
</code>

Das Problem ist, dass es zwei viele viele Übereinstimmungen als erwartet gibt. Ich habe versucht, das Programm zu debuggen und habe mir angesehen, was sich in den Keypoints-Vektoren befindet usw. Alles scheint in Ordnung zu sein.

Ich verwende OpenCV v2.3 und überprüfe die Dokumentation auf die Klassen, die ich verwende. Ich habe versucht, das Problem zu lösen, aber das hat nicht funktioniert. Ich arbeite seit 3 ​​Tagen daran, habe nicht viel verbessert.

Hier ist eine Ausgabe, die ich von meinem Programm bekomme.

Ich hätte das Bild entfernen sollen.

Ich weiß, das sollte mir nicht zu viele Übereinstimmungen bringen, weil ich genau dieselben Bilder mit einer anderen Implementierung in matlab getestet habe, die ziemlich gut war.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage