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.