OpenCV 2.4 (c++版)でSURFを使おうとするとコンパイルが通りません。
こんな感じのコード
#include <iostream>
#include <string>
#include <cv.h>
#include <highgui.h>
using namespace std;
using namespace cv;
int main( int argc, char* argv[] ){
if( argc < 1 ) return 1;
Mat colorImage = imread( argv[1], 1);
if( colorImage.empty() ) return -1;
Mat grayImage;
cvtColor( colorImage, grayImage, CV_BGR2GRAY );
SURF calc_surf = SURF(500,4,2,true);
vector<keypoint> kp_vec;
vector<float> desc_vec;
calc_surf( grayImage, Mat(), kp_vec, desc_vec);
cout << "Image keypoints " << kp_vec.size() << endl;
return 0;
}
これでコンパイルすると、
~/Development/cpp-study# g++ study.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`
study.cpp: In function ‘int main(int, char**)’:
study.cpp:19: error: ‘SURF’ was not declared in this scope
study.cpp:19: error: expected `;' before ‘calc_surf’
study.cpp:23: error: ‘calc_surf’ was not declared in this scope
な感じで怒られます。
どうやら、ヘッダファイルにSURFがインクルードされていないみたいです。
SURFが定義されているのが、nonfree/nonfree.hpp なのですが、インクルードしたcv.h
を見てみると、nonfree.hppがインクルードされていません
なのでcv.hを以下のように変更します
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
~~~中略~~~~
#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/flann/flann.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/legacy/compat.hpp"
#include "opencv2/nonfree/nonfree.hpp" // <-- ここを追加
~~~以下略~~~
多分これでうまく行くと思います。
nonfreeっていう名前から、ただでは使えないみたいですね。