Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Unsupported format or combination of formats in buildIndex using FLANN algorithm

I'm acquiring some images from a video stream (of a simulated camera) : my goal is to find matching points in order to compute the Affine Transformation Matrix between two frames afterwards. 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)

But if I try the same code loading 2 JPG images it works!! what's wrong?