OpenCVで学ぶ画像認識

第3回 オブジェクト検出してみよう

この記事を読むのに必要な時間:およそ 3 分

顔検出プログラム

というわけで,ようやく実際のオブジェクト検出プログラムの話に入ります。OpenCVにはあらかじめ,学習された「顔」情報が用意されているため,まずはこれを使用して顔検出プログラムを書いてみましょう。

下のプログラムで使用されている,学習済み顔画像⁠haarcascade_frontalface_default.xml⁠は,OpenCVインストールディレクトリ下の⁠data\haarcascades⁠にありますので,コピーをするかプログラム中でパスを指定するようにしてください。

顔検出プログラム

int main(int argc, char* argv[])
{
  /* 画像のロード */
  char imgfile[] = "office.jpg";
  IplImage* image = cvLoadImage( imgfile, 1 );

  /* 正面顔検出器のロード */
  CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "haarcascade_frontalface_default.xml" );

  CvMemStorage* storage = cvCreateMemStorage(0);
  CvSeq* faces;
  int i;

  /* 顔検出 */
  faces = cvHaarDetectObjects( image, cascade, storage );

  /* 顔領域の描画 */
  for( i = 0; i < faces->total; i++ )
  {
    /* extract the rectanlges only */
    CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i );
      cvRectangle( image, cvPoint(face_rect.x,face_rect.y),
      cvPoint((face_rect.x+face_rect.width),
        (face_rect.y+face_rect.height)),
        CV_RGB(255,0,0), 3 );
  }

  /* 画像の表示 */
  cvReleaseMemStorage( &storage );
  cvNamedWindow( "face_detect", 0 );
  cvShowImage( "face_detect", image );
  cvWaitKey(0);
  cvReleaseHaarClassifierCascade( &cascade );
  cvReleaseImage( &image );

  return 0;
}

重要なポイントだけ解説致します。まず,

CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "haarcascade_frontalface_default.xml" );

で,正面顔を学習させたカスケード識別器とそのパラメータをXMLファイルから読み込みます。⁠haarcascade_frontalface_default.xml⁠が学習済みの顔データになります。OpenCVで用意されている構造体などの情報は,cvLoadやcvSaveによって簡単にファイルへの読み込み/書き込みが可能です。

次にcvHaarDetectObjects()関数を使って画像から検出し,facesにというCvSeq構造体ポインタへ検出した顔の位置情報を渡します。

最後に,cvGetSeqElem関数で,facesから一つ一つ顔領域を矩形データとして取得し,それをcvRectangle()で描画します。

実行の結果,次のような結果が出れば成功です。

図7 顔検出結果

図7 顔検出結果

終わりに

いかがだったでしょうか? 今回は,OpenCVで用いられているオブジェクト検出アルゴリズムと,実装の仕方について解説しました。画像認識が具体的にどのような流れで行われているのかのイメージを掴んでいただけたら幸いです。

次回は,いよいよ最終回。自分たちでコンピュータに対してオブジェクトを学習させることで,オリジナル検出器を作ってみましょう。

著者プロフィール

皆川卓也(みながわたくや)

ジェイマジック株式会社のラボに所属する傍ら,慶応義塾大学の博士課程でコンピュータビジョンを研究する社会人ドクター。画像認識とIT技術を融合して新しいソリューションを開発することを生業とする自称テクニカル・ソリューション・アーキテクト。ジェイマジックでは、「顔ちぇき!~誰に似てる?~™」や「SAYL™」のシステムの立ち上げに携わる。

ジェイマジック
URLhttp://www.j-magic.co.jp/
慶応大学 斎藤英雄研究室
URLhttp://www.hvrl.ics.keio.ac.jp/