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, 逾期不再接受補交! 請見諒 :)
星期二, 5月 31, 2011
星期二, 5月 24, 2011
Week 15: 期末專案發想
星期四, 5月 12, 2011
Week 14: 如何在視訊擷取視窗放入圖片?
1. 如何在 RGB video format 的視訊擷取視窗中加入圖片
a. 宣告一個三維陣列, 用來預先儲存圖片的 RGB 色彩資料。
unsigned char ucSpottedGecko[125][155][3];
b. 將圖片的 RGB 色彩資料讀入到三維陣列之中。
c. 在 預覽回呼函數 中, 將圖片陣列資料放進到視訊擷取視窗的緩衝區記憶體中。
2. 如何在 YUY2 video format 的視訊擷取視窗中加入圖片
範例程式: W14-SP
3. 請同學思考下列問題:
視訊擷取視窗中的影像物件, 如何修改範例程式,
a. 讓視訊擷取視窗中的影像物件的背景去掉
b. 讓影像物件在視訊視窗中移動
c. 讓包含多張圖片的動畫檔 (GIF) 顯示在視訊擷取視窗中
a. 宣告一個三維陣列, 用來預先儲存圖片的 RGB 色彩資料。
unsigned char ucSpottedGecko[125][155][3];
b. 將圖片的 RGB 色彩資料讀入到三維陣列之中。
c. 在 預覽回呼函數 中, 將圖片陣列資料放進到視訊擷取視窗的緩衝區記憶體中。
2. 如何在 YUY2 video format 的視訊擷取視窗中加入圖片
範例程式: W14-SP
3. 請同學思考下列問題:
視訊擷取視窗中的影像物件, 如何修改範例程式,
a. 讓視訊擷取視窗中的影像物件的背景去掉
b. 讓影像物件在視訊視窗中移動
c. 讓包含多張圖片的動畫檔 (GIF) 顯示在視訊擷取視窗中
星期三, 5月 04, 2011
Week 13: 視訊格式 Video Format
上個星期 (Week 12) 的課程內容介紹到如何存取視訊擷取視窗的緩衝區記憶體中的色彩資料, 但由於有一些同學的視訊裝置只提供 YUY2 的視訊格式, 因此執行範例程式 W12-SP 時, 就卡住了。為了解決這個問題, 這個星期, 我們就來討論: 什麼是視訊格式(Video Format)? YUY2 又是什麼?
1. 什麼是視訊格式(Video Format)?
所謂的視訊格式, 其實指的就是視訊裝置所拍攝到的畫面(frame), 傳送近電腦歡緩衝區記憶體的資料流(串流) 的格式。最簡單的格式就是如下圖所示的 RGB 24, 其所代表的意義就是每個像素分別各用 8 個 bits 傳送紅 R、綠 G、藍 B 的色彩值, 一共需要 24 位元, 圖素(像素, pixel)位元深度為 24。
下圖的畫面解析度設定為 320 * 240, 共有 76800 個像素, 每個像素需要 24 bits / 8 bites = 3 Bytes, 因此共需 76800 * 3 = 230400 Bytes 的緩衝區記憶體來儲存一個畫面的色彩資料。
既然傳送的畫面資料本身是色彩值, 就可以有不同的色彩表示方法 (色彩模型, 色彩空間) 來表示一個顏色。RGB 是一種色彩表示方法, YUV 色彩模型 則是另一種常見的選擇。
RGB 與 YUV 兩種色彩空間的轉換方法, 如下:
在撰寫 RGB 與 YUV 兩種色彩空間的轉換程式時, 必須特別注意以下兩件事:
a. 由於 U、V 色彩值可能為負數的情況, 為了儲存到 BYTE 的資料型態的記憶體中, 在儲存之前都會加上 128, 使之成為正數後再存放到記憶體中。
b. 在電腦中 R、G、B 色彩值是用 BYTE 的正整數資料型態儲存, 適用可能範圍為 0 - 255, 然而, Y、U、V 經過轉換公式轉回 R、G、B 色彩值時, 卻有可能超出 0 - 255 之容許範圍, 所以, 存入前, 必須經過判斷後, 再放進記憶體, 以確保正確。
2. YUY2 視訊格式
原本的 YUV 色彩空間每個像素依然需要 3 個位元組的記憶體空間來儲存色彩值, 為了更進一步節省傳輸及記憶體空間, YUY2 視訊格式便依照 "相鄰像素之色彩(UV)也會相近" 的特色, 讓 相鄰的兩個成對像素共用一組 U, V 色彩值, 所以視訊裝置傳送到緩衝區記憶體的色彩值便依序為
YUYVYUYVYUYVYUYVYUYVYUYV...
因此, 在撰寫 YUY2 的視訊處理程式時, 便要特別注意, 每次必須同時處理兩個像素, 一共 4 個 bytes。
3. 使用整數資料形態運算完成 RGB 與 YUV 色彩模型之轉換:
MSDN: Converting Between YUV and RGB
4. www.FOURCC.org - for video codec and pixel format information.
FOURCC 關於 YUV 與 RGB 的解釋比 維基百科上的資料有用多了! 這邊的討論觸及了格式與視訊標準, 對於程式開發來說, 確實比較有幫助。
範例程式: W13-SP
星期二, 5月 03, 2011
Week 12: 如何在視訊擷取視窗中添加物件?
1. Real Life Super Mario Bros
2. KOF98 真人版
3. 請同學思考上述影片的製作過程
4. 如果想要直接在視訊擷取視窗中直接加入下圖的物件, 該如何做?
抹香鯨和藍鯨不是加上去的, 攝影機拍的,是準備對戰的兩位主角喔!
6. 同學可以思考如何修改範例程式, 可以讓計時器開始倒數...
範例程式 : W12-SP
2. KOF98 真人版
3. 請同學思考上述影片的製作過程
4. 如果想要直接在視訊擷取視窗中直接加入下圖的物件, 該如何做?
抹香鯨和藍鯨不是加上去的, 攝影機拍的,是準備對戰的兩位主角喔!
6. 同學可以思考如何修改範例程式, 可以讓計時器開始倒數...
範例程式 : W12-SP
訂閱:
文章 (Atom)