J’essaie d’implémenter un programme qui entrera deux images, l’une est l’image d’une boîte seule et l’autre qui inclut la boîte dans la scène. Fondamentalement, le programme est censé trouver des points-clés dans ces deux images et affichera les images avec des points-clés correspondants. C’est à la fin que j’attends de voir une image ajoutée de deux images d’entrée avec leurs points clés correspondants connectés. Mon code est le suivant:
#include #include int main(int argc, const char* argv[]) { cv::Mat input1 = cv::imread("input.jpg", 1); //Load as grayscale //cv::cvtColor(input1,input1,CV_BGR2GRAY); //second input load as grayscale cv::Mat input2 = cv::imread("input2.jpg",1); cv::SiftFeatureDetector detector; //cv::SiftFeatureDetector detector( 1, 1, cv::SIFT::CommonParams::DEFAULT_NOCTAVES, cv::SIFT::CommonParams::DEFAULT_NOCTAVE_LAYERS, cv::SIFT::CommonParams::DEFAULT_FIRST_OCTAVE, cv::SIFT::CommonParams::FIRST_ANGLE ); std::vector keypoints1; detector.detect(input1, keypoints1); // Add results to image and save. cv::Mat output1; cv::drawKeypoints(input1, keypoints1, output1); cv::imshow("Sift_result1.jpg", output1); cv::imwrite("Sift_result1.jpg",output1); //keypoints array for input 2 std::vector keypoints2; //output array for ouput 2 cv::Mat output2; //Sift extractor of opencv cv::SiftDescriptorExtractor extractor; cv::Mat descriptors1,descriptors2; cv::BruteForceMatcher<cv::L2> matcher; cv::vector matches; cv::Mat img_matches; detector.detect(input2,keypoints2); cv::drawKeypoints(input2,keypoints2,output2); cv::imshow("Sift_result2.jpg",output2); cv::imwrite("Sift_result2.jpg",output2); extractor.compute(input1,keypoints1,descriptors1); extractor.compute(input2,keypoints2,descriptors2); matcher.match(descriptors1,descriptors2,matches); //show result cv::drawMatches(input1,keypoints1,input2,keypoints2,matches,img_matches); cv::imshow("matches",img_matches); cv::imwrite("matches.jpg",img_matches); cv::waitKey(); return 0; }
Le problème est qu’il y a deux beaucoup plus de matchs que prévu. J’ai essayé de déboguer le programme et de regarder ce qu’il y a dans les vecteurs de points-clés, etc., tout semble aller pour le mieux, au moins, je pense qu’ils le sont, les points-clés sont détectés avec une orientation, etc.
J’utilise OpenCV v2.3 et j’ai vérifié dans sa documentation les types de classes que j’utilise et j’ai essayé de résoudre le problème, mais cela n’a pas fonctionné. Je travaille dessus depuis 3 jours n’a pas fait grand-chose.
Voici un résultat de mon programme.
J’aurais dû enlever l’image.
Je sais que cela ne devrait pas me donner trop de correspondances, car j’ai testé exactement les mêmes images avec une autre implémentation dans matlab qui était assez bonne.
Plutôt que d’utiliser BruteForceMatcher, essayez d’utiliser FlannBasedMatcher et calculez également les distances maximales et minimales entre les points clés pour ne conserver que les bonnes correspondances. Voir ” Correspondance des fonctionnalités avec FLANN ” pour un exemple.
J’ai rencontré le même problème pour SIFT. J’ai utilisé knn matcher (K = 3). et a suivi la procédure suivante de manière itérative
{ Calculated best affine transform with least square method. Found out the transform for all keypoints in source image. Checked out MaxError and MinError. Points with Error near MaxError are removed from the matching list }