error including surfFeatureDetector class

asked 2015-05-22 01:59:15 -0500

sumitsk gravatar image

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

edit retag flag offensive close merge delete

Comments

how did you install opencv ? some package managers (debian) do not give you the nonfree parts.

berak gravatar imageberak ( 2015-05-22 02:13:07 -0500 )edit

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.

sumitsk gravatar imagesumitsk ( 2015-05-22 04:39:24 -0500 )edit

maybe there is a way to additionally install the nonfree parts, but idk. about debian, or ppms in general.

for sure it will work, if you build opencv from src using cmake, see here for details

berak gravatar imageberak ( 2015-05-22 04:45:53 -0500 )edit