Windows 影像擷取 API 歷經 VFW → DirectShow → Media Foundation 三代。.NET 直接呼叫 COM 介面不便,社群提供多種封裝庫。
| 庫 | 基礎 | 影像擷取 | 音訊擷取 | 單幀取得 | 授權 | 易用性 |
|---|---|---|---|---|---|---|
| DirectX.Capture | DirectShow | ✓ | ✓ | ✗ | 開放 | 簡單 |
| OpenCV (1.1+) | DirectShow | ✓ | ✗ | ✓ | BSD | 中等 |
| EmguCV | OpenCV (.NET 封裝) | ✓ | ✗ | ✓ | 商業/免費版有限制 | 優 |
| AForge.NET | DirectShow (純 .NET) | ✓ | ✗ | ✓ (事件式) | LGPL | 優 (文件完整) |
Capture cap = new Capture(Filters.VideoInputDevices[0], Filters.AudioInputDevices[1]);
cap.Filename = @"C:\MyVideo.avi";
cap.Start(); /* ... */ cap.Stop();
IntPtr cap = CvInvoke.cvCreateCameraCapture(deviceIndex);
while (!stop) {
IntPtr frame = CvInvoke.cvQueryFrame(cap);
/* 處理 frame */
}
CvInvoke.cvReleaseCapture(ref cap);
Capture cap = new Capture(deviceIndex);
while (!stop) { pictureBox.Image = cap.QueryFrame().Bitmap; /* ... */ }
cap.Dispose();
VideoCaptureDevice cap = new VideoCaptureDevice(monikerString);
cap.NewFrame += (s, e) => pictureBox.Image = (Bitmap)e.Frame.Clone();
cap.Start(); /* ... */ cap.SignalToStop();
原始碼證據 (_highgui.h, cvcap_dshow.cpp, cvapp.cpp) 顯示編譯條件 HAVE_VIDEOINPUT 啟用時透過 videoinput.h (DirectShow 封裝) 建立 CvCaptureCAM_DShow 類別,並優先於 VFW 嘗試建立。
包含裝置列舉、能力選擇、三庫效能測試 (FPS 計算)、即時預覽、多執行緒擷取、UI 同步更新完整 WinForms 專案代碼 (見原文)。