OpenCV - Objet correspondant à l'aide de descripteurs SURF et BruteForceMatcher
J'ai une question à propos des objets de correspondance avec OpenCV.
Je suis en utilisant les VAGUES de l'algorithme mis en œuvre dans opencv 2.3 d'abord de détecter les caractéristiques de chaque image, et puis l'extraire les descripteurs de ces caractéristiques.
Le problème de l'appariement en utilisant la Force Brute de Traits, je ne sais pas comment je juge que les deux images correspondent ou pas, c'est que lorsque je suis à l'aide de deux images différentes, il y a des lignes entre les descripteurs dans les deux images!
Ces sorties de mon code, soit les deux images-je le compare avec ceux - ci, sont semblables ou différentes, le résultat de l'image indiquent que les deux images sont appariés.
La question est: Comment puis-je distinguer entre les deux images?
Véritable correspondance:
Faux correspondance!! :
Mon 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;
Vous devez vous connecter pour publier un commentaire.
Le problème a été en utilisant la Force Brute Matcher seulement, j'ai trouvé des méthodes pour obtenir un ensemble de bonnes correspondances entre les deux points de vue à "OpenCV 2 Vision par Ordinateur de Programmation d'Application de livre de cuisine"
Ch9: faire correspondre les images à l'aide de random sample consensus
Ils sont en utilisant les K-plus Proche Voisin et RANSAC
Et merci
Pour éliminer les valeurs aberrantes RANSAC + homographie est une bonne méthode pour la comparaison de deux images planes.
Homographie est le modèle que RANSAC essayez de l'utiliser pour comparer les points des deux images et il va trouver le meilleur ensemble de points qui conviennent le mieux le modèle de projection de l'homographie (la transformation d'un plan à l'autre).
La fonction ci-dessus retournera un tableau d'état qui a un 1 pour les indices considérés comme des inliers et 0 pour les indices considérés comme des valeurs aberrantes, de sorte que vous pouvez supprimer les valeurs aberrantes par la vérification de ce tableau de statut.
LMEDS
(Calib3d.LMEDS
sur Android) donne de meilleurs résultats qu'à moi, je ne sais pas pourquoi, dans mon cours de projet, RANSAC dans Matlab a donné de très bons résultats. Mais de toute évidence, la suppression traceurs est un must!Vous avez besoin de modifier votre Hesse, 2500, c'est trop. Essayez de 50. Lorsque vous utilisez un grand Hesse, le résultat est beaucoup de keypoints, résultant dans certains cas inutiles. Une autre information sur le SURF, c'est que votre marqueur besoin d'être plus riche, avec plus de détails.