VC中实现VFW的时时视频捕捉

Visual C++ Code
#include <AFX.h>
#include "StdAfx.h"
#include <VFW.H>
#include <stdio.h>
#pragma comment(lib,"VFW32.LIB")

HWND AVIhWnd = 0;
HWND hWnd = 0;
HDC hDC = 0;
HDC ScenehDC = 0;
DWORD AVIWidth = 640;
DWORD AVIHeight = 480;
DWORD DCColorBits = 32;
BYTE BmpByte[1920*480];

BITMAPINFO DCitmap;
HBITMAP SceneBitmap;
HGDIOBJ AboriginaalObject;
LPCSTR szClassName;
LPCSTR szWindowTitle;

long X;
long Y;
long OutWidth;
long InputWidth;
long cR;
long cG;
long cB;

static LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
static LRESULT CALLBACK FrameCallbackProc(HWND, LPVIDEOHDR);


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    szClassName = "myClass";
    szWindowTitle = "MyWindow";

    WNDCLASS  wc;
    wc.style = CS_HREDRAW|CS_VREDRAW;
    wc.lpfnWndProc = MainWndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_3DSHADOW);
    wc.lpszMenuName =  NULL;
    wc.lpszClassName = szClassName;
    RegisterClass(&wc);

    hWnd = CreateWindow(szClassName,
                        szWindowTitle,
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        AVIWidth,
                        AVIHeight,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);

    if (!hWnd){
        MessageBox(0,TEXT("创建窗口失败!/r/n"),"", MB_OK); 
        return (FALSE);
    }
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    ScenehDC = CreateCompatibleDC(hDC);
    ZeroMemory(&DCitmap.bmiHeader, sizeof(BITMAPINFOHEADER));
    DCitmap.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    DCitmap.bmiHeader.biBitCount = 24;
    DCitmap.bmiHeader.biWidth = AVIWidth;
    DCitmap.bmiHeader.biHeight = AVIHeight;
    DCitmap.bmiHeader.biPlanes = 1;
    DCitmap.bmiHeader.biClrUsed = 0;
    DCitmap.bmiHeader.biClrImportant = 0;
    DCitmap.bmiHeader.biSizeImage = AVIWidth * AVIHeight * (DCitmap.bmiHeader.biBitCount / 8);
    SceneBitmap = CreateDIBSection(ScenehDC, &DCitmap, DIB_RGB_COLORS, NULL ,0 , 0);

    AboriginaalObject = SelectObject(ScenehDC, (HGDIOBJ)SceneBitmap);

    OutWidth = AVIWidth * 3;
    InputWidth = AVIWidth * 3;


    int rd;
    BITMAPINFOHEADER bmpFormat;
    AVIhWnd = capCreateCaptureWindow((LPSTR)"视频追踪"
                                    WS_CHILD  | WS_VISIBLE, 
                                    00, AVIWidth, AVIHeight, 
                                    hWnd, 
                                    1);
    if (AVIhWnd==0)
    {
        MessageBox(hWnd, "创建AVI窗口失败","提示",64);
    }else{
        hDC = GetWindowDC(hWnd);

        capSetCallbackOnFrame(AVIhWnd,(FARPROC)FrameCallbackProc);
        rd = capDriverConnect(AVIhWnd,0);

        if(rd != 0){
            CAPDRIVERCAPS *Caps;
            capDriverGetCaps(AVIhWnd,sizeof(CAPDRIVERCAPS),&Caps);
            capPreviewRate(AVIhWnd, 30);
        }else{
            MessageBox(hWnd, "不能打开设备驱动。","提示",64);
        }
    }

    MSG msg;
    while (GetMessage(&msg, NULL00)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    SelectObject(ScenehDC, AboriginaalObject);
    DeleteObject((HGDIOBJ)SceneBitmap);
    DeleteDC(ScenehDC);
    return 0;
}

LRESULT CALLBACK MainWndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
    switch (Message) {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return (DefWindowProc(hWnd, Message, wParam, lParam));
    }
    return 0;
}

LRESULT CALLBACK FrameCallbackProc(HWND ghWnd,LPVIDEOHDR lpVData)
{
    for(Y=1; Y<=AVIHeight; Y++)
    {
        for(X=1; X<=AVIWidth; X++)
        {
            cB = lpVData->lpData[((AVIHeight-Y)*InputWidth)+(X*3)];
            cG = lpVData->lpData[((AVIHeight-Y)*InputWidth)+(X*3)+1];
            cR = lpVData->lpData[((AVIHeight-Y)*InputWidth)+(X*3)+2];
            BmpByte[((Y-1)*OutWidth)+(X*3)]=cB;
            BmpByte[((Y-1)*OutWidth)+(X*3)+1]=cG;
            BmpByte[((Y-1)*OutWidth)+(X*3)+2]=cR;
        }
    }
    SetBitmapBits(SceneBitmap,sizeof(BmpByte),BmpByte);
    BitBlt(hDC, 00, AVIWidth, AVIHeight, ScenehDC, 00, SRCCOPY);
    return 0;
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值