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 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