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 <iostream>
    #include <vector>
    
    #include <opencv2/core.hpp>
    #include <opencv2/imgcodecs.hpp>
    #include <opencv2/xfeatures2d.hpp>
    
    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<cv::FeatureDetector> detector = cv::FeatureDetector::create("SURF");↲
        cv::Ptr<cv::DescriptorExtractor> extractor = cv::DescriptorExtractor::create("SURF");↲
    
        std::vector<cv::KeyPoint> 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;
    }

    Yuichiro MUKAI
    Yuichiro MUKAIGame & Web Programmer

    シブヤで働くゲームプログラマー. C#(For Unity)をメインに, 趣味でPHPなどを書きます.

    Twitter / Facebook