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]]
認識されたことを確認してヨロコブ。 なんかエラーが出てますが、問題ない!
ちなみにさらっと書いてるように見えるがけっこー時間かかった!