CentOS, PHP-5.3.3, OpenCV-2.2.0, face_detect-0.0.1(※ちょっと手を加えた)で作った。
OpenCV いれるのに CMake が必要なのであらかじめいれとく。
$ yum install cmake
OpenCV-2.2.0 をダウンロード、/usr/local/src/ 以下に配置して解凍。
$ bzip2 -d OpenCV-2.2.0.tar.bz2 $ tar -xvf OpenCV-2.2.0.tar
解凍した OpenCV-2.2.0 ディレクトリに移動してインストール作業。pythonインターフェースはいろいろあって無効にした。
$ cd /usr/local/src/OpenCV-2.2.0/ $ mkdir release $ cd release $ cmake -D BUILD_EXAMPLES=ON -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=NO -D WITH_1394=OFF -D ENABLE_OPENMP=ON ../ $ make $ make install
今度は OpenCV の PHP用拡張 face_detect をダウンロードしてインストール作業。
$ cd /usr/local/src/ $ wget http://www.netflowers.co.jp/face_detect/face_detect-0.0.1.tar.gz $ tar -xzvf face_detect-0.0.1.tar.gz $ cd face_detect-0.0.1/
face_detect-0.0.1 は 古い OpenCV(1.x?) 用の拡張なので、このままビルドしてもうまくいかない。なので、ソースをちょっと書き換える必要がある。まず、cvHaarDetectObjects の引数の数が変更されているので、face_detect.c と face_detect.xml を修正。
$ vim face_detect.c 137: objects = cvHaarDetectObjects(gray, cascade, storage, 138: 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0), cvSize(0, 0)); $ vim face_detect.xml 45: objects = cvHaarDetectObjects(gray, cascade, storage, 46: 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0), cvSize(0, 0));
次に、OpenCV のライブラリ名も 2.2 から大きく変更されているので、config.m4 を修正。
$ vim config.m4 35: PHP_ADD_LIBRARY_WITH_PATH(opencv_core, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD) 36: PHP_ADD_LIBRARY_WITH_PATH(opencv_objdetect, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD) 37: PHP_ADD_LIBRARY_WITH_PATH(opencv_highgui, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD) 38:dnl PHP_ADD_LIBRARY_WITH_PATH(cxcore, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)39: PHP_ADD_LIBRARY_WITH_PATH(opencv_ml, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD) ※ opencv_core, opencv_objdetect, opencv_highgui, opencv_ml を見にいくように修正すればいい。
ここまでやったら phpize → configure → make 実行。うまくいけば ./modules/face_detect.so が作成される。
$ phpize $ ./configure $ make $ ls ./modules/face_detect.so ./modules/face_detect.so
作成された face_detect.so を PHPから認識させるために php.ini を修正。php.ini の設定に併せて face_detect.so も配置。
$ vim /usr/local/lib/php.ini extension_dir = "/usr/local/lib/php/extensions" extension=face_detect.so $ cp modules/face_detect.so /usr/local/lib/php/extensions/
php -m で face_detect が表示されればOK。
$ php -m | grep face face_detect
face_detect 関数は検出された顔の数だけ座標(x, y, width, height)の配列を返す。これを利用して元の画像の顔部分を赤い四角で囲うだけの簡単なPHPスクリプトを書いた。
ちなみに「haarcascade_frontalface_alt.xml」は OpenCVで用いる「正面顔」識別情報定義ファイル。実パスは /usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml だけどローカルコピーして使ってる。
実行結果。Battlesの人たちの顔が赤く検出されました。
↓
処理が重たいけど、顔座標検出だけだったら充分かも。
より細かく制御したかったら、face.com API 使えばいいと思う。