Ich habe ein Bild von einigen Tassen OpenCV - Zwei völlig unterschiedliche Bilder werden weitere Spiele mit BFMatcher mit
ich diese beiden Bilder in OpenCV mit Surf vergleichen wollen und passen Sie sie unter Verwendung BFMatcher an. Hier
ist der Code:
//read the image
cv::Mat image1= cv::imread("C:\\Users\\The\\Desktop\\cub.jpg");
cv::Mat image2= cv::imread("C:\\Users\\The\\Desktop\\cat.jpg");
//detect the key points using surf
cv::SurfFeatureDetector surf(300,4,2,true,false);
//image 1 key points
vector<cv::KeyPoint> image1Keypoints;
//detect the key points in image 1 using surf
surf.detect(image1,image1Keypoints);
//draw the keypoints of image1
cv::drawKeypoints(image1,image1Keypoints,image1,
cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);
cv::namedWindow("Original image 1 with keypoints");
cv::imshow("Original image 1 with keypoints",image1);
// image 2 key points
std::vector<cv::KeyPoint> image2keypoints;
//detect the key points in image 1 using surf
surf.detect(image2,image2keypoints);
//draw the key points
cv::drawKeypoints(image2,keypoints1,image2,
cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);
//the extracted image display
cv::namedWindow("image 2 with keypoints");
cv::imshow("image 2 with keypoints",image2);
Aus dem obigen Code dies die Tassen Bild kennzeichnet
cv::SiftDescriptorExtractor sift;
cv::Mat image1Descriptor;
cv::Mat image2Desccriptor;
sift.compute(image1,
image1Keypoints,
image1Descriptor);
sift.compute(image2,
keypoints1,
image2Desccriptor);
cv::BFMatcher matcher(cv::NORM_L2,true);
std::vector<cv::DMatch> matches;
matcher.match(image2Desccriptor,image1Descriptor,matches);
cout<<"match=";
//the number of matched features between the two images
cout<<matches.size()<<endl;
cv::Mat imageMatches;
cv::drawMatches(image2,keypoints1,image1,image1Keypoints,
matches,imageMatches,cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);
cv::namedWindow("matches");
cv::imshow("matches",imageMatches);
cv::waitKey(0);
Was wirklich verwirrt mich ist das übereinstimmende Bild:
Es gibt rund 833 aufeinander abgestimmte Funktionen, aber die Bilder sind völlig unterschiedlich.
Was ist los mit meinem Code & Wie kann ich die Anzahl der Übereinstimmungen verringern. Ich war in der Lage, die Anzahl der Übereinstimmungen zu verringern, indem ich die Surf-Parameter ändere, aber es ist, weil es kleine Anzahl von Merkmalen entdeckt. Zum Beispiel durch den siftFeature Detektor dieser Veränderung:
cv::SurfFeatureDetector surf(1000,4,2,true,false);
konnte ich Streichhölzer = 77 erhalten, aber es ist immer noch eine große Anzahl von Spielen und die Spiele verringert werden, weil ich kleine Anzahl von Merkmalen verglichen wurde immer zu den oben genannten Nummern.
Während ich blättern sehe ich eine Geschichte .... :-D – P0W
Sie vergleichen kleine Bild-Patches (32x32 oder so), d. H. Die Deskriptoren ... Passende Deskriptoren bedeutet nicht, Bilder zu vergleichen. Sie müssen einige andere Schritte nach dem Abgleich durchführen. – Miki
@POW meine Frage ist für zwei verschiedene Bilder, wie es möglich ist, so viel Übereinstimmung zu haben und wie die Anzahl der Übereinstimmungen zu verringern? – Yirga