: O. Yuanying

Ruby 1.9.2 で顔認識してみた

4年ほど前に流行った Ruby の OpenCV ラッパである objectdetect を今更ながらに使ってみたら意外にハマッタのでメモ。

環境

とりあえず環境は、

  • Ubuntu 10.10
  • Ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]
  • hoe (2.10.0)
  • objectdetect (0.0.3)
  • rake (0.9.2)
  • OpenCV 2.1

と言う感じ。

OpenCV のインストール

Ubuntu の場合、OpenCV のライブラリがいくつかに別れてるらしく、 gem install objectdetect するたびにあのライブラリが無いこのライブラリが無いと言われてむかついた。 どんな感じでむかついたのかはわざわざログにする必要も無いので、必要なライブラリを以下に晒す。

$ sudo apt-get install libcv-dev
$ sudo apt-get install libhighgui-dev
$ sudo apt-get install libcvaux-dev

objectdetect のインストール

そもそも objectdetect は Ruby 1.9 に対応してないらしく、 native extention がコンパイルできないのでそこから直してやる必要がある。

objectdetect 0.0.3 のソースコードの修正

とりあえずどっかから、objectdetect-0.0.3.gem を拾ってきて unpack する。

$ gem unpack objectdetect-0.0.3.gem

unpack されて出てきたソースコードの中から、 ext/objectdetect.c を修正する。

--- objectdetect.c.org  2011-07-29 15:09:32.000000000 +0900
+++ objectdetect.c  2011-07-29 15:10:03.000000000 +0900
@@ -25,13 +25,13 @@
   Check_Type(target_path, T_STRING);

   /* load the model */
-  CvHaarClassifierCascade* cascade = cvLoad(RSTRING(model_path)->ptr, 0, 0, 0);
+  CvHaarClassifierCascade* cascade = cvLoad(RSTRING_PTR(model_path), 0, 0, 0);
   if( cascade == 0 ) {
     rb_raise(rb_eArgError, "Can't load the cascade file");
   }

   /* load the target picture */
-  IplImage *img = cvLoadImage(RSTRING(target_path)->ptr, 1);
+  IplImage *img = cvLoadImage(RSTRING_PTR(target_path), 1);
   if( !img ) {
     cvReleaseHaarClassifierCascade(&cascade);
     rb_raise(rb_eArgError, "Can't load the image file");

インストール

修正し終わったら rake gem して解凍したソースコードを gem 化しインストール。

$ rake gem
$ gem install pkg/objectdetect-0.0.3.gem

rake gem した時にエラーが出るようだったら、たぶん hoe が入ってないのでインストールしておく。

試す

require 'rubygems'
require 'objectdetect'

model_path = 'haarcascade_frontalface_alt2.xml'

p ObjectDetect::detect(model_path, '01kiribati1.jpg')

適当な名前で上のコードを保存して、

$ rvm use 1.9.2@opencv                
Using /home/yuanying/.rvm/gems/ruby-1.9.2-p180 with gemset opencv

$ ruby test.rb        
libdc1394 error: Failed to initialize libdc1394
[[188, 27, 41, 41], [40, 35, 46, 46]]

認識されたことを確認してヨロコブ。 なんかエラーが出てますが、問題ない!

ちなみにさらっと書いてるように見えるがけっこー時間かかった!

参考文献