Ask Your Question
0

FLANN algorithm cannot find any descriptor

asked 2013-04-12 04:36:05 -0600

matteo gravatar image

I'm acquiring some images from a video stream (of a simulated camera in a simulated environment (V-rep) ) : my goal is to find matching points in order to compute the Affine Transformation Matrix between two frames. I'm trying to use the Feature Matching with FLANN algorithm proposed by OpenCV (http://docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html#feature-matching-with-flann) with 2 Mat type images acquired through the cv_bridge (http://www.ros.org/wiki/cv_bridge/Tutorials/UsingCvBridgeToConvertBetweenROSImagesAndOpenCVImages) since i read them from a ROS topic. this is my code:

 vector< DMatch > MatchFinder(Mat img_1, Mat img_2)  { 
  int minHessian = 400; 
   unsigned int i;
 SurfFeatureDetector detector( minHessian );
 std::vector<KeyPoint> keypoints_1, keypoints_2;
 detector.detect( img_1, keypoints_1 ); 
  detector.detect( img_2, keypoints_2 );

 //-- Step 2: Calculate descriptors (feature vectors)
 SurfDescriptorExtractor extractor;
 Mat descriptors_1, descriptors_2;

extractor.compute( img_1, keypoints_1, descriptors_1 ); 
 extractor.compute( img_2, keypoints_2, descriptors_2 );

  //-- Step 3: Matching descriptor vectors using FLANN matcher

  FlannBasedMatcher matcher;

std::vector< DMatch > matches; matcher.match( descriptors_1, descriptors_2, matches);  // ERROR

 double max_dist = 0; double min_dist = 100;

//-- Quick calculation of max and min distances between keypoints 
for( i = 0; i <     descriptors_1.rows; i++ ) { 
double dist = matches[i].distance; 
if( dist <  min_dist ) min_dist = dist; if( dist > max_dist ) max_dist = dist;
 }

printf("-- Max dist : %f \n", max_dist );
printf("-- Min dist : %f \n", min_dist );

//-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist ) 
//-- PS.- radiusMatch can also be used here. 
 std::vector< DMatch > good_matches;

 for(  i = 0; i < descriptors_1.rows; i++ ) {  
    if( matches[i].distance < 2*min_dist ) {
  good_matches.push_back( matches[i]);  }  }

  //-- Draw only "good" matches Mat img_matches; 
  drawMatches( img_1, keypoints_1, img_2, keypoints_2,
       good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
       vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

   //-- Show detected matches

  imshow( "Good Matches", img_matches );
  ROS_INFO("size matchings: %u", good_matches.size()); 
   for(  i = 0; i < good_matches.size(); i++ ) { 
         printf( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i, ...    
   good_matches[i].queryIdx, good_matches[i].trainIdx ); }

   waitKey(1); 
    return good_matches;  }

at the point where ERROR is written i receive this error: OpenCV Error: Unsupported format or combination of formats (type=0 ) in buildIndex_, file /tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/flann/src/miniflann.cpp, line 299 terminate called after throwing an instance of 'cv::Exception' what(): /tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/flann/src/miniflann.cpp:299: error: (-210) type=0 in function buildIndex_

Aborted (core dumped) This happens because in the second frame the algorithm doesn't manage to find any descriptor! I'm wandering: why?...I'm running my code with the camera that stays still and, so, the images are exactly the same

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
1

answered 2013-04-12 07:38:28 -0600

If you use the same image, the min distance is 0, therefore, no point is drawn. If you use 2 different images, it draws points...

edit flag offensive delete link more

Comments

I'm talking about DESCRIPTORS, that depend on the features of each image and not on the matching points and their distances

matteo gravatar imagematteo ( 2013-04-12 07:57:49 -0600 )edit

Furthermore, if you had red my code, you'd have noticed that distance=0 is accepted...without having errors

matteo gravatar imagematteo ( 2013-04-12 08:10:27 -0600 )edit
1

When I compile your code on my PC, everything is working, except if I used the same image twice. But, what I'm saying is this part of the code is storing nothing in good_matches if the min distance is 0.

for( i = 0; i < descriptors_1.rows; i++ ) {
if( matches[i].distance < 2*min_dist ) { good_matches.push_back( matches[i]); } }

Maybe your problem is before calling this function. Could you provide some code to test (I only read two image from file to test).

Mathieu Barnachon gravatar imageMathieu Barnachon ( 2013-04-12 08:24:24 -0600 )edit

you are right!

matteo gravatar imagematteo ( 2013-04-12 08:41:41 -0600 )edit

excuse me, but...i inserted that lines in my code

std::vector< DMatch > matches; if ( descriptors_1.empty() ) cvError(0,"MatchFinder","1st descriptor empty",__FILE__,__LINE__); if ( descriptors_2.empty() ) cvError(0,"MatchFinder","2nd descriptor empty",__FILE__,__LINE__); matcher.match( descriptors_1, descriptors_2, matches )

and, running, i receive: OpenCV Error: No Error (2nd descriptor empty) in MatchFinder, file /home/mgagliardi/workspace/rd_ctrl/communications.cpp, line 84 terminate called after throwing an instance of 'cv::Exception' what(): /home/mgagliardi/workspace/rd_ctrl/communications.cpp:84: error: (0) 2nd descriptor empty in function MatchFinder Aborted (core dumped)

it means that it can't find any descriptor in the second image...that is exactly like the first one!

matteo gravatar imagematteo ( 2013-04-12 09:34:39 -0600 )edit

my fault....thanks again

matteo gravatar imagematteo ( 2013-04-12 10:19:47 -0600 )edit

Question Tools

Stats

Asked: 2013-04-12 04:36:05 -0600

Seen: 901 times

Last updated: Apr 12 '13