C++, OpenCV la détection de fonctionnalité avec l'ORBE
Je suis en train d'extraire et de correspondre à des caractéristiques avec OpenCV à l'aide de l'ORBE, de détection et de FLANN pour la correspondance, et j'ai vraiment une drôle de résultat. Après le chargement de mes 2 images et de les convertir en niveaux de gris, voici mon code:
//Initiate ORB detector
Ptr<FeatureDetector> detector = ORB::create();
//find the keypoints and descriptors with ORB
detector->detect(gray_image1, keypoints_object);
detector->detect(gray_image2, keypoints_scene);
Ptr<DescriptorExtractor> extractor = ORB::create();
extractor->compute(gray_image1, keypoints_object, descriptors_object );
extractor->compute(gray_image2, keypoints_scene, descriptors_scene );
//Flann needs the descriptors to be of type CV_32F
descriptors_scene.convertTo(descriptors_scene, CV_32F);
descriptors_object.convertTo(descriptors_object, CV_32F);
FlannBasedMatcher matcher;
vector<DMatch> matches;
matcher.match( descriptors_object, descriptors_scene, matches );
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for( int i = 0; i < descriptors_object.rows; i++ )
{
double dist = matches[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
//-- Use only "good" matches (i.e. whose distance is less than 3*min_dist )
vector< DMatch > good_matches;
for( int i = 0; i < descriptors_object.rows; i++ )
{
if( matches[i].distance < 3*min_dist )
{
good_matches.push_back( matches[i]);
}
}
vector< Point2f > obj;
vector< Point2f > scene;
for( int i = 0; i < good_matches.size(); i++ )
{
//-- Get the keypoints from the good matches
obj.push_back( keypoints_object[ good_matches[i].queryIdx ].pt );
scene.push_back( keypoints_scene[ good_matches[i].trainIdx ].pt );
}
//Find the Homography Matrix
Mat H = findHomography( obj, scene, CV_RANSAC );
//Use the Homography Matrix to warp the images
cv::Mat result;
warpPerspective(image1,result,H,Size(image1.cols+image2.cols,image1.rows));
cv::Mat half(result,cv::Rect(0,0,image2.cols,image2.rows));
image2.copyTo(half);
imshow( "Result", result );
Et c'est une capture d'écran de l'étrange résultat que j'obtiens:
capture d'écran
Quel pourrait être le problème?
Merci!
Semble être le résultat d'une mauvaise correspondance - le calcul de la transformation conduit à "réaliste" des résultats. Regardez les matchs comme cela est fait dans le exemple
Je suis en train de faire exactement la même chose, non? La seule différence est que leur exemple utilise SurfDescriptorExtractor ce qui n'est pas libre de les utiliser donc je ne peux pas l'utiliser.
Mais vous utilisez des images différentes - peut-être que vos images ne correspondent pas bon. Regardez vos matchs via
oui, vous aviez raison, j'ai essayé avec un autre ensemble d'images et cela a fonctionné! Je juste ne le savais pas bizarre ce résultat serait dû à la mauvaise fonction de mise en correspondance. Merci!
Bon, j'ai compilé une réponse de mes commentaires
Je suis en train de faire exactement la même chose, non? La seule différence est que leur exemple utilise SurfDescriptorExtractor ce qui n'est pas libre de les utiliser donc je ne peux pas l'utiliser.
Mais vous utilisez des images différentes - peut-être que vos images ne correspondent pas bon. Regardez vos matchs via
imshow( "Good Matches", img_matches );
(voir l'exemple)oui, vous aviez raison, j'ai essayé avec un autre ensemble d'images et cela a fonctionné! Je juste ne le savais pas bizarre ce résultat serait dû à la mauvaise fonction de mise en correspondance. Merci!
Bon, j'ai compilé une réponse de mes commentaires
OriginalL'auteur YaronGh | 2016-07-11
Vous devez vous connecter pour publier un commentaire.
Vous rencontrez les résultats d'une mauvaise correspondance: homographie, qui correspond à la donnée n'est pas "réaliste" et donc déforme l'image.
Vous pouvez déboguer votre correspondance avec
imshow( "Good Matches", img_matches );
comme le fait dans le exemple.Il existe plusieurs approches pour améliorer vos matchs:
mask
dans cv::findHompgraphy pour identifier totalement faux homographie calculsOriginalL'auteur PhilLab
ORB sont binaires disposent de vecteurs qui ne fonctionnent pas avec Flann. L'utilisation de la Force Brute (BFMatcher) à la place.
OriginalL'auteur abggcv