« 2010年2月 | トップページ

2010年3月

actionscriptで画像処理

最近自分の周りで、画像処理ニーズが高まってきたので、画像処理を勉強しようと思ってます!



どの言語で画像処理をしようか悩んでいましたが、ハードルが低そうなactionscript3.0で試してみることにしました。



とりあえず、サンプルコードを調べて動かしたところ、Webカメラの画像をリアルタイムで表示しながら、色認識をするアプリができました。いやー、簡単ですね。



自分は、下記コードをASファイルで作成して、これをFlashドキュメントと同じ階層に保存しました。



後はドキュメントクラスの設定を、fla上でプロパティを表示し、ステージ外をクリック、そうするとプロパティにドキュメントクラスを設定するボックスが表示され、そこにASファイルと同名のクラス名を入力するという手順で設定しました。



以下、コードです。

1ピクセルごとのRGB値を取得して、HSV色空間に変換して、Hの値が0~30の値を肌色として、認識しています。

環境にもよりますが、ぼちぼちの認識率ですね。色々と改善してみます!



package {
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.media.Camera;
  import flash.media.Video;

  [SWF(backgroundColor=0xFFFFFF, frameRate=1)] // フレームレートを下げておく
  public class ColorProcessing extends Sprite
  {
    public function ColorProcessing()
    {
    var camera:Camera = Camera.getCamera();

      var video:Video = new Video(camera.width, camera.height);
      video.attachCamera(camera);

      var bitmapData:BitmapData = new BitmapData(
                                            camera.width, camera.height);

            

        addChild(new Bitmap(bitmapData));

          addEventListener(Event.ENTER_FRAME, function(e:Event):void {
            bitmapData.draw(video);

            for (var x:int = 0; x < bitmapData.width; x++) {
              for (var y:int = 0; y < bitmapData.height; y++) {
                var rgb:uint = bitmapData.getPixel(x, y);
                var r:int = (rgb & 0xff0000)/0x10000;
                var g:int = (rgb & 0x00ff00)/0x100;
                var b:int = (rgb & 0x0000ff);

                var R:Number  = r/255;
                var G:Number  = g/255;
                var B:Number  = b/255;

                var max:Number  = Math.max(R,G,B);
                var min:Number  = Math.min(R,G,B);

                var H:Number ;
                var S:Number ;
                var V:Number  = max;

                var Cr:Number ;
                var Cg:Number ;
                var Cb:Number ;

                if(V==0){
                    H = max;
                  S = max;
                }
                else{
                  S = (max-min)/max;
                  Cr = (max-R)/(max-min);
                  Cg = (max-G)/(max-min);
                  Cb = (max-B)/(max-min);
                  if(max==R){
                    H = Cb-Cg;
                  }
                  else if(max==G){
                    H = 2+Cr-Cb;
                  }
                  else{
                    H = 4+Cg-Cr;
                  }
                  H = H*60;
                  if(H<0){
                    H = H+360;
                  }
                }
                if ((H > 9)&&(H < 26)) { // 白い部分を赤く塗りつぶす。
//                  bitmapData.setPixel(x, y, 0xFF0000);
                }
                else if ((H > 0)&&(H <= 9)) { // 白い部分を緑に塗りつぶす。
//                  bitmapData.setPixel(x, y, 0x00FF00);
                }
                else if ((H >= 26)&&(H < 30)) { // 白い部分を青に塗りつぶす。
//                  bitmapData.setPixel(x, y, 0x0000FF);
                }
                else{
                  bitmapData.setPixel(x, y, 0xFFFFFF);
                }
              }
                trace(H, S, V);
          }
      });
    }
  }
}

| | コメント (21) | トラックバック (0)

« 2010年2月 | トップページ