web-dev-qa-db-fra.com

OpenCV - correspondance d'objet à l'aide des descripteurs de surf et bruteforCatureter

J'ai une question sur les objets correspondant à OpenCV. J'utilise un algorithme de surf implémenté dans OpenCV 2.3 aux premières caractéristiques de détection de chaque image, puis extrayant les descripteurs de ces fonctionnalités. Le problème dans la correspondance à l'aide de la correspondance de la force brute, je ne sais pas comment je juge que les deux images sont assorties ou non comme lorsque j'utilise deux images différentes, il existe des lignes entre des descripteurs dans les deux images!

Ces sorties de mon code, soit les deux images -IA comparer avec eux - sont similaires ou différentes, l'image de résultat indique que les deux images sont assorties.

La question est la suivante: comment puis-je distinguer entre les deux images?

Véritable correspondance:

http://store1.up-00.com/Jun11/hxM00286.jpg

Fausse correspondance !! :

http://store1.up-00.com/Jun11/D5H00286.jpg

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;
19
khateeb

Le problème consistait à utiliser uniquement la correspondance de la force brute, j'ai trouvé des méthodes pour obtenir un ensemble de bonnes correspondances entre deux vues à "Cookbook de programmation d'application OpenCV 2 Computer Vision Company"

CH9: Affichage des images à l'aide d'un échantillon aléatoire Consensus

Ils utilisent le voisin de K et Ransac le plus proche

Et merci

19
khateeb

Pour éliminer les valeurs aberrantes Ransac + homographie est une bonne méthode lors de la comparaison de deux images planes.

L'homographie est le modèle que Ransac tentera d'utiliser pour comparer des points des deux images et trouvera le meilleur ensemble de points qui correspondent mieux au modèle de projection de l'homographie (la transformation d'un avion à un autre).

cv::findHomography(srcPoints,dstPoints, RANSAC, status);

La fonction ci-dessus renvoie un statut de tableau 1 pour les indices considérés comme des inlicateurs et 0 pour les indices considérés comme des valeurs aberrantes. Vous pouvez ainsi supprimer des valeurs aberrantes en cochant ce tableau d'état.

9
Jav_Rock

Vous devez modifier votre Hesse, 2500 est trop. Essayez 50. Lorsque vous utilisez un Big Hesse, le résultat est beaucoup de clavier, entraînant des inutiles. Une autre information sur le surf est que votre marqueur doit être plus riche, avec plus de détails.

4
Ricardo Ribani