読者です 読者をやめる 読者になる 読者になる

vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

【Windows】OpenCV+AKAZEに触れてみる

ふと一部のみ異なる2枚の画像を比較してみたくなったため、OpenCV3.0とAKAZEを使ってみることにしました。

環境

準備

環境構築

以下の公式パッケージを使ったインストール方法参考に環境構築をしました
* http://www.buildinsider.net/small/opencv/02

Visual Studioでのプロジェクトの作成は以下を参考にしました。
* http://www.buildinsider.net/small/opencv/03

上記はOpenCV2.4.9の内容ですが、以下を除いて3.0でも問題ありませんでした。

  • プロジェクトのプロパティのC/C++ > 全般 > 追加のインクルードディレクトリ に設定するincludeのディレクトリの場所が、「OpenCVをインストールしたパス\build\install\include」から「OpenCVをインストールしたパス\build\include」に変わっていました。
  • プロジェクトのプロパティのリンカー > 全般 > 追加のライブラリディレクトリに「OpenCVをインストールしたパス\build\x64\vc12\lib」を設定していても、「opencv_core300d.lib」が見つからない等のエラーとなったため、以下を参考に「OpenCVをインストールしたパス\build\x64\vc12\staticlib」を設定しました。

http://freed411.doorblog.jp/archives/44773232.html

使用する画像

今回は以下の画像を使用します。LibreofficeのCalcを使って作成したものですが、次回はこれとセル内の文字列を一部変更した画像を使用して、画像比較を行う予定です。

f:id:mslGt:20150901003537p:plain

画像はプロジェクトのトップディレクトリ/プロジェクト名/img に置いています。

ソースコード

今回は以下を実装します。

  1. グレースケールで画像を読み込む
  2. 二値化する
  3. 特徴点を抽出する
  4. 特徴点を描画する
  5. 特徴点を描画した画像を表示する
#include 

#ifdef _DEBUG        
#pragma comment(lib,"opencv_core300d.lib")
#pragma comment(lib,"opencv_features2d300d.lib")
#pragma comment(lib,"opencv_imgproc300d.lib")
#pragma comment(lib,"opencv_highgui300d.lib")
#pragma comment(lib,"opencv_hal300d.lib")
#pragma comment(lib,"opencv_imgcodecs300d.lib")
#pragma comment(lib, "opencv_video300d.lib")
#pragma comment(lib, "opencv_objdetect300d.lib")
#pragma comment(lib,"ippicvmt.lib")
#pragma comment(lib,"IlmImfd.lib")
#pragma comment(lib,"libjasperd.lib")
#pragma comment(lib,"libjpegd.lib")
#pragma comment(lib,"libpngd.lib")
#pragma comment(lib,"libtiffd.lib")
#pragma comment(lib,"libwebpd.lib")
#pragma comment(lib,"zlibd.lib")
#else    
#pragma comment(lib,"opencv_core300.lib")
#pragma comment(lib,"opencv_features2d300.lib")
#pragma comment(lib,"opencv_imgproc300.lib")
#pragma comment(lib,"opencv_highgui300.lib")
#pragma comment(lib,"opencv_hal300.lib")
#pragma comment(lib,"opencv_imgcodecs300.lib")
#pragma comment(lib,"ippicvmt.lib")
#pragma comment(lib,"IlmImf.lib")
#pragma comment(lib,"libjasper.lib")
#pragma comment(lib,"libjpeg.lib")
#pragma comment(lib,"libpng.lib")
#pragma comment(lib,"libtiff.lib")
#pragma comment(lib,"libwebp.lib")
#pragma comment(lib,"zlib.lib")  
#endif

int main(int argc, char* argv[])
{
    // 画像をグレースケールで読み込む.
    std::string strFileName1 = "img/sample1.png";
    cv::Mat img1 = cv::imread(strFileName1, 0);
    
    // 画像を二値化する.
    cv::Mat imgThreshold1;
    cv::threshold(img1, imgThreshold1, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);

    std::vector keypoints;
    cv::Mat descriptors;

    cv::Ptr akaze = cv::AKAZE::create();
    // 特徴点の抽出.
    akaze->detect(imgThreshold1, keypoints);
    
    // 特徴点の描画.
    cv::drawKeypoints(img1, keypoints, img1);
    
    // 画像を表示する.
    cv::imshow("match", img1);

    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}

結果

以下のように特徴点に丸が表示されます。 f:id:mslGt:20150901003551p:plain

次回は2枚の画像から特徴点を抽出し、比較を行う予定です。

参照

環境構築

AKAZE