2007年8月29日星期三

Webcam 偵測畫面改變

以前照著官網的教學,寫過 Webcam 畫面改變的偵測效果:



這次改成 Flash CS3 版,藉由 CS3 的錯誤訊息,我做了部份調整:

1. setInterval() 改用 Timer
2. Video 除了有 width, height 之外,還有 videoWidth, videoHeight
3. createEmptyMovieClip() 改用 new MovieClip(),attachMovie() 改用 addChild()
4. BitmapData.draw(IBitmapDrawable),Video 是 IBitmapDrawable(DisplayObject 是),但是 BitmapData 不是 IBitmapDrawable,所以必須將 BitmapData 先包裝成 Bitmap
5. flash.display.BlendMode 現在有常數可用
6. BitmapData.rectangle 變成 BitmapData.rect

原始檔如下:

var timer:Timer = new Timer(300);
function onTimer(evt:TimerEvent):void{
//trace("onTimer");
snapshot();
}
timer.addEventListener(TimerEvent.TIMER, onTimer);

//var myVideo:Video;
var camera:Camera = Camera.getCamera();
if(camera!=null){
myVideo.attachCamera(camera);

timer.start();
}

var m1_mc:MovieClip = new MovieClip();
addChild(m1_mc);
m1_mc.x = myVideo.x + myVideo.width;
m1_mc.y = myVideo.y;

var m2_mc:MovieClip = new MovieClip();
addChild(m2_mc);
m2_mc.x = myVideo.x + myVideo.width;
m2_mc.y = myVideo.y + myVideo.height;

var snapshot_now:BitmapData;
var snapshot_old:BitmapData;
var snapshot_tmp:BitmapData;
var snapshot_tmp2:BitmapData;

function snapshot(){
//trace("snapshot, IBitmapDrawable=" + (myVideo is IBitmapDrawable));

//建立攝影機的BitmapData
snapshot_now = new BitmapData(myVideo.width, myVideo.height);
snapshot_now.draw(myVideo, new Matrix(myVideo.width / myVideo.videoWidth, 0, 0, myVideo.height / myVideo.videoHeight, 0, 0));

//複製一份,在這份上,繪製舊的BitmapData,以blendMode=difference來繪製
snapshot_tmp = snapshot_now.clone();
//trace("snapshot_old, IBitmapDrawable=" + (snapshot_old is IBitmapDrawable));
snapshot_tmp.draw(new Bitmap(snapshot_old), new Matrix(), null, flash.display.BlendMode.DIFFERENCE);
//貼到MC
m1_mc.addChild(new Bitmap(snapshot_tmp));

//將大於0xFF111111的部分轉成0xFF00FF00
snapshot_tmp2 = snapshot_tmp.clone();
snapshot_tmp2.threshold(snapshot_tmp2, snapshot_tmp2.rect, snapshot_tmp2.rect.topLeft, ">", 0xFF111111, 0xFF00FF00, 0xFFFFFFFF, false);
//貼到MC
m2_mc.addChild(new Bitmap(snapshot_tmp2));

//紀錄舊的BitmapData
snapshot_old = snapshot_now.clone();
snapshot_now.dispose();
}

6 意見:

mediakid 提到...

邦大~ Video的部份註解掉了耶
var myVideo:Video = new Video();

Ben Chang 提到...

在場景上放一個 video,instance name 用 "myVideo"

rob 提到...

你好:

想請問一下,
我嘗試複製您的範例做了一遍,
但不知道為何,填上綠色的部分,
卻是原本黑色的部分呢?
懇請解惑~

Ben Chang 提到...

抱歉,不清楚你遇到的問題

rob 提到...

抱歉,之前說的不清楚,
我的問題是,做出來會變成這個畫面:
http://phpsrv.nutn.edu.tw/~nutnrob/temp/error.jpg
就是想讓移動的手部填成綠色,
卻是相反的填到外圍的地方

Ben Chang 提到...

我剛直接剪貼我的程式碼到一個新的 fla 的 frame 1 上,並放一個 Video 取名叫作 myVideo 在場景上,輸出、完成,沒甚麼問題ㄟ~

想必是你一字一字 key 程式碼的時候出了甚麼差錯?!看看需不需要一字一字的檢查一遍!