【转】VC捕捉摄像头图像入门源码
VC捕捉摄像头图像入门源码(非常适合新手)()
默认分类 2009-11-02 17:46:56 阅读39 评论0 字号:大中
//此源码是我更改过的基于VFW(Video for Windows)的源码,使用了定时器能实时的显示图像,从网上可搜到原版源码,但是原版的功能是保存为一个文件,且不能实时显示,此版本虽然能显示,但感觉反应速度不是很快,没有基于DirectShow的程序更新速度快,不过在WM_PAINT消息处理里加while(1){capGrabFrame(ghWndCap);}刷新速度就快很多了,但是这样程序就进入死循环不能再处理其他消息,至于怎样改进,就靠读者你了。
//源码的任何部分都可以在MSDN里查到,请参考MSDN
#include <windows.h>
#include <stdio.h>
#include <vfw.h>
#pragma comment(lib,"vfw32.lib")

HWND ghWndCap ; //捕获窗的句柄
CAPSTATUS gCapStatus ; //捕获窗的状态
CAPDRIVERCAPS gCapDriverCaps ; //视频驱动的能力
char gachBuffer[20];
//char szCaptureFile[] = "CamCapture.AVI";

///////////////////////////////////////////////////////////////////////
// StatusCallbackProc: 状态回调函数,使用capSetCallbackOnStatus宏来注册这个回调函数。
// hWnd:            捕获窗体句柄
// nID:              当前状态的状态码
// lpStatusText:      当前状态的文本字符
///////////////////////////////////////////////////////////////////////
LRESULT CALLBACK StatusCallbackProc(HWND hWnd,int nID,LPSTR lpStatusText)
{
if(!ghWndCap)
  return FALSE;//获得捕获窗的状态
capGetStatus(ghWndCap,&gCapStatus,sizeof(CAPSTATUS));//更新捕获窗的大小,得到消息WM_CAP_GET_STATUS
SetWindowPos(ghWndCap,NULL,0,0,gCapStatus.uiImageWidth,gCapStatus.uiImageHeight,SWP_NOZORDER|SWP_NOMOVE);
if(nID==0){//清除旧的状态信息
  SetWindowText(ghWndCap,(LPSTR)"hello");
  return (LRESULT)TRUE;
}//显示状态ID和状态文本
wsprintf(gachBuffer,"Status# %d: %s",nID,lpStatusText);
SetWindowText(ghWndCap,(LPSTR)gachBuffer);
return (LRESULT)TRUE;
}


//////////////////////////////////////////////////////////////////////////////
// ErrorCallbackProc:    错误回调函数,capSetCallbackOnError宏来注册回调
// hWnd:              捕获窗口句柄
// nErrID:              错误代码
// lpErrorText:          关于错误的文本信息
///////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText)
{
if(!ghWndCap)
  return FALSE;
    if(nErrID==0)
  return TRUE;//清除旧的错误
wsprintf(gachBuffer,"Error# %d",nErrID);//显示错误标识和文本
MessageBox(hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION);
return (LRESULT) TRUE;
}

//////////////////////////////////////////////////////////////////////////////
// FrameCallbackProc:  帧回调函数,通过capSetCallbackFrame宏来注册回调函数
// hWnd:              捕获窗体句柄
// lpVHdr:            指向一个包含帧信息的数据结构体
/////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK FrameCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr)
{
FILE *fp;
fp=fopen("caram.dat","w");
if(!ghWndCap)
  return FALSE;//假设fp为一打开的.dat文件指针
fwrite(lpVHdr->lpData,1,lpVHdr->dwBufferLength,fp);
return (LRESULT)TRUE;
}
//////////////////////////////////////////////////////////////////////////////
//TimerProc函数处理定时器,在这里抓取并显示图像
//////////////////////////////////////////////////////////////////////////////
VOID CALLBACK TimerProc(
      HWND hwnd,        // handle to window
      UINT uMsg,        // WM_TIMER message
      UINT_PTR idEvent, // timer identifier
      DWORD dwTime      // current system time
      )
{
capGrabFrame(ghWndCap);
}


//////////////////////////////////////////////////////////////////
//主回调函数
//////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProc(
        HWND hwnd,      // handle to window
        UINT uMsg,      // message identifier
        WPARAM wParam, // first message parameter
        LPARAM lParam  // second message parameter
        )
{
// HDC hdc;
// PAINTSTRUCT ps;
// RECT rect;
switch(uMsg)
{
case WM_CREATE:
  ghWndCap=capCreateCaptureWindow((LPSTR)"Capture Window",WS_CHILD|WS_VISIBLE,0,0,320,240,(HWND)hwnd,(int)0);
 
  capSetCallbackOnError(ghWndCap,(FARPROC)ErrorCallbackProc);
  capSetCallbackOnStatus(ghWndCap,(FARPROC)StatusCallbackProc);
  capSetCallbackOnFrame(ghWndCap,(FARPROC)FrameCallbackProc);
  capDriverConnect(ghWndCap,0); // 将捕获窗同驱动连接
   
  capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPDRIVERCAPS));//获得驱动的能力,相关的信息放在结构变量gCapDriverCaps
  capPreviewRate(ghWndCap, 66); //uses this macro to set the frame display rate for preview mode to 66 milliseconds per frame
  capPreview(ghWndCap, TRUE); //and then uses the capPreview macro to place the capture window in preview mode.
  if(gCapDriverCaps.fHasOverlay) //检查驱动器是否有叠加能力
    capOverlay(ghWndCap,TRUE); //启动Overlay模式
  if(gCapDriverCaps.fHasDlgVideoSource)capDlgVideoSource(ghWndCap); //Video source 对话框
  if(gCapDriverCaps.fHasDlgVideoFormat)capDlgVideoFormat(ghWndCap); // Video format 对话框
  if(gCapDriverCaps.fHasDlgVideoDisplay)capDlgVideoDisplay(ghWndCap); // Video display 对话框
//  capFileSetCaptureFile( ghWndCap, szCaptureFile); //将要保存的文件名设为本源文件开头处的全局字符串常量
//  capFileAlloc(ghWndCap, (1024L * 1024L * 5)); //为捕获文件分配存储空间
  capCaptureSequence(ghWndCap); //开始捕获视频序列
//  capGrabFrame(ghWndCap); //捕获单帧图像
  SetTimer(hwnd,1,10,TimerProc);
  break;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。