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 ( with 2 Mat type images acquired through the cv_bridge ( 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 ); }

    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