FrontPage

2013/01/13からのアクセス回数 38106

Debian系のRasbianは豊富なLinuxパッケージを揃えています。今回はOpenCVの顔認識をWebカメラで捉えた 動画に対して使ってみました。

今回使用したWebカメラは、ELECOM Webカメラ 130万画素 マイク内蔵 イヤホンマイク付属 HD対応 ホワイト UCAM-DLN130TWHで、1000円程度で購入できます。

WebCam.png

RaspberryPiの良いところは、WebカメラやUSB-Wifiと言った高機能の民生品が安価に使えることです。

OpenCVのインストール

OpenCVのインストールは至って簡単です。 Terminalから以下のコマンドを入力します。

$ sudo apt-get install libopencv-dev

テスト用のプログラムの作成

今回は、詳解OpenCVの2章の例題2を拡張し、顔認識をフレーム処理に追加しました。

ソースは以下の通りです。

#include "highgui.h"
#include "cv.h"

int main( int argc, char** argv ) {
    char* cascade = "/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml";
    double w = 160;
    double h = 120;
    cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE );
    CvCapture* capture = NULL;
    if (argc > 1){
    	capture = cvCreateFileCapture( argv[1] );
    }
    else {
    	capture = cvCreateCameraCapture( 0 );
        // (2)キャプチャサイズを設定する.
        cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
        cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
    }
    IplImage* frame;
    // 正面顔検出器の読み込み
    CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*)cvLoad(cascade);
    // 検出に必要なメモリストレージを用意する
    CvMemStorage* cvMStr = cvCreateMemStorage(0);
    // 検出情報を受け取るためのシーケンスを用意する
    CvSeq* face;
    while(1) {
        frame = cvQueryFrame( capture );
        if( !frame ) break;
        // 画像中から検出対象の情報を取得する
        face = cvHaarDetectObjects(frame, cvHCC, cvMStr);
        for (int i = 0; i < face->total; i++) {
            // 検出情報から顔の位置情報を取得
            CvRect* faceRect = (CvRect*)cvGetSeqElem(face, i);
            // 取得した顔の位置情報に基づき、矩形描画を行う
            cvRectangle(frame,
                        cvPoint(faceRect->x, faceRect->y),
                        cvPoint(faceRect->x + faceRect->width, faceRect->y + faceRect->height),
                        CV_RGB(255, 0 ,0),
                        2, CV_AA);
        }
        cvShowImage( "Example2", frame );
        char c = cvWaitKey(33);
        if( c == 27 ) break;
    }
    // 用意したメモリストレージを解放
    cvReleaseMemStorage(&cvMStr);
    // カスケード識別器の解放
    cvReleaseHaarClassifierCascade(&cvHCC);
    cvReleaseCapture( &capture );
    cvDestroyWindow( "Example2" );
}

Makefileも簡単です。*1

CXX = g++
LDFLAGS = -lopencv_legacy -lopencv_highgui -lopencv_core -lopencv_ml -lopencv_video \
-lopencv_imgproc -lopencv_calib3d -lopencv_objdetect -L/usr/lib
CPPFLAGS = -g -I/usr/include/opencv -I/usr/include/opencv2 

all: 	facedetect

動かしてみる

以下のコマンドで顔認識(facedetect)を起動します。

$ ./facedetect

以下のような画面にカメラの画像が表示され、顔を認識すると赤い矩形で知らせます。

Myface.png

処理速度的には、1秒間に1〜2コマ程度表示され、タイムラグは4秒程度遅れています。 しかし、玄関の人の検出等面白い応用ができると思います。

コメント

選択肢 投票
おもしろかった 185  
そうでもない 7  
わかりずらい 44  

皆様のご意見、ご希望をお待ちしております。

  • 「詳解OpenCV」 は本ですか?このブログのどこに載っているのでしょうか? -- ysato? 2014-10-28 (火) 11:07:16
  • ysatoさま、オライリーの本です。http://www.oreilly.co.jp/books/9784873114132/ -- 竹本 浩? 2014-10-28 (火) 14:50:36
  • Makefile からソースファイル名は facedetect.cpp と推測しました。 このページに captureimage.cpp に見当たりません。 OpenCVの本の Example 2-1 でしょうか? 初歩的な質問ですみません。 -- ysato? 2015-03-25 (水) 17:41:38
  • Makefile の理解が深まり ./facedetect を入力して動きました。大変お騒がせしました。 -- ysato? 2015-05-18 (月) 12:06:34
  • ysatoさま、ご報告ありがとうございます。説明に./facedetectを追加しました。 -- 竹本 浩? 2015-05-18 (月) 19:55:54
  • captureimage.cppはどちらに有りますでしょうか?オライリー本(E-Book)でcaptureimage.cppを検索しても見つかりません。よろしくお願いします。 -- methodist? 2015-07-19 (日) 11:38:10
  • methodistさん、すみません。captureimage.cppは別のプロジェクト用のプログラムです。詳しくはopencv/詳解OpenCVを勉強を参照してください。 -- 竹本 浩? 2015-07-19 (日) 22:19:58
  • お返事ありがとうございます。てっきり、画像の保存にcaptureimageが必要なのかと勘違いしましたが、cvSameImage()で画像が保存できることがわかり、追加したところうまくいきました。有用なプログラムを公開いただき有難うございます。 -- methodist? 2015-07-21 (火) 00:47:24

(Input image string)


*1 ysatoさま、methodistさまのご指摘で修正しました。

添付ファイル: fileWebCam.png 1893件 [詳細] fileMyface.png 2142件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-09-19 (木) 16:09:59 (1672d)
SmartDoc