【Raspberry Pi 2】 RasPiカメラモジュールとOpenCVで顔認識

前回の記事(【Raspberry Pi 2】 RasPiカメラモジュールをOpenCVで使用する)にて、RaspberryPiカメラモジュールをOpenCVから使用するテストを行いました。

今回は定番の顔認識を行ってみましたので、手順などを掲載します。


OpenCV2.4.11のインストール

今回はOpenCVのバージョンは2015年2月26日にリリースされたばかりの2.4.11を使用しました。

2.4.11のインストール手順は前回と同じでOKでした。
インストール手順は下記になります。詳しくは前回の記事を参照ください。

なお、前回の記事で、1時間でコンパイルが終わったと書きましたが、今回は2時間かかりました。もしかすると、前回の1時間は見誤ったかもしれません。

USBカメラでサンプルの顔認識を動かしてみる

まずはUSBカメラで顔認識をしてみます。OpenCVに付属している顔認識のサンプルは以下になります。

まずは試しにそのままビルドしてみます。(※下記例では顔認識のサンプル以外もビルドされます)

JPG画像で顔認識するには以下のように実行します。

USBカメラの映像で顔認識するには以下のように実行します。

なお、scaleのパラメータは1以上を指定すると画像を縮小して処理を行うため、処理が速くなります。
あまり大きくしすぎると認識しなくなるため、画像の中の顔のサイズと相談(※)ですが、1.5から4ぐらいが良いようです。
※顔のサイズが大きい場合はscaleを大きくできます。

RasPiカメラモジュールで顔認識

さて、いよいよRaspberryPiカメラモジュールで顔認識してみます。

なお、raspicam_cvライブラリが前回の手順でインストールされているものとします。

顔認識のサンプルソースをコピーします。

raspicam_cvライブラリをコピーします。

顔認識のサンプルソースを以下のように変更します。★の個所が変更箇所です。
facedetect_raspicam.cpp

以下のようにコンパイルします。”-L .”より後ろがraspicam_cvライブラリを使用するための指定となります。

以下のように実行します。

モニタに映ったクエリちゃんを認識させてみました。クエリちゃんのバルーン集めのタイトル画面です。
※画像が汚いのはVNC経由のためです。色合いがおかしいのはRasPiカメラの性質と思います。
facedetect05

なお、上記クエリちゃんの顔認識では以下のようにcascade(検出器)にhaarcascade_frontalface_default.xml を指定しました。クエリちゃんはデフォルトのhaarcascade_frontalface_alt.xmlよりこちらの方が認識されやすかったので。

(時間があれば)Raspberry Pi 2の4コアを活かすべく顔認識を別スレッドにするようにしてみたいです。


Query-Chan_license_logo







Android用 本格派対局将棋 ぴよ将棋
本格派対局将棋 ぴよ将棋

かわいい「ひよこ」と対局するAndroid用将棋アプリ。かわいいけどAIは本格派!
対局後の検討機能や棋譜管理機能も充実!棋譜解析機能も搭載!

「【Raspberry Pi 2】 RasPiカメラモジュールとOpenCVで顔認識」への12件のフィードバック

  1. 初めまして、ラズベリパイを勉強中のものです。
    サンプルプログラム拝見致し、同じように実行しましたがエラーが発生します。 ★FPS対応からエラーが発生しますが、プログラムスキールがなくてどのように直せば良いか分かりません。ご指導よろしくお願いします。

  2. kskさん
    エラーメッセージを送信いただければ何かアドバイスができるかもしれません。

  3. すみません、返信が遅くなりました。コンパイルする際に下記のようなエラーが発生します。
    ご指導よろしくお願いします。

    facedetect_raspicam.cpp: In function ‘int main(int, const char**)’:
    facedetect_raspicam.cpp:78:34: error: expected ‘;’ before ‘)’ token
    facedetect_raspicam.cpp:79:17: error: ‘fps_idx’ was not declared in this scope
    facedetect_raspicam.cpp:82:23: error: ‘iorigin’ was not declared in this scope
    facedetect_raspicam.cpp:82:48: error: expected ‘;’ before ‘)’ token
    facedetect_raspicam.cpp:84:13: error: ‘else’ without a previous ‘if’
    facedetect_raspicam.cpp:87:39: error: ‘cascade’ was not declared in this scope
    facedetect_raspicam.cpp:87:48: error: ‘nestedCascade’ was not declared in this scope
    facedetect_raspicam.cpp:87:63: error: ‘scale’ was not declared in this scope
    facedetect_raspicam.cpp:90:22: error: label ‘_cleanup_’ used but not defined
    facedetect_raspicam.cpp: At global scope:
    facedetect_raspicam.cpp:93:16: error: expected constructor, destructor, or type conversion before ‘(’ token
    facedetect_raspicam.cpp:95:10: error: found ‘:’ in nested-name-specifier, expected ‘::’
    facedetect_raspicam.cpp:95:1: error: ‘_cleanup_’ does not name a type
    facedetect_raspicam.cpp:102:5: error: expected declaration before ‘}’ token

  4. kskさん
    貼りつけていたソースですが、ブラウザによっては表示が崩れてしまう場合があったようです。ソースを表示するためのツールを導入してみましたので、再度試してみてください。

  5. ありがとうございます。
    再度試した結果、問題無くpiカメラで顔認識出来ました。

    今後も「PONTAの工房 ~プログラミング・電子工作~」を拝見しながらラズベリパイの勉強に力をつけたいと思います。どうぞよろしくお願いします。

  6. はじめまして。
    RasPiで画像処理を行いたく、管理人様の手順を参考にさせていただいております。

    初心者ながらraspicam_cvを導入してOpenCVでカメラモジュール操作を行うことは出来たのですが、
    当記事のカメラモジュールで顔認証を行うプログラムを実行しようとすると、エラーがでてしまいます。
    ターミナルで

    ./facedetect_raspicam –scale=4

    を打ち込むと

    Processing 1 –scale=4
    from which we read scale = 4
    ERROR: Could not load classifier cascade

    と出てきます。
    ビルド自体は出来ているみたいなのですが、実行がどうもうまくいきません。
    原因がお分かりでしたらご指導お願いします。

    1. KTさん
      「ERROR: Could not load classifier cascade」とのことですので、cascadeファイルが読み込めないのだと思います。本文中の「facedetect_raspicam.cpp」のソースだと40行目、41行目で相対パスでファイルを指定していますので、ファイルを参照できるディレクトリに移動してから実行する必要があります。または、–cascadeオプションおよび–nested-cascadeオプションで明示的に指定してあげればよいと思います。

  7. 回答ありがとうございます。
    ご指摘の通り、cascadeファイルが読み込めていませんでした。
    facedetect.cppがあった場所に移動させて実行してみると正常に動作しました。
    また当記事の「facedetect_raspicam.cpp」ソースの40,41行目のパスを変えたところ、別のフォルダでも動作を確認することができました。

    管理人様、丁寧に答えていただいて本当にありがとうございました。
    今後も当ブログの更新をがんばってください。楽しみにしております。

  8. はじめまして 上記のプログラムをコンパイルして実効したら以下のような文が出ます。
    This program demonstrates the cascade recognizer. Now you can use Haar or LBP features.
    This classifier can recognize many kinds of rigid objects, once the appropriate classifier is trained.
    It’s most known use is for faces.
    Usage:
    ./facedetect [–cascade= this is the primary trained classifier such as frontal face]
    [–nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]
    [–scale=]
    [–try-flip]
    [filename|camera_index]

    see facedetect.cmd for one call:
    ./facedetect –cascade=”../../data/haarcascades/haarcascade_frontalface_alt.xml” –nested-cascade=”../../data/haarcascades/haarcascade_eye.xml” –scale=1.3

    During execution:
    Hit any key to quit.
    Using OpenCV version 2.4.10

    ERROR: Could not load classifier cascade

    This program demonstrates the cascade recognizer. Now you can use Haar or LBP features.
    This classifier can recognize many kinds of rigid objects, once the appropriate classifier is trained.
    It’s most known use is for faces.
    Usage:
    ./facedetect [–cascade= this is the primary trained classifier such as frontal face]
    [–nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]
    [–scale=]
    [–try-flip]
    [filename|camera_index]

    see facedetect.cmd for one call:
    ./facedetect –cascade=”../../data/haarcascades/haarcascade_frontalface_alt.xml” –nested-cascade=”../../data/haarcascades/haarcascade_eye.xml” –scale=1.3

    During execution:
    Hit any key to quit.
    Using OpenCV version 2.4.10

    opencv2.4.10を使っていることが原因なのでしょうか?

    1. ERROR: Could not load classifier cascade
      とのエラーが出ているようですので、
      cascade=”../../data/haarcascades/haarcascade_frontalface_alt.xml” –nested-cascade=”../../data/haarcascades/haarcascade_eye.xml”
      で指定しているパスが正しいか確認してみてください。
      カレントパスから
      ls ../../data/haarcascades/haarcascade_frontalface_alt.xml
      などで参照できるでしょうか?
      絶対パスにしてみても良いかもしれません。

コメントを残す

メールアドレスが公開されることはありません。