OpenCV の PHP バインディングを書いてみた

3/24追記: 最新版はこちらです => http://d.hatena.ne.jp/moriyoshi/20070324/1174687182

http://voltex.jp/downloads/opencv-php-0.0pre.tar.gz

まだ完成にはほど遠いけど、顔認識くらいはできるようになってます。

インストール方法

PHP の開発パッケージが必要です。適宜 RPM なり deb なりをインストールしてください。ソースからインストールした方は大丈夫です。

% tar xvfz opencv-php-0.0pre.tar.gz
% cd opencv-php-0.0pre
% ./configure
% make
# make install

あと php.ini を書き換えて extension= を追加しましょう。

extension=opencv.so

とりあえず試したい方は php スクリプトの実行時に下記のように指定することもできます。

% php -dextension=opencv.so

サンプルコード

顔と認識された部分にオレンジで枠を描画します。
GD との連携ができてないので、別個に同じ画像を読む必要がある。ここは改善の余地ありだなあ。

haarcascade_frontalface_alt.xmlOpenCV のプロジェクトページ から落とせるソースアーカイブの data/ ディレクトリに入っています。

<?php
$im = cv_image_load('test.jpg');
$haar = cv_object_load('haarcascade_frontalface_alt.xml');
$seq = cv_haar_classifier_cascade_detect_objects($haar, $im);

$rects = array();
for ($i = 0, $l = cv_rect_seq_count($seq); $i < $l; $i++) {
	$rects[] = cv_rect_seq_get($seq, $i);
}

$im = ImageCreateFromJpeg('test.jpg');
$orange = imagecolorallocate($im, 255, 192, 0);
foreach ($rects as $rect) {
	ImageRectangle($im,
		$rect['x'], $rect['y'],
		$rect['x'] + $rect['w'],
		$rect['y'] + $rect['h'],
		$orange);
}

ImageJpeg($im, 'out.jpg');
?>

出力例

f:id:moriyoshi:20020216083531j:image f:id:moriyoshi:20070314111652j:image

追記

これって日曜日あたりから作ってたんだけども。12時間位の差で二番煎じとなってしまったようでした。ひろかわさんという方 (PHP コミッタの廣川さんとは別人です、ねんのため) も同様の挑戦をしていますね。

http://hirokawa.netflowers.jp/entry/4875/