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:

OpenCV - Objektabgleich mit SURF-Deskriptoren und BruteForceMatcher

False matching!! :

OpenCV - Objektabgleich mit SURF-Deskriptoren und BruteForceMatcher

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

Schreibe einen Kommentar