Я пытаюсь реализовать программу, которая будет вводить два изображения, одно из которых представляет собой изображение одного ящика, а другое включает ящик в сцену. По сути, программа должна найти ключевые точки на этих двух изображениях и покажет изображения с совпадающими ключевыми точками. То есть, в конце концов, я ожидаю увидеть добавленное изображение двух входных изображений вместе с их совпадающими ключевыми точками. Мой код выглядит следующим образом:
#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, которая была довольно хорошей.