OpenCV - Objektabgleich mit SURF-Deskriptoren und BruteForceMatcher
Ich habe eine Frage über die Objekte passend mit OpenCV.
Ich bin useing SURF-Algorithmus implementiert in opencv 2.3 zunächst erkennen, Merkmale, die auf jedes Bild, und dann die Extraktion der Deskriptoren, die von diesen Funktionen.
Das problem in der Anpassung mittels Brute-Force Matcher, ich weiß nicht, wie ich beurteilen, dass die zwei Bilder, die aufeinander abgestimmt sind oder nicht, das ist, wie wenn ich mit zwei verschiedenen Bilder es sind die Linien zwischen den Deskriptoren der beiden Bilder!
Diese Ausgänge meinem code, entweder die beiden Bilder -ich Vergleiche mit Ihnen - ähnlich oder anders, das Ergebnis-Bild bedeuten, dass die beiden Bilder aufeinander abgestimmt sind.
Die Frage ist: Wie kann ich unterscheiden, zwischen den beiden Bildern?
True matching:
False matching!! :
Mein code:
Mat image1, outImg1, image2, outImg2;
//vector of keypoints
vector<KeyPoint> keypoints1, keypoints2;
//Read input images
image1 = imread("C://Google-Logo.jpg",0);
image2 = imread("C://Alex_Eng.jpg",0);
SurfFeatureDetector surf(2500);
surf.detect(image1, keypoints1);
surf.detect(image2, keypoints2);
drawKeypoints(image1, keypoints1, outImg1, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(image2, keypoints2, outImg2, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
namedWindow("SURF detector img1");
imshow("SURF detector img1", outImg1);
namedWindow("SURF detector img2");
imshow("SURF detector img2", outImg2);
SurfDescriptorExtractor surfDesc;
Mat descriptors1, descriptors2;
surfDesc.compute(image1, keypoints1, descriptors1);
surfDesc.compute(image2, keypoints2, descriptors2);
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
matcher.match(descriptors1,descriptors2, matches);
nth_element(matches.begin(), matches.begin()+24, matches.end());
matches.erase(matches.begin()+25, matches.end());
Mat imageMatches;
drawMatches(image1, keypoints1, image2, keypoints2, matches, imageMatches, Scalar(255,255,255));
namedWindow("Matched");
imshow("Matched", imageMatches);
cv::waitKey();
return 0;
InformationsquelleAutor der Frage khateeb | 2011-09-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
War das problem in Brute-Force Matcher nur, ich fand Methoden, die zu erhalten eine Reihe von guten matches, zwischen zwei Ansichten zu "OpenCV 2 Computer Vision Application Programming Cookbook"
Ch9: Passende Bilder mit random sample consensus
Sind Sie mit K-Nearest Neighbor und RANSAC
Und Dank
InformationsquelleAutor der Antwort khateeb
Für das entfernen von Ausreißern RANSAC + homography ist eine gute Methode, wenn man zwei planaren Bilder.
Homography ist das Modell, das RANSAC wird versuchen, sich zu vergleichen, die Punkte aus den beiden Bildern und finden Sie die beste Menge der Punkte, die besser passen die Projektion Modell der homography (die transformation von einer Ebene zur anderen).
Die obige Funktion wird ein array zurückgeben, status 1 bei Indizes als inliers und 0 für Indizes als Ausreißer, so können Sie entfernen von Ausreißern durch die überprüfung dieses status array.
InformationsquelleAutor der Antwort Jav_Rock
Müssen Sie zum ändern der hessischen, 2500 ist zu viel. Versuchen Sie, 50. Wenn Sie eine große hessische, das Ergebnis ist eine Menge von Eckdaten, was einige unnötige. Weitere Informationen über SURF ist, dass Ihre Marke brauchen, um mehr reichen, mit mehr details.
InformationsquelleAutor der Antwort Ricardo Ribani