OpenCV3をSIFT・SURFを使えるようにインストールして使ってみる

OpenCV3-alphaが公開されて, せっかくだしアップデートして使ってみようと思ったらSIFT/SURFなどの局所特徴のモジュールが入っておらず, どうやらopencvのレポジトリとは別にopencv_contribというレポジトリで管理されていたので, OpenCV3にopencv_contribモジュールを取り込んでインストールし, SURFを使うところまでを備忘録がわりにブログに書いた.

検証環境はUbuntu14.04でgcc4.8.

インストール

まずはOpenCVをコンパイルする. OpenCV3のコンパイルにはCMakeの2.8.8以降が必要. Ubuntu14.04 だとデフォルトで2.8.8以降をaptでインストールできる.

徐ろにgithubからItseez/opencvItseez/opencv_contribをダウンロードしてくる.

mkdir tmp
cd tmp
git clone https://github.com/Itseez/opencv.git
git clone https://github.com/Itseez/opencv_contrib.git

次にCMakeを使ってMakefileを生成, コンパイルしてインストール.

cd opencv
mkdir release && cd release
cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules -DWITH_TBB=YES -DWITH_EIGEN=YES ../
make -j5
sudo make install

ポイントはOPENCV_EXTRA_MODULES_PATHopencv_contrib/modulesを指定しているところで, これで勝手にopencv_contribも取り込んでくれる. 便利. あとお好みに合わせてオプションを指定する. 上記だと, Intel TBBとEigenを利用できるようにしてる.

利用する

これでSIFTやSURFなどの局所特徴が利用できる. 注意点として, OpenCVにあるopencv2/features2d.hppをインクルードするだけではSIFTやSURFを利用できず, opencv2/xfeatures2d/nonfree.hppをインクルードする必要がある. また, cv::nonfree::initModule_xfeatures2dを(cv::initModule_features2dではなく) よんでやらないと, cv::FeatureDetector::createの呼び出しが失敗し, nullが返ってくるので注意.

#include #include #include #include #include int main() { cv::Mat image = cv::imread("lena.png"); if (!image.data) { std::cout << "No image data" << std::endl; return -1; } cv::xfeatures2d::initModule_xfeatures2d(); cv::Ptr detector = cv::FeatureDetector::create("SURF");↲ cv::Ptr extractor = cv::DescriptorExtractor::create("SURF");↲ std::vector keypoints; cv::Mat descriptor; detector->detect(image, keypoints); extractor->compute(image, keypoints, descriptor); cv::Mat output; cv::drawKeypoints(image, keypoints, output); cv::imwrite("output.png", output); return 0; }

渋谷で働くプログラマ。C#をメインに、趣味でGolangとPHPを書きます。スーパーハカーになるべく日々頑張ってます。