作業ログ/2007-01-22

Last-modified: 2007-01-22 (月) 17:46:11

flash でカメラ遊び

  • 以前、授業の関係でFlash8を使ったことがあったので、研究のモチベーションも下がってることだし思いっきり遊んでみた。
    ブラウザでカメラが動いてるのは、予想以上に面白い。
  • 次はこれをビットマップに変換して、画像処理。なにするかなー。顔検出なんかたぶん重すぎるよねー。
    とりあえず和製マイノリティーキューブ作ってみるか。
  • Flashファイル(拡張子.fla)の可読性が低いことが気になる。なんていうか、いろんなところにコードが書ける(オブジェクトにコードを埋め込めたりする)のが逆に気持ち悪い。


以下、flash/カメラからの入力画像を表示するのページ


what

  • Flash8からローカルのPCカメラが読み込めるようになったらしい。
    • Flashなんて使ったことないから、細かいことはわかんない。
    • ActionScriptも、そんなに勉強したくない。
    • でもブラウザでカメラが動くとなんとなく面白そうだ。
    • やってみようかー。
  • できました。
  • とにかく↓のページが神すぎる!これ真似してたらなんとなくできます。
    SSAW06 » Flash ActionScript2.0 実践講座6:ビデオ映像を扱う
  • 解像度と表示サイズをGUIから変更できるようにしてみた。Flashはこういうことに関してはすごい楽だなと思う。コンボボックスなんて初めて使ったよ...


ScreenShot

20070122-1.JPG


Demo

こちらです(カメラ必須)


Downloads

hako001.lzh (hako001.fla + VideoCapture.as)


Codes

filehako001.fla.txt
//?\ヲ??E?C???h?E?????lash????g??????
Stage.scaleMode = "showAll";
// 100%?\ヲ	--- noScale
// ????\ヲ	--- showAll
// ?O?????????g??--- noBorder
// ???E??t?B?b?g	--- exactFit

//?L???v?`???N???X??C???X?^???X????
var vc:VideoCapture = new VideoCapture(this, myVideo);
init();

// ============================================================
//????UI?????R?[?h
// ============================================================


// ============================================================
//GUI???????C?x???g??o?^
// ============================================================
myComboBox_resolution.addEventListener("change", setResolution);
myComboBox_displaySize.addEventListener("change", setVideoSize);


//-------------------------------------------------------------
//?J?????x????s??????B
//-------------------------------------------------------------
function init() {
	//?J????R???{?{?b?N?X??I???
	myComboBox_resolution.selectedIndex = 3;	// 3 => 320 x 240
	//????x??\ヲ?T?C?Y????
	setResolution();
	setVideoSize();
	//?J???????O?????\ヲ
	myLabel_CameraName.text = '?J???????O : ' + vc.camera.name;
}


//-------------------------------------------------------------
//?t???[??????s?????
//-------------------------------------------------------------
onEnterFrame = function() {
	//?p?????[?^??X?V???
	PutCameraParameter();
};


//-------------------------------------------------------------
//?p?????[?^??X?V???
//-------------------------------------------------------------
function PutCameraParameter() {
	myLabel_fps.text = 'fps : ' + vc.camera.currentFps;
	myLabel_activityLevel.text =
		'?J????????????[?V??????: ' + vc.camera.activityLevel;
}


//-------------------------------------------------------------
//????x???X???
//-------------------------------------------------------------
function setResolution() {
	var capture_size_x, capture_size_y;
	switch( myComboBox_resolution.text ) {
		case '40 x 30':
			capture_size_x = 40;
			capture_size_y = 30;
		break;
		case '80 x 60':
			capture_size_x = 80;
			capture_size_y = 60;
		break;
		case '160 x 120':
			capture_size_x = 160;
			capture_size_y = 120;
		break;
		case '320 x 240':
			capture_size_x = 320;
			capture_size_y = 240;
		break;
		case '640 x 480':
			capture_size_x = 640;
			capture_size_y = 480;
		break;
		case '1280 x 960':
			capture_size_x = 1280;
			capture_size_y = 960;
		break;
		default:	//?Y????????????????20 x 240
			capture_size_x = 320;
			capture_size_y = 240;
		break;
	}
	//????x??X??K?p???
	vc.camera.setMode(capture_size_x, capture_size_y, 30);
	//?e?L?X?g???????
	myLabel_resolution.text =
		'?J?????????x : ' + vc.camera.width + " x " + vc.camera.height;
}


//-------------------------------------------------------------
//?\ヲ?T?C?Y???X???
//-------------------------------------------------------------
function setVideoSize() {
	var display_size_x, display_size_y;
	switch( myComboBox_displaySize.text ) {
		case 'small':
			display_size_x = 320;
			display_size_y = 240;
		break;
		case 'medium':
			display_size_x = 640;
			display_size_y = 480;
		break;
		case 'large':
			display_size_x = 1280;
			display_size_y = 960;
		break;
		default:	//?Y?????????????????
			display_size_x = Stage.width;
			display_size_y = Stage.height-100;
		break;
	}
	//??X??K?p???
	vc.setVideoSize(vc.video,Stage.width/2 - display_size_x/2,
					(Stage.height-100)/2 - display_size_y/2,
					display_size_x, display_size_y);
	//?e?L?X?g???????
	myLabel_displaySize.text = '?\ヲ?T?C?Y : ' + myComboBox_displaySize.text;
}


fileVideoCapture.as.txt

class VideoCapture {
	private var target_mc:MovieClip;	//ゥ?g??^?[?Q?b?g?p?X
	public var video:Video;					//?r?f?I?I?u?W?F?N?g????
	public var camera:Camera;			//????????J??????I?u?W?F?N?g
	
	public function VideoCapture(target:MovieClip, _video:Video) {
		//?n????????i?[
		target_mc = target;
		video = _video;
		//?r?f?I?J?????????@????????_?C?A???O??\ヲ
		System.showSettings(3);
		//?r?f?I??L???v?`???J?
		captureVideo();
	}
	
	private function captureVideo() {
		//?J??????amera????
		camera = Camera.get();
		//?r?f?I?I?u?W?F?N?g??J??????f????\??t???
		video.attachVideo(camera);
		//?r?f?I?I?u?W?F?N?g???u????????
		//???????L???v?`?????T?C?Y??\ヲ????
		setVideoSize(video, 0, 0, camera.width, camera.height);
		//Camera ??activity  ??motionLevel ???????A
		//??????????????????
		camera.onActivity = function(isActive:Boolean) {  }
	}
	
	//?r?f?I?I?u?W?F?N?g???u??????????
	public function setVideoSize(arg_video, arg_x, arg_y, arg_width, arg_height) {
		arg_video._x = arg_x;
		arg_video._y = arg_y;
		arg_video._width = arg_width;
		arg_video._height = arg_height;
	}
}