vaguely

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

OpenCVに触れてみる その1

以前インストールしていたOpenCVですが、その後全く触らなくなっていました。

動画や画像を扱いたくなったため、もう一度試してみることにしました。

Xcodeでプロジェクトの作成とライブラリの追加

  1. 新規プロジェクトを、OS X>Command Line Toolを選択し、言語はC++にして作成。
    (Pythonの方が扱いやすいとのことですが、後々C#Objective-Cと組み合わせたいこともあってC++を選択)

  2. ナビゲーターエリアのプロジェクト名をクリック>TARGETSでターゲット名をクリックして、Build Settingsタブで、ビルド時に使用するファイルのパスを設定します。

  3. Search Paths>Header Search Path
    /opt/local/include

  4. Search Paths>Library Searh Path
    /opt/local/lib

  5. Build Phasesタブを開いて、[Link Binary With Libraries]に以下を追加します
    (ファイルは[/opt/local/lib]にあります)。
    libopencv_core.2.4.8.dylib libopencv_highgui.2.4.8.dylib

※[2.4.8]の部分はバージョンによって異なります。
また、以下の参考サイトでは[libopencv_imgproc.2.4.7.dylib]も追加していますが、私が今回作成したプログラムを動かすだけなら追加しなくても良さそうです。

【参考】

【OpenCV】OpenCV2.4.7をMacにインストールしてサンプルを動かしてみる - キリンを召還するブログ。

プロジェクトを実行する場所を指定する

動画ファイルをロードするにあたって、ファイルのパスを相対パスで記述するとファイルが見つからずエラーになります。

そこで、実行するパスを指定してやることでその場所からの相対パスを使用可能にします。

  1. 再生ボタンや停止ボタンの右側、Active Scheme(デフォルトでターゲット名が表示されていると思います)をクリック>Edit Scheme

  2. 左側でRun (ターゲット名)を選択して、[Working Directory]でテキストボックスにパスを指定します(プロジェクト直下にしました)。

【参考】

Xcodeでの相対パス指定 - ad libitum

動画ファイルを読み込んで表示してみる

とりあえず動画ファイルを読み込んで、ウインドウで表示して再生するプログラムを作ってみました。

https://github.com/masanori840816/OpenCvTest

viewMovie.h

#include < opencv2/opencv.hpp >

class ViewMovie{
public:
    int viewMovies();
    std::string strFileName = "files/mouse.mp4";
};

includeでopencv2を読み込んでいるのと、動画ファイルのパスを指定しています。

viewMovie.cpp

#include "viewMovie.h"

int ViewMovie::viewMovies(){
    cv::VideoCapture vdcCapture(strFileName);
    // ファイルが見つからなければエラー
    if(!vdcCapture.isOpened()){
        return -1;
    }
    cv::namedWindow("Movies", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);

while(1) {
    cv::Mat matFrame;
    vdcCapture >> matFrame;

    // 再生が終了したら閉じる
    if(matFrame.empty()){
        break;
    }
    // ウインドウに映像を表示する
    cv::imshow("Movies", matFrame);

    // Escapeキー押下で閉じる
    if(cv::waitKey(10) == 27){
        break;
    }
}
return 0;
}

vdcCaptureで読み込んだ動画をウィンドウに表示しています。

再生が終了すると、[imshow]で表示する内容が無くなりエラーが発生するため、[matFrame.empty()]でチェックしています。

【参考】

[動画ファイルの読み込み]
入出力とGUI - OpenCV-CookBook

[WaitKeyについて]
OpenCVでウィンドウを作成した後、その中に画像を表示する - オープンソースの誘惑

とりあえず動きはしたので、明日からは表示した映像をいじってみたいと思います。