首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 攝像頭控制:基於 Video for Windows (VFW) 的 SDK 實作

     編輯:VC 教學

核心架構

使用 vfw32.lib 提供的 capCreateCaptureWindow 等 API 建立捕獲視窗,透過回呼函數處理狀態、錯誤、影格資料。

關鍵資料結構與全域變數

HWND ghWndCap;              // 捕獲視窗句柄
CAPDRIVERCAPS gCapDriverCaps; // 驅動程式能力
CAPSTATUS gCapStatus;         // 捕獲狀態
char szCaptureFile[] = "MYCAP.AVI";

回呼函數實作

狀態回呼

LRESULT CALLBACK StatusCallbackProc(HWND hWnd, int nID, LPSTR lpStatusText) {
    if (!ghWndCap) return FALSE;
    capGetStatus(ghWndCap, &gCapStatus, sizeof(CAPSTATUS));
    SetWindowPos(ghWndCap, NULL, 0, 0, gCapStatus.uiImageWidth, gCapStatus.uiImageHeight, SWP_NOZORDER|SWP_NOMOVE);
    if (nID == 0) { SetWindowText(ghWndCap, "hello"); return TRUE; }
    char buf[64]; wsprintf(buf, "Status# %d: %s", nID, lpStatusText);
    SetWindowText(ghWndCap, buf);
    return TRUE;
}

錯誤回呼

LRESULT CALLBACK ErrorCallbackProc(HWND hWnd, int nErrID, LPSTR lpErrorText) {
    if (!ghWndCap || nErrID == 0) return TRUE;
    char buf[64]; wsprintf(buf, "Error# %d", nErrID);
    MessageBox(hWnd, lpErrorText, buf, MB_OK|MB_ICONEXCLAMATION);
    return TRUE;
}

影格回呼(即時存檔示範)

LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr) {
    FILE* fp = fopen("caram.dat", "wb");
    if (fp) { fwrite(lpVHdr->lpData, 1, lpVHdr->dwBufferLength, fp); fclose(fp); }
    return TRUE;
}

主程式流程

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nShow) {
    WNDCLASS wc = { CS_HREDRAW|CS_VREDRAW, WndProc, 0,0, hInst,
        LoadIcon(NULL,IDI_APPLICATION), LoadCursor(NULL,IDC_ARROW),
        (HBRUSH)GetStockObject(WHITE_BRUSH), NULL, TEXT("HelloWin") };
    RegisterClass(&wc);
    HWND hwnd = CreateWindow(TEXT("HelloWin"), TEXT("VFW Capture"), WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInst, NULL);
    ShowWindow(hwnd, nShow); UpdateWindow(hwnd);

    // 建立捕獲視窗
    ghWndCap = capCreateCaptureWindow(TEXT("Capture"), WS_CHILD|WS_VISIBLE, 0,0,640,480, hwnd, 1);
    capSetCallbackOnStatus(ghWndCap, StatusCallbackProc);
    capSetCallbackOnError(ghWndCap, ErrorCallbackProc);
    capSetCallbackOnFrame(ghWndCap, FrameCallbackProc);
    capDriverConnect(ghWndCap, 0); // 連接第一個裝置
    capPreviewRate(ghWndCap, 33);  // ~30fps
    capPreview(ghWndCap, TRUE);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
    capDriverDisconnect(ghWndCap);
    return msg.wParam;
}

注意事項

  • VFW 為舊技術,現代專案建議改用 DirectShow 或 Media Foundation。
  • 錯誤處理需檢查每個 cap* 函數的返回值。
  • 影格回呼中執行耗時操作(如壓縮、寫檔)會導致預覽卡頓,建議將資料推入佇列由工作執行緒處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved