1. 什麼是回呼函數(callback function)?
a. 函數的呼叫(call)與回覆(return)
在程式的執行過程中, 當主程式呼叫一個函數 (call function) 時, 程式會跳到函數繼續執行, 當遇到 return 指令時, 就會返回主程式的呼叫點繼續執行。
b. Callback Function = Call + Back + Function
當我們執行某個應用程式時, 針對 Form 上各個物件所發生的事件, 嚴格來說可以分成兩類:
(1) 由使用者觸發, 如使用者透過滑鼠或鍵盤所觸發的事件。
這類事件, 在 object-oriented 程式語言中, 是用 event-driven 的設計, 使用者針對個別物件, 撰寫不同事件處理程序來因應。
(2) 非由使用者觸發, 乃系統自行發生的事件。
如程式發生錯誤情況, 或系統做了特定事件, 如從視訊裝置擷取一個畫面。此類事件, 使用者就可以設定 callback function 來因應這些事件的發生。
2. 預覽回呼函數 preview callback function
當視訊擷取驅動程式接收到來自視訊裝置的畫面(frame), 在 preview 模式之下, 會將此畫面顯示在所連結的視訊視窗之中。
我們可以透過 capSetCallbackOnFrame 這個函數來指定當發生 frame preview 之前, 先執行一個特定的 callback function, 即預覽回呼函數。這個預覽回呼函數的名稱可以由我們自由命名, 但是傳入的參數個數與其資料型態則必須符合 VFW 的規定。
// 使用者自行寫的預覽回呼函數必須在公用變數宣告區宣告
LRESULT CALLBACK FrameCallBack( HWND hwndCapture, PVIDEOHDR lpvhdr );
// 設定 callback function 與視訊擷取視窗之間的連結,
// 請將此行放到開啟視訊擷取視窗, 並開始 preview 的指令後
capSetCallbackOnFrame(hwndCapture, &FrameCallBack);
3. 如何關閉預覽回呼函數?
capSetCallbackOnFrame(hwndVideo, NULL);
4. VFW 函式介紹:
a. 取得視訊畫面基本資料 (capGetVideoFormat)
b. BITMAPINFO structure
c. BITMAPINFOHEADER structure
5. 範例程式 Webcam Programming (4): 預覽回呼函數
範例程式 Webcam Programming (4) 主要分成五個部分:
part A: 預覽回呼函數之設定與關閉
part B: 預覽回呼函數與視訊資料表頭結構
part C: 透過預覽回呼函數將預覽畫面變成灰階畫面
part D: 透過預覽回呼函數在視訊畫面中填入單一顏色的長方塊
part E: 透過預覽回呼函數將圖片置入視訊擷取視窗之中
part A: 預覽回呼函數之設定與關閉
本部分的主要目的是讓同學了解視訊擷取視窗之預覽回呼函數的設定與使用方法。要設定預覽回呼函數, 是透過 capSetCallbackOnFrame 函式完成的, 函式的輸入參數有二, 視訊擷取視窗的代碼(handle)與所設定預覽回呼函數之位址。當程式開啟視訊擷取視窗後, 顯示預覽的畫面總數到 TLabel 元件上。
首先, 我們在 Mainmenu 元件之中新增 Preview Callback Function 的功能列, 用來切換不同功能的預覽回呼函數及關閉預覽回呼函數(Off)。圖 4-A-1 的功能列分別就是範例程式 Webcam Programming (4) 的 A(Frame Counter)、C(Gray Mode)、D(Object)、E(Object)等四個部分。
圖 4-A-1
在圖 4-A-2 之中, 可以看到在視訊擷取視窗的右邊, 放置了一個目前 Caption 設定為 FC 的 TLabel 元件。在程式執行的過程中, 本元件將負責顯示目前已顯示的畫面總數。
圖 4-A-2
part B : 預覽回呼函數與視訊資料表頭結構
圖 4-B-3
圖 4-B-4
part C : 透過預覽回呼函數將預覽畫面變成灰階畫面
part C 的目的是讓同學有能力存取視訊擷取視窗的緩衝區記憶體中的畫面資料。
圖 4-B-5
延伸想法: 可以將視訊畫面變成特定色調嗎?
請參考 影像處理課程 的 作業三。當然也可以透過 ColorDialog 讓使用者選定顏色後, 計算出所選定顏色的 YUV 値, 再將 UV 値放進 YUY2 攝影機的緩衝區記憶體, 就大功告成了!
補充資料: RGB pixel formats
沒有留言:
張貼留言