OpenCV && AKAZE && Windows10 && VisualStudio2017


動作するバージョンの組み合わせを求めて...

OpenCVでAKAZEで画像間の特徴点のマッチングをやろうと思ったら、案の定
OS(Windows10 64bit)と、OpenCVのバージョンと、Visual Studioのバージョンの組み合わせを見つけるのに一苦労した。opencv2413では、何の問題もなく、SHIFTやSURFのサンプロコードがビルドして動作するのに、AKAZEはすんなり動いてくれない。opencv3???でもソースからbuildしたり、色々opencvのバージョンを変えてもうまくいかない。detectAndComputeで落ちる。
そこで、opencv440のバイナリーでやってみたら、あっけなく動いた。しかも、opencv440の何が変わったかを読んでたら、SIFTの特許が切れた(2020年3月)ので、をインクルードしなくても良くなったということも後ればせながら知った。

Windows10(64bit)と、OpenCV 4.4.0とVisualSTudio2017でAKAZEのサンプルプログラムを動かすには以下のような手順になる。

opencv440をダウンロードし、Dドライブに解凍し、opencvをopencv440にリネームする。

VisualStudio2017の設定

VisualStudioのプロジェクトのプロパティから
構成プロパティ→VC++ディレクトリ→インクルードディレクトリ D:\opencv440\build\include   
構成プロパティ→VC++ディレクトリ→ライブラリディレクトリ  D:\opencv440\build\x64\vc14\lib
リンカ→入力→追加依存ファイル D:\opencv440\build\x64\vc14\lib\opencv_world440.lib
と設定しておく、また、
実行ファイルがbuildされるパス(x64\Release)に、D:\opencv440\build\x64\vc14\bin\opencv_world440.dllをコピーしておかないとbuild後「実行できない!」と怒られる。

サンプルプログラム実行

たとえば、https://docs.opencv.org/3.4/dc/d16/tutorial_akaze_tracking.html
など、一発ででbuild、実行できる。ここで、webカメラを繋いでおけば、画像ファイルを用意してなくても動作する。

テストの方法は、実行しwebカメラからの画像がウィンドウに出力されたら、スペースバーを押し、適当な範囲をマウスで決めてエンターキーを押すと、AKAZEとORBのマッチングを同時にリアルタイムで実行するデモが始まる。キーボードのcで終了。

おまけに、上のバージョンで、SIFTの特徴点をディテクトするテスト。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d.hpp>
//#include <opencv2/nonfree/features2d.hpp> 

int main(int argc, const char* argv[])
{
    const cv::Mat input = cv::imread(argv[1], 0); 

    cv::Ptr<cv::SIFT> detector = cv::SiftFeatureDetector::create();
    std::vector<cv::KeyPoint> keypoints;
    detector->detect(input, keypoints);

    // Add results to image and save.
    cv::Mat output;
    cv::drawKeypoints(input, keypoints, output);
    cv::imwrite("sift_result.jpg", output);

    return 0;
}

この場合は、 <実行プログラム名> <画像名> で起動すると、sift_result.jpgに結果が
ストアされます。SIFTの特許の呪縛が解けたので、nonfreeのinclude をコメントアウトして実行できます。