as3でWebカメラ画像の2値化(白黒化)

4月 11th, 2008 admin Posted in Flash, 今日のコード | コメントは受け付けていません。

白黒の顔写真を取り込みたかっただけなんだけど、思ってたより1ピクセルが大きくてギザギザになった。
これをスムーズにする方法があるんだろうか。
このWebカメラは100万画素ぐらいあるはずなんだけど、取り込み用のそういうのはどこかで設定できるんだろうな。
今日はもう遅いのでまた明日調べよう

成果物

しみやそばかすを自動で消してくれるフォトレタッチソフト(落書きっぽいのは後付です)
flash2.jpg
サンプルはこちら(画面をクリックで白黒画像がとれます)

コード

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.media.Camera;
	import flash.media.Video;
	import flash.text.TextField;

	public class Main extends flash.display.Sprite
	{
		private var camera_width:int = 200;
		private var camera_height:int = 150;
		private var video:Video = new Video(camera_width, camera_height);
		private var tfView:TextField;

		public function Main():void
		{

			tfView = addTextField(220, 0, 200, 150);
			tfView.appendText("start\n");
			var camera:Camera = Camera.getCamera();
			if (camera == null) {
				//error
				return;
			}
			video.attachCamera(camera);
			addChild(video);
			stage.addEventListener(MouseEvent.CLICK, onClick);
		}

		private function onClick(event:MouseEvent):void {
			tfView.appendText("click!\n");
			var s:BitmapData = new BitmapData(camera_width, camera_height)
			s.draw(video);

			var d:BitmapData = new BitmapData(camera_width, camera_height) 

			var r:Rectangle = new Rectangle(0, 0, camera_width, camera_height);
			d.fillRect(r, 0xFFFFFFFF);

			d.threshold(s, r, new Point(0, 0), "<=", 90, 0xFF000000, 255, false);

			var img:Bitmap = new Bitmap(d);
			addChild(img);
			img.x = 0;
			img.y =  160;
		}

		private function addTextField(x:Number, y:Number, w:Number, h:Number):TextField {
			var textField:TextField;
			textField = new TextField();
            addChild(textField);
            textField.x         = x;
            textField.y         = y;
            textField.width     = w;
            textField.height    = h;
            textField.text      ="";
            textField.selectable=true;
            textField.border    =true;

			return textField;
		}
	}
}

まとめ

BitmapDataにthresholdっていうすべてのピクセルを特定の条件で色を変えるっていうずばりそのもののコードがあったのでできた。そしてずばりそのもののコードが載っているサイトがあったのでできた。Webカメラから取り込んでいるというところだけがオリジナル。Webすごい

参考サイト

Flash Player 9/ActionScript3.0/Flex2の勉強日記

BitmapData – ActionScript 3.0 コンポーネントリファレンスガイド


trick7.com blog: BIT-101 : BitmapData Threshold Explorer

Comments are closed.