星期二, 5月 25, 2010

Week 14: 期末專案發想

本週的討論主題是期末專案發想。

第一節課請同學欣賞本課程歷年修課同學的作品。

 a) 2009 作品集

 b) 2008 作品集

 c) 2007 作品集

第二節課請同學從過去的作品中挑出一個你最喜歡的作品, 寫在 作業部落格 中, 我們將在課堂上與你深入討論相關技術。

第三節課請同學開始發想期末專案, 並將構想寫到 作業部落格 中。
 
其他相關資料:

 a) Sony PS EyeToy:

  

  
 
  

 b) Apple's App.

  
 

星期二, 5月 18, 2010

Note: 繳交期末專案企劃構想

本學期相關技術的探討已經接近完成, 接下來同學們要開始構思期末專案, 請於下星期上課前, 繳交約 140 個字的原始構想到 作業部落格 中, 以利我們下週在課堂上開放討論。

星期一, 5月 17, 2010

Week 13: 如何透過視訊與虛擬物件互動

繼上週討論如何使用回呼函數來進行視訊監控後, 本週所要討論的主題就是如何透過視訊與虛擬物件互動。

這邊提到的虛擬物件, 指的就是透過第九週所學會的技巧 (如何在視訊擷取視窗中添加物件), 我們在視訊擷取視窗中所添加的虛擬物件。

首先, 我們要準備要和我們互動的虛擬物件, 本週我打算使用 facebook 上的小遊戲 Zoo World 中的畫的非常可愛的小動物們。
 
   
 
我利用 Photoshop 將斑點壁虎裁剪下來, 並將白色背景修改成純白色(255, 255, 255), 並存成 SpottedGecko.bmp 檔, 如下圖:
 
     

將背景色設成純白色的好處有二:

 1) 如果我們要將圖片顯示在 Form 上, 只要將影像物件的屬性 Transparent 設成 true, 這樣子在程式執行時, 背景色就不會被顯示出來。

   

 下圖就是程式執行時, 影像 SpottedGecko.bmp 白色的背景並不會顯示出來...
  
   

 2) 當我們要將 SpottedGecko.bmp 的影像放進視訊擷取視窗時, 我們就可以使用 if 判斷指令, 當色彩不等於為純白色 (255, 255, 255) 時, 我們才去修改緩衝區記憶體中的資料。
 
假設, 我們要將 SpottedGecko.bmp 這張影像放到視訊擷取視窗的 ( iObjectTop, iObjectLeft ) 位置上, 影像的高、寬, 分別為 iObjectHeight, iObjectWidth。

因此, 視訊擷取視窗的座標範圍在 ( iObjectTop, iObjectLeft, iObjectTop+iObjectHeight, iObjectLeft+iObjectWidth) 這個矩形範圍中時, 擷取視窗的視訊資料通通都要改成 SpottedGecko.bmp 影像色彩資料。

範例程式 VGC-2010S-SP15.txt

   
 
既然, 我們已經把虛擬的斑點壁虎放到視訊擷取視窗中, 接下來要考慮的問題就是如何透過網路攝影機來互動呢 ?

最簡單的一種互動方式就是當有人碰觸到虛擬物件時, 虛擬物件就消失不見!

首先, 我們用一個布林變數 bool bObjectOnFrame 來表示虛擬物件該不該出現在視訊擷取視窗中。在回呼函數中, 我們是否要去修改緩衝區記憶體中的視訊畫面資料, 完全取決於 bObjectOnFrame 的值是 true? 還是 false ?

因此, 在範例程式 VGC-2010S-SP15.txt 中, 我們只要簡單地在修改緩衝區記憶體之前加入關於 bObjectOnFrame 的判斷式即可。另外, 我們新增一個按鈕, 來手動修改 bObjectOnFrame 的值, 讓虛擬物件消失, 或是重現。

範例程式 VGC-2010S-SP16.txt

接下來, 當我們發現有人碰觸到虛擬物件, 只要將 bObjectOnFrame 設定為 false, 便可以讓虛擬物件在下一個畫面中消失。

  

為了消除雜訊的干擾, 在上星期的課程中, 我們將視訊監控以 8*8 大小的區塊為單位, 當區塊中的白點總數超過一半 (>31) 時, 整個區塊都輸出成白色區塊, 如下圖。 

  

從 另外一種角度思考, 其實就是把整個畫面縮小成 40*30 的大小來監控, 這樣那些小雜訊就縮小到完全沒有影響了, 如下圖。

  

同樣的道理, 視訊擷取視窗應該也要縮小成 40*30 大小來考慮如何互動才對...

  
 
為了方便同學思考, 我們將上面的縮圖放大,

  

原先, 虛擬斑點壁虎出現在視訊擷取視窗的座標範圍是 ( iObjectTop, iObjectLeft, iObjectTop+iObjectHeight, iObjectLeft+iObjectWidth), 此時, 我們要重新換算為在縮圖中的座標範圍。我們用 (iBlockTop1, iBlockLeft1) 來表示虛擬斑點壁虎在縮圖中的左上角座標, 另外用 (iBlockTop2, iBlockLeft2) 來表示虛擬斑點壁虎在縮圖中的右下角座標。

 iBlockTop1 = iObjectTop / 8;
 iBlockLeft1 = iObjectLeft / 8;
 iBlockTop2 = (iObjectTop + iObjectHeight) / 8;
 iBlockLeft2 = (iObjectLeft + iObjectWidth) / 8;
 
因此, 當有某一區塊 (m,n) 落在 (iBlockTop1, iBlockLeft1) 與 (iBlockTop2, iBlockLeft2) 所圍起來的矩形之中時, 便表示要將 bObjectOnFrame 這個變數設定為 false, 這樣, 虛擬物件就會從下一個畫面中消失, 達到我們所要進行的互動效果。


範例程式 VGC-2010S-SP17.txt
 

 

星期二, 5月 11, 2010

Week 12: 如何使用回呼函數進行視訊監控?

本週的課程主題是: 如何使用回呼函數(callback function) 來進行視訊監控 ?

在上週我們的討論主題是如何使用 callback function 來建立一張背景影像?

第六週的課程 中, 我們曾討論: 如何看待兩張影像之間的差別? 如果我們把背景影像當作第一張影像, 而回呼函數中, 緩衝區記憶體的影像當做第二張影像, 這樣我們就可以去計算這兩張影像的差別。

最後, 我們透過第八週的實驗: 將視訊擷取視窗的內容即時顯示於影像物件之中, 所學到的技術, 將計算出來的差別影像, 顯示在影像物件之中。

範例程式 VGC-2010S-SP13.txt


 
為了消除雜訊的干擾, 我們將視訊監控以 8*8 大小的區塊為單位, 當區塊中的白點總數超過一半 (>31) 時, 整個區塊都輸出成白色區塊, 如下圖。

範例程式 VGC-2010S-SP14.txt 
 

 

星期二, 5月 04, 2010

Week 11: 如何建立背景影像?

今天的課程主題是如何利用 callback function 建立背景影像?

首先, 我們先補充關於如何取背景圖的理論。

在攝影機不動的情況下拍攝靜物, 照理說, 連續兩個畫面(frame)應該是完全一樣的; 然而, 寫程式分析, 卻發現兩張畫面看起來一樣, 實際上卻有稍稍不同, 色彩值因為光線變化 (也許是因為光源閃爍, 或是空氣中的灰塵影響。), 讓不同畫面中, 相同位置的色彩值產生細微的不同。

假設在沒有雜訊的情況下, 我們所拍攝到的色彩值是 F(i,j)
第 k 個畫面的位置 (i,j) 上, 雜訊的函數為 Xk(i,j),

假設我們所擷取到的色彩值為 Fk(i,j),
因此,

Fk(i,j) = F(i,j) + Xk(i,j)

如果我們取連續 30 個畫面色彩值之總和,

F1(i,j) + F2(i,j) + ... + F30(i,j)
= [F(i,j) + X1(i,j)] + [F(i,j) + X2(i,j)] + ... + [F(i,j) + X30(i,j)]
= 30 F(i,j) + [ X1(i,j) + X2(i,j) + ... + X30(i,j) ]

如果雜訊的平均值是 0, 即

X1(i,j) + X2(i,j) + ... + X30(i,j) = 0 

再將上述式子除以 30 求平均, 那麼我們就可以得到 F(i,j)。


範例程式 VGC-2010S-SP12.txt

下列兩張圖中, 上圖是取像自單張影像, 下圖則是 30 張影像的平均影像。

很明顯地, 上圖的雜訊較多, 下圖則是平滑多了!