星期二, 2月 28, 2012

Week 5: Webcam Programming (2)

1. VFW 函式介紹:

 a. 調整視訊畫面大小 ( capPreviewScale )

 b. 取得視訊裝置驅動程式的效能 ( capDriverGetCaps )

 c. 視訊參數對話盒 ( Video Dialog Box )

   (1) 視訊來源對話盒 ( capDlgVideoSource )
   (2) 視訊格式對話盒 ( capDlgVideoFormat )
   (3) 視訊顯示對話盒 ( capDlgVideoDisplay )
   (4) 視訊壓縮對話盒 ( capDlgVideoCompression )

2. 範例程式 Webcam Programming (1) 分成 3 個部分:
part A - 取得視訊裝置驅動程式的相關資訊
part B - 將網路攝影機所擷取到的畫面放到視訊擷取視窗顯示出來
part C - 更改視訊擷取視窗的大小

本週我們將介紹 Part C 的部分:

part C - 更改視訊擷取視窗的大小


圖 1-B-7

上圖是範例程式 Webcam Programming (1) Part B 的執行結果, 視訊結取視窗動態地顯示了網路攝影機所拍攝的畫面。

上週課程結束前, 我們讓同學思考一個問題, 就是將的視訊擷取視窗的大小改成 640*480, pnlCaptureWindow 的 width 改成 650, Height 改成 490, 執行後的畫面如下圖。


圖 1-C-1

你知道發生什麼事嗎?

提示: 比較圖 1-B-7 與圖 1-C-1 兩張圖片的拍攝內容!

比較兩張圖片的內容後, 發現圖 1-B-7 的內容為圖 1-C-1 內容的左上角 1/4 的圖片內容。

因此, 攝影機所拍攝的畫面大小如果比所建立的視訊擷取視窗還要大, 就會只有顯示左上角的部分, 並不會完整顯示所拍攝的畫面內容。


圖 1-C-2

圖 1-C-2 是網路攝影機與所拍攝物品的位置圖, 從攝影機所瞄準的角度觀察, 木雕鳥確實不是攝影機所瞄準的, 圖 1-B-7 畫面所呈現的, 木雕鳥位於畫面的正中央其實是只顯示左上角 1/4 所呈現的錯覺。

VFW 提供了一個函式 capPreviewScale , 可以解決攝影機畫面大小與視訊擷取視窗大小不相同的問題。除此, 搭配 Win32 API 的 MoveWindow 函式來調整視訊擷取視窗的大小, 就可以依照需求隨時調整視訊擷取視窗的大小, 畫面也會依照視窗大小隨著縮放, 而不會只顯示部分拍攝畫面。

首先, 在 Webcam 功能表中新增 Preview Scale 的功能, 然後新增 On 與 Off 兩個子功能, 如下圖。


圖 1-C-3

Preview Scale | On 與 Preview Scale | Off 的事件處理程序請參閱範例程式 Webcam Programming (1), 執行 Preview Scale | On 之後, 網路攝影機所拍攝的畫面就會隨著視訊擷取視窗大小的變化而調整。

接著, 在 WebCam 功能表的 Capture Window 子功能中新增一個 Size 子功能, 然後在 Size 子功能之下, 再進一步建立新一層子功能, 分別是 320 * 240 與 640 * 480, 如下圖。


圖 1-C-4

同樣地, 請參閱 Webcam Programming (1) 中, 兩個子功能 Webcam | Capture Window | Size | 320 * 240 與 Webcam | Capture Window | Size | 640 * 480 的事件處理程序。下圖是執行 Preview Scale | On 之後, 接著再更改視訊擷取視窗的大小為 320 * 240, 我們可以看到不但視訊擷取視窗變小了, 畫面中的內容也跟著縮小了, 不再像圖 1-B-7 般, 只有左上角的畫面了。


圖 1-C-5

3. 範例程式 Webcam Programming (2)


範例程式 Webcam Programming (2) 所設定的學習目標是了解視訊裝置驅動程式所提供的功能與掌握視訊擷取視窗的狀態。分成 3 個部分:
part A - 取得視訊裝置驅動程式的效能
part B - 開啟各種視訊參數對話盒
part C - 取得視訊擷取視窗狀態

part A - 取得視訊裝置驅動程式的效能

由於範例程式 Webcam Programming (2) 需要顯示較多的資訊, 因此, 我們修改畫面的顯示方式, 從 Tool palette 中的 win32 分群中, 找到 TPageControl 類別, 新增一個 PageControl 元件到 Form1 之中。PageControl 元件的 Property Name 設定為 pcWebcam; Property Height 設定為 540; Property Width 設定為 730。接著, 在點選 PageControl pcWebcam 元件之後, 用滑鼠右鍵依序新增兩個 pages。第 1 個 page 的 Property Name 設定為 tsCaptureWindow, Property Caption 設定為 Capture Window; 第 2 個 page 的 Property Name 設定為 tsInformation, Property Caption 設定為 Information。

完成上述的設定之後, 就可以開始將各種元件放置到各個分頁之中。首先, 我們將原先放置於 Form1 之中的 pnlCaptureWindow 移到 tsCaptureWindow 分頁之中 (利用 Ctrl+X, Ctrl+V 就可以移入), 如圖 2-A-1。圖 2-A-1 中的 pnlCaptureWindow 的 Property Color 我們已經更改為淡綠色, 讓同學容易分辨。


圖 2-A-1

然後將 lblDriverDescription, lblCapDriverName, lblCapDriverVer 等 3 個 Labels 移到 tsCaptureWindow 分頁之中。最後, 再新增 7 個 Labels 作為顯示驅動程式效能之用, 如圖 2-A-2。


圖 2-A-2

接著, 在 MainMenu1 產生第二列功能表 Dialog, 一共有 4 個功能(MenuItem), 做為分別開啟 Video Source、Video Format、Video Display、Video Compression 等 4 個對話盒(dialog) 之用, 如圖 2-A-3。


圖 2-A-3

 透過 capDriverGetCaps 函式可以掌握是訊裝置的效能為何? 驅動程式提供了什麼對話盒供使用者調整視訊裝置? 在 vfh.h 之中, 宣告了 tagCapDriverCaps 結構資料型態, 因此, 我們可以在公共變數宣告的區域中, 宣告一個 tagCapDriverCaps 資料型態的變數, 做為驅動程式傳遞訊息給我們的橋樑。當程式成功地呼叫了 capDriverGetCaps 函式後, 所宣告的結構變數中, 就會被存放著代表驅動程式效能的各種參數值了。



圖 2-A-4


圖 2-A-5


圖 2-A-6

星期一, 2月 27, 2012

Week 4: Webcam Programming (1) Part B

1 VFW 函式介紹
 a. 如何建立一個視訊擷取視窗( capCreateCaptureWindow )
註: 視窗程式設計(Programming Windows)之基本觀念:
(i) 在 Windows (作業系統) 中, 『視窗』的含義非常明確, 就是指螢幕上的一個矩形區域, 用來接受使用者輸入資料或是以文字或圖形的形式顯示輸出內容。
(ii) Window Styles : 同學可以試試加上 WS_CAPTION 到範例程式中。

 b. 連接視訊擷取視窗與視訊裝置 ( capDriverConnect )

 c. 設定顯示模式 ( capPreview )

 d. 設定視訊畫面顯示速率 (capPreviewRate)

2. 範例程式:

範例程式 Webcam Programming (1) 分成 3 個部分:
part A - 取得視訊裝置驅動程式的相關資訊
part B - 將網路攝影機所擷取到的畫面放到視訊擷取視窗顯示出來
part C - 更改視訊擷取視窗的大小

本週我們將介紹 Part B 的部分:

part B - 將網路攝影機所擷取到的畫面放到視訊擷取視窗顯示出來

要在應用程式中將網路攝影機所拍攝的畫面顯示出來, 必須要依序完成以下 4 項設定:
 a. 在應用程式中, 開啟一個視訊擷取視窗, 以供顯示畫面之用。
   ( capCreateCaptureWindow )
 b. 將攝影機(驅動程式編號)與視訊擷取視窗連結起來。
   ( capDriverConnect )
 c. 設定視訊擷取視窗的顯示模式
   ( capPreview )
 d. 設定視訊畫面顯示速率
   (capPreviewRate)

a. 開啟視訊擷取視窗

Tool Palette 選取 TPanel, 新增一個 Panel 來放置所要開啟的擷取視窗, 同樣地將 Property Name 更改為 pnlCaptureWindow, 並將 Property Height 設定為 250, Property Width 設定為 330, 將 Property Caption 設定為空白, 將 Property Visible 設定為 false。

在 MainMenu 的 Webcam 功能列中新增 Capture Window 功能, 然後, 再分別產生 Create、Destroy 兩個子功能, 如下圖。


圖 1-B-1

將範例程式 Webcam Programming (1) 中的 Create1Click 與 Destroy1Click 事件處理程序分別完成後, 就可以進行測試。執行 Capture Window | Create, 會產生一個全黑的視訊擷取視窗, 畫面如下圖。再執行 Capture Window | Destroy, 則黑色視窗會消失, pnlCaptureWindow 也會變成看不見。


圖 1-B-2

b. 連結攝影機與視訊擷取視窗 ( capDriverConnect )

在 Webcam 功能表中新增一個 Driver - Capture Window 功能, 並在 Submenu 中建立 Connect 與 Disconnect 兩個子功能, 如下圖。


圖 1-B-3

兩個子功能 Connect 與 Disconnect 的事件處理程序請參閱範例程式 Webcam Programming (1)。執行 Connect 子功能, 原先為全黑畫面的視訊擷取視窗, 則會顯示一張攝影機所拍攝的靜止畫面,如下圖。


圖 1-B-4

注意: 這僅僅是一張靜止的畫面, 而不是攝影機所拍攝的連續畫面。由於對焦也不正確的緣故, 因此所拍攝的畫面看起來是模糊的。如果再執行 Disconnect 子功能, 視訊擷取視窗又會恢復成全黑的畫面。

c. 設定視訊擷取視窗的顯示模式 ( capPreview )

接下來, 必須要設定視訊擷取視窗的顯示模式。一般來說, Webcam 通常只提供 Preview 的顯示模式。因此, 我們繼續在 Webcam 功能列中新增一個 Display Mode: Preview 的功能, 並進一步建立兩個子功能 Enable 與 Disable, 如下圖。


圖 1-B-5

兩個子功能 Enable 與 Disable 的事件處理程序請參閱範例程式 Webcam Programming (1)。執行 Enable 子功能後, 視訊擷取視窗的畫面依舊是靜止的, 必須再完成顯示速率的設定, 畫面才會變成連續拍攝與顯示。

d. 設定視訊畫面顯示速率 ( capPreviewRate )

同樣地在 Webcam 功能表中新增一個 Preview Rate 功能, 然後下一層則先暫定兩個子功能: 30 frame/sec 與 15 frame/sec, 如下圖。


圖 1-B-6

兩個子功能 30 frame/sec 與 15 frame/sec 的事件處理程序請參閱範例程式 Webcam Programming (1)。capPreviewRate(hwndVideo, 33) 指令中的第 2 個參數所代表的意義是 1 個 frame 要顯示多少微秒(ms), 由於 1 秒等於 1000 微秒, 所以當 1 個畫面顯示 33 微秒時, 1000 / 33 = 30.3, 代表 1 秒鐘約可顯示 30 個畫面。同學可以自行輸入數字, 進行測試。


圖 1-B-7

完成上述 4 項設定之後, 網路攝影機所拍攝的畫面就可以連續顯示在視訊擷取視窗了。觀察上圖, 可以發現視訊裝置啟動了自動對焦的功能, 因此畫面對焦正確, 可以清晰看到所拍攝的畫面了。

下週預告:

將視訊擷取視窗的大小改成 640*480, pnlCaptureWindow 的 width 改成 650, Height 改成 490, 執行後的畫面如下圖。


圖 1-C-1

你知道發生什麼事嗎?

提示: 比較圖 1-B-7 與圖 1-C-1 兩張圖片的拍攝內容!


圖 1-C-2

Week 3: 228 國定記念日

本週上課日適逢 228 國定記念日, 故課程放假一次!

請同學在家自行練習範例程式 Webcam Programming (1)

星期二, 2月 21, 2012

Week 2: Webcam Programming (1) Part A

1. Viedo For Window (vfw.h)
 a. 什麼是標頭檔 .h  (Wikipedia: 表頭檔)
 b. #include <vfw.h> // 這行指令是什麼意思?
 c. 延伸閱讀 C 語言之前置處理
 d. Wikipedia: 匈牙利命名法

2. VFW 函式介紹

 a. 取得視訊裝置驅動程式的名稱與版本 (capGetDriverDescription)

3. 範例程式: Webcam Programming (1)

範例程式分成 2 個部分:
part A - 取得視訊裝置驅動程式的相關資訊
part B - 將網路攝影機所擷取到的畫面放到視訊擷取視窗顯示出來

本週我們將介紹 Part A 的部分:

part A - 取得視訊裝置驅動程式的相關資訊

首先, 從 Tool Palette 中選取 TPanel, 放到 Form1 中, Property Name 內定為 Panel1, 將 Property Name 改成 pnlDriverDescription, 再將 Property Caption 改成空白, Property Visible 改成 false。

再從 Tool Palette 中選取 3 個 TLabel 放到 pnlDriverDescription 之中。3 個 Label 的 Property Name 分別改成 lblDriverDescription, lblCapDriverName, lblCapDriverVersion。Property Caption 則是分別改成 Driver Description, Name: 及 Version:。

從 Tool Palette 中選擇 MainMenu 元件, 加到 Form1 之中, 然後在 MainMenu 中建立一個 WebCam 的功能列, 接著建立一個 Driver: Name / Version 的子功能, 如下圖。



產生 Driver : Name / Version 功能後, 在 MainMenu1 元件中選取 Driver : Name / Version 功能的情況下, 可以使用滑鼠右鍵叫出 MainMenu1 的快捷功能表(PopupMenu), 如下圖。



選取 Create Submenu 就可以進一步產生下一層子功能列 On 與 Off, 如下圖。



最後將範例程式中, Part A 的兩個事件處理程序分別放到 On 與 Off 事件處理程序中, 就可以執行了。下圖是執行 On 所顯示出來畫面, 內容為視訊裝置的驅動程式的名稱與版本, 這個資訊也可以從電腦裝置管理員中獲得驗證。



下圖是電腦裝置管理員所顯示, 關於影像裝置 IPEVO Point 2 View 的驅動程式資訊。

星期二, 2月 14, 2012

Week 1: 2012S 課程說明

1. 2012S 課程評分原則:

 a. 期中考 30% :
    2011S 考古題

 b. 期末專案: 含展示影片, 報告與上台發表 50%

 c. 指定閱讀 或 參觀展覽: 1,500 字心得報告 10%
    欲推薦閱讀書籍, 請於 Week 2 提出。

 d. 其他隨堂作業 10%

2. 修課所需準備之軟硬體:

 a. 硬體: 電腦, USB 攝影機

   如果使用內建有攝影機的筆記型電腦,
   如果想再另外使用一個 USB 攝影機,
   請先到電腦控制台的裝置管理員將內建攝影機停用,
   就可以正常地使用 USB 攝影機了。

 b. 軟體: C++ Builder

3. C++ Builder XE2 程式撰寫基本概念:

 a. 開啟一個 VCL Form 應用專案

 b. Object Inspector

 c. 工具盤 Tool Palette

 d. 儲存 Form/Unit

 e. 儲存 Project

 f. XE2: the Hello World Example!