Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

FLANN algorithm cannot find any descriptor

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