Arch LinuxにOpenCV3を導入して遊んでみた

こんにちは。今回のテーマは『Arch LinuxにOpenCV3を導入して遊んでみた』です。最近、iOS上でOpenCVによる動画の処理をする機会があり、LinuxでもOpenCVを使ったプログラムを書いてみたら面白そうだと思い、試してみました。今回は動画をリアルタイムで特徴検知する簡単なサンプルプログラムを書いてみましたが、他にもアイデア次第で色々なことが出来ると思います。OpneCVはC/C++,Python,Java等の言語で使用できますが今回はC++で書いています。


【目次】
OpenCVとは
Arch LinuxにOpenCVをインストールする
C++版OpenCVで動画のリアルタイム画像処理
サンプルプログラムのコンパイル
実行してみる

OpenCVとは

本記事をご覧の方には説明は不要かも知れません。OpenCVはIntelによって開発されたコンピュータービジョン向けののオープンソースライブラリです。(OpenVCのライセンスはBSDライセンスですが、拡張モジュールであるopencv_contribにはライセンス上の制限があるものも含まれ配布などの際には注意が必要です。)OpenCVを使うと動画の顔認識や、画像処理をバッチ処理するなどのプログラムが簡単に作成できます。

Arch LinuxにOpenCVをインストールする

OpenCVは多くのディストリビューションで公式リポジトリから提供されています。筆者はArch Linuxでインストールをしました。

Arch LinuxからOpenCVをインストールするのは非常に簡単で以下のコマンドを実行するだけです。

$ sudo pacman -S opencv

もし拡張機能を使いたい場合はAURからopencv-contribもインストールします。

OpenCVがインストールされたかどうかは以下のコマンドを出力して見ましょう。ヘッダーの場所が表示されればOKです。

$ pkg-config --cflags opencv

C++版OpenCVで動画のリアルタイム画像処理

今回はUSBカメラから読み込んだ動画から特徴点を検出して動画として返す簡単なサンプルを書いてみようと思います。OpenCVに関する情報はネット上で沢山収集出来ます。今回のサンプルはOpenCV3に対応させていまのでOpenCV2.x系とはディテクター周りの書き方が異なっています。

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

int main() {
    VideoCapture cap(0);
    // DetectorにはFASTを使用
    Ptr<Feature2D> detector = FastFeatureDetector::create();
    vector<KeyPoint> keypoint;
    Mat frame,gray_image;

    if(!cap.isOpened()) {
        return -1;
    }

    while(1) {
        /*
         * ここでフレームごとの処理を実行する
         */
        
        cap >> frame;

        // キャプチャ画像をグレースケールへ
        cvtColor(frame, gray_image, CV_RGB2GRAY);

        // 特徴点を抽出
        detector->detect(gray_image, keypoint);

        // 検出した特徴点を描画
        for(int i = 0; i < keypoint.size(); i++) {
            KeyPoint *point = &(keypoint&#91;i&#93;);
            Point center;
            int radius;
            center.x = cvRound(point->pt.x);
            center.y = cvRound(point->pt.y);
            radius = cvRound(point->size*0.25);
            circle(frame, center, radius, Scalar(51,0,255));
        }


        imshow("window",frame);

        int key = waitKey(1) & 0xff;
        if(key == 'q') {
            break;
        } else if(key == 's') {
            imwrite("capimage.jpg", frame);
        }
    }
    destroyAllWindows();
    return 0;
}

サンプルプログラムのコンパイル

C/C++で外部ライブラリを使用経験のある方には当たり前の話のなのですが、openCVのヘッダーやライブラリの位置をコンパイル時に示す必要があります。今回は以下のようなMakefileを作成して対応することにします。

LIBS = `pkg-config --libs opencv`
CFLAGS = `pkg-config --cflags opencv`

test: testopencv.o
	g++ -o $@ $(LIBS) testopencv.o

testopencv.o: testopencv.cpp
	g++ -c $(CFLAGS) testopencv.cpp

clean:
	rm -f testopencv.o

Makefileが作成できたら作成したファイルのディレクトリ上で以下コマンドを実行します。

$ make

実行してみる

ではコンパイルされた実行ファイルを実行し見ましょう。今回はtestという実行ファイル名になっています。

$ ./test

別ウィンドウが開きWEBカメラの動画に特徴検知された部分が赤い点で描画された動画が映ると思います。(画像中の書籍は『Excellで学ぶ多変量解析入門』です。本棚から出してきました。)
01

プログラムはqを押すと止まり、sを押すと静止画を保存します。

最後に

OpenCVに関する記事はネット上にも沢山あり今更という感じは下のですが、本記事がプログラミング初心者の方の何かのきっかけになればと思い、導入から実行までを記事にしました。OpenCVの使い方に関する記事はopencv.jp/cookbookが使いやすいと思います。

【関連記事】
Arch Linuxを使ってみた

Sponsored Link


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です