Próbuję dopasować dwa obrazy używając sift w OpenCv, ale zbyt wiele dopasowań

Próbuję zaimplementować program, który wprowadzi dwa obrazy, jeden jest obrazem samego pudełka, a drugi zawiera pole w scenie. Zasadniczo program powinien znajdować punkty kluczowe w tych dwóch obrazach i wyświetlać obrazy z dopasowanymi punktami kluczowymi. W końcu spodziewam się zobaczyć dołączony obraz dwóch obrazów wejściowych wraz z ich dopasowanymi punktami kluczowymi. Mój kod jest następujący:

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

Problem polega na tym, że są dwa wiele meczów niż oczekiwano. Próbowałem debugować program i sprawdzać, co znajduje się w wektorach punktów kluczowych i tak dalej, wszystko wygląda dobrze, przynajmniej tak mi się wydaje, punkty kluczowe są wykrywane z orientacją itp.

Używam OpenCV v2.3 i sprawdziłem jego dokumentację dla typów klas, których używam i próbowałem rozwiązać problem, ale to nie zadziałało. Pracuję nad tym przez 3 dni, które nie przyniosły poprawy.

Oto wyjście z mojego programu.

Powinienem usunąć obraz.

Wiem, że nie powinno mi to dać zbyt wiele meczów, ponieważ dokładnie przetestowałem te same zdjęcia z innym wdrożeniem w matlab, które było całkiem dobre.

questionAnswers(2)

yourAnswerToTheQuestion