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
how did you install opencv ? some package managers (debian) do not give you the nonfree parts.
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.
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