Ask Your Question

sumitsk's profile - activity

2016-09-16 06:45:42 -0600 received badge  Necromancer (source)
2015-06-02 11:10:18 -0600 answered a question throwing exception in matching function

I got stuck with this too and it took me almost 3-4 hours to figure this out. When you apply knn match , make sure that number of features in both test and query image is greater than or equal tonumber of nearest neighbours in knn match.
say for example, we have this code:

Mat img1,img2,desc1,desc2;
vector<KeyPoint> kpt1,kpt2;

FAST(img1,kpt1,30,true) ;
FAST(img2,kpt1,30,true) ;

SurfDescriptorExtractor sfdesc1,sfdesc2;
sfdesc1.compute(img1,kpt1,desc1);
sfdesc2.compute(img2,kpt2,desc2);

FlannBasedMatcher matcher;
vector< vector<DMatch> > matches1,matches2;
matcher.knnMatch(desc1,desc2,matches1,2);

this code will return exception as in the post, just modify the code as show below:

if(kpt1.size()>=2 && kpt2.size()>=2) 
matcher.knnMatch(desc1,desc2,matches1,2);

this method worked for me ..!!

2015-05-31 12:35:29 -0600 commented answer Feature points stereo matching?

@Dawei Jiang !! have you found any solution to your question? i ran into the same problem today

2015-05-31 00:18:55 -0600 received badge  Enthusiast
2015-05-22 04:39:24 -0600 commented question error including surfFeatureDetector class

ya!!! i installed through debian and so i m missing nonfree package , now what should i do .?? do i need to install opencv again !!!! thanxxx @berak for ur reply.

2015-05-22 02:11:49 -0600 asked a question error including surfFeatureDetector class

i am directly running the code given on opencv documentation. my version of opencv is opencv 2.4.9

    #include <stdio.h>
    #include <iostream>
    #include "opencv2/core/core.hpp"
    #include "opencv2/features2d/features2d.hpp"
    #include "opencv2/highgui/highgui.hpp"
    //#include "opencv2/nonfree/features2d.hpp"
    #include "opencv2/legacy/legacy.hpp"

using namespace cv;

int main( int argc, char** argv )
{
  Mat img_1 = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
  Mat img_2 = imread( argv[2], CV_LOAD_IMAGE_GRAYSCALE );

  if( !img_1.data || !img_2.data )
  { std::cout<< " --(!) Error reading images " << std::endl; return -1; }

  //-- Step 1: Detect the keypoints using SURF Detector
  int minHessian = 400;

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

  double max_dist = 0; double min_dist = 100;

  //-- Quick calculation of max and min distances between keypoints
  for( int 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,
  //-- or a small arbitary value ( 0.02 ) in the event that min_dist is very
  //-- small)
  //-- PS.- radiusMatch can also be used here.
  std::vector< DMatch > good_matches;

  for( int i = 0; i < descriptors_1.rows; i++ )
  { if( matches[i].distance <= max(2*min_dist, 0.02) )
    { 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 );

  for( int i = 0; i < (int)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(0);

  return 0;
}

i am getting this error message


/home/sumit/feature_detection/flann/flann.cpp: In function ‘int main(int, char**)’:
/home/sumit/feature_detection/flann/flann.cpp:33:3: error: ‘SurfFeatureDetector’ was not declared in this scope
   SurfFeatureDetector detector( minHessian );
   ^
/home/sumit/feature_detection/flann/flann.cpp:33:23: error: expected ‘;’ before ‘detector’
   SurfFeatureDetector detector( minHessian );
                       ^
/home/sumit/feature_detection/flann/flann.cpp:37:3: error: ‘detector’ was not declared in this scope
   detector.detect( img_1, keypoints_1 );
   ^
/home/sumit/feature_detection/flann/flann.cpp:41:3: error: ‘SurfDescriptorExtractor’ was not declared in this scope
   SurfDescriptorExtractor extractor;
   ^
/home/sumit/feature_detection/flann/flann.cpp:41:27: error: expected ‘;’ before ‘extractor’
   SurfDescriptorExtractor extractor;
                           ^
/home/sumit/feature_detection/flann/flann.cpp:45:3: error: ‘extractor’ was not declared in this scope
   extractor.compute( img_1, keypoints_1, descriptors_1 );
   ^
make[2]: *** [CMakeFiles/a.dir/flann.cpp.o] Error 1
make[1]: *** [CMakeFiles/a.dir/all] Error 2
make: *** [all] Error 2

also in my "/usr/include/opencv2" directory there isn't any "nonfree" directory!!

please help me out