Попытка сопоставить два изображения с помощью просеивания в OpenCv, но совпадений слишком много

Я пытаюсь реализовать программу, которая будет вводить два изображения, одно из которых представляет собой изображение одного ящика, а другое включает ящик в сцену. По сути, программа должна найти ключевые точки на этих двух изображениях и покажет изображения с совпадающими ключевыми точками. То есть, в конце концов, я ожидаю увидеть добавленное изображение двух входных изображений вместе с их совпадающими ключевыми точками. Мой код выглядит следующим образом:

#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;
}

Проблема в том, что совпадений на два больше, чем ожидалось.Я попытался отладить программу и посмотрел, что находится внутри векторов ключевых точек и т. д., все выглядит нормально, по крайней мере, я так думаю, ключевые точки обнаруживаются с ориентацией и т. д.

Я использую OpenCV v2.3 и проверил его документацию на типы классов, которые я использую, и попытался решить проблему, но это не сработало. Я работаю над этим в течение 3 дней, не сделал большого улучшения.

Вот результат, который я получаю от своей программы.

Я должен был удалить изображение.

Я знаю, что это не должно дать мне слишком много совпадений, потому что я тестировал точно такие же изображения с другой реализацией в Matlab, которая была довольно хорошей.

8
задан Aubin 1 December 2014 в 23:25
поделиться