FlashでOpenCVを使った顔認識をライブカメラの動画で

FlashでOpenCVを使った顔認識 - jk25kの日記の続き。Marilenaサンプルソースを殆どそのまま使わせてもらっていたツモリでいたけどサンプルは、JPEG画像の顔部分に枠を付けるというものだった。
今回使ったのは、USBで接続したライブカメラの動画にリアルタイムで顔部分にビットマップを上書きするというもの。コードはざっとこんな感じ。

//カメラの設定
var cam:Camera = Camera.getCamera();
cam.setMode(320,240,15);
var vid:Video = new Video(800,600);
vid.attachCamera(cam);
addChild(vid);

//顔認識処理を行うタイマーの設定
var _timer:Timer = new Timer(500, 0);
_timer.addEventListener(TimerEvent.TIMER, timer_event);

//顔認識用のビットマップの用意
var _mx:Matrix = new Matrix(0.4, 0, 0, 0.4);
var bd:BitmapData = new BitmapData(320, 240);

//顔認識を実施
function timer_event(event:TimerEvent) {
	_timer.stop();
	bd.draw(vid,_mx);
	FACE_BITMAP.visible = false;	
	detector.detect( new Bitmap(bd) );
	_timer.start();
}

//顔認識部分のメイン部分・画像の時と殆ど同じ
var detector:ObjectDetector;
var options :ObjectDetectorOptions;

detector = new ObjectDetector;
detector.options = getDetectorOptions();
function getDetectorOptions() :ObjectDetectorOptions {
	options = new ObjectDetectorOptions;
	options.min_size  = 45;
	options.startx    = ObjectDetectorOptions.INVALID_POS;
	options.starty    = ObjectDetectorOptions.INVALID_POS;
	options.endx      = ObjectDetectorOptions.INVALID_POS;
	options.endy      = ObjectDetectorOptions.INVALID_POS;
	return options;
}
detector.loadHaarCascades( "face.zip" );
detector.addEventListener(ObjectDetectorEvent.DETECTION_COMPLETE,function( e :ObjectDetectorEvent ):void{
	if( e.rects ){
		e.rects.forEach( function( r :Rectangle, idx :int, arr :Array ) :void {
			FACE_BITMAP.x =(r.x - (r.width * 0.35))*2.5;
			FACE_BITMAP.y =(r.y -(r.height * 0.35))*2.5;
			FACE_BITMAP.width = r.width * 3.6;
			FACE_BITMAP.height = r.height * 3.6;
			FACE_BITMAP.visible = true;
		});
	}
});
  1. カメラの解像度は320x240として、画面上では、それを800x600に拡大して表示
  2. 800x600で表示しているVideoを0.5秒に1回ビットマップ化して、320x240に縮小して顔認識
  3. 顔認識で見つかった座標を若干大きくした上で(ビットマップが顔を置きかえる感じなので少し大きい方が顔が隠れて自然に見える)ステージ上に用意しておいたビットマップ(FACE_BITMAP)を拡大縮小して配置

という処理の流れ。
0.5秒というのをもっと細かくすればなめらかになるけれど、処理速度との兼ね合いで調整した結果がそのくらいだった。ライブカメラのサイズも大きくすればより精度があがるはずだけど、もちろんその分の処理速度が…という問題があった。CPUがもっともっと速ければ充分な速度を得られるとは思うし、そもそもFlashである必要性はそんなに無かったとFlashで作ってから気づいたけど時すでに遅しという。