星期二, 5月 31, 2011

Week 16: 背景影像的建立

1. 如何利用 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)。

下列兩張圖中, 上圖是取像自單張影像, 下圖則是 30 張影像的平均影像。很明顯地, 上圖的雜訊較多, 下圖則是平滑多了!



2. 如何控制物件是否要出現在視訊擷取視窗之中

首先, 宣告一個布林變數 bool bObjectOnFrame; 來表示虛擬物件該不該出現在視訊擷取視窗中。接著, 在回呼函數中, 我們是否要去修改緩衝區記憶體中的視訊畫面資料, 完全取決於 bObjectOnFrame 的值是 true? 還是 false ? 因此, 在範例程式 W14-SP 中, 我們只要簡單地在修改緩衝區記憶體之前加入關於 bObjectOnFrame 的判斷式即可。另外, 我們新增一個按鈕, 來手動修改 bObjectOnFrame 的值, 讓虛擬物件消失, 或是重現。

範例程式 W16-SP

3. 所有作業的截止期限為 2011/06/06, 逾期不再接受補交! 請見諒 :)

沒有留言: