vc摄像头笔记

来源:互联网 发布:空姐外围女 知乎 编辑:程序博客网 时间:2024/05/29 03:37

现在在vc上采集视频常用的方法有三:vfw,directshow,opencv 


#include <cvirte.h>  
#include <userint.h>
#include <windows.h>
#include <vfw.h>                          //驱动摄像头的库包含文件
#include "Main.h" 
static int panelHandle;
static int CapHandle;                    //获得的视频窗口句柄

int main (int argc, char *argv[])
{
      if (InitCVIRTE (0, argv, 0) == 0)
         return -1; /* out of memory */
      if ((panelHandle = LoadPanel (0, "Main.uir", PANEL)) < 0)
         return -1;

      DisplayPanel (panelHandle);
      RunUserInterface ();
      DiscardPanel (panelHandle);
      return 0;
}

int CVICALLBACK PICCALLBACK (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
  case EVENT_LEFT_CLICK:
   if(CapHandle)                //如果视频窗口创建成功
   {    
                SendMessage ((HWND)CapHandle, WM_CAP_DRIVER_DISCONNECT, 0, 0);        //如果已打开,则先关闭
                SendMessage ((HWND)CapHandle, WM_CAP_DRIVER_CONNECT, 0, 0);             //连接设备
                SendMessage ((HWND)CapHandle, WM_CAP_SET_PREVIEWRATE, 1000, 0);     //设置御览祯率,目前设为1000(设备较旧) 
                SendMessage ((HWND)CapHandle, WM_CAP_SET_SCALE, TRUE, 0);
                SendMessage ((HWND)CapHandle, WM_CAP_SET_PREVIEW, TRUE, 0);            //打开御览
   } 
   break; 
}
return 0;
}

int CVICALLBACK QUITCALLBACK (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
  case EVENT_COMMIT:
   if(CapHandle)
    SendMessage ((HWND)CapHandle, WM_CAP_DRIVER_DISCONNECT, 0, 0);  //关闭设备连接,窗口句柄不需要释放(只是借用来的)
   QuitUserInterface (0);
   break;
  case EVENT_LEFT_CLICK:
   break;
}
return 0;
}

/*
    函数说明:本来获得设备信息的最佳位置是在窗口类的创建过程,但LabWindows默认不处理Windows消息。所以改在
                     这里来预处理设备信息。
    注意:       这个函数是会被LabWindows多次调用的,所以应对设备用到的资源进行保护。本例利用全局的视频御览句柄
                     做保护标志。(详见代码)    
*/
int CVICALLBACK PANELCALLBACK (int panel, int event, void *callbackData,
  int eventData1, int eventData2)
{
char  szDeviceName[MAX_PATH] = {'\0',};   //设备名称
char  szDeviceDesc[MAX_PATH] = {'\0',};    //设备描述
int  Handle = 0;                                            //面板的句柄
int  CapLeft = 0;                                          //这里和以下为创建的御览区域
int  CapTop = 0;
int  CapHeight = 0;
int  CapWidth = 0;

switch (event)
{
  case EVENT_GOT_FOCUS:
   if(!CapHandle)                                  //EVENT_GOT_FOCUS事件会被多次调用到,这里保证只会被创建一次
   {
    if(capGetDriverDescription(0,szDeviceName,MAX_PATH,szDeviceDesc,MAX_PATH))    //获得设备名称(如果有设备的话,返回真)
    {
              SetCtrlAttribute (panelHandle,PANEL_VIDEO, ATTR_LABEL_TEXT, szDeviceName);   //显示设备名称
              GetPanelAttribute (panelHandle,ATTR_SYSTEM_WINDOW_HANDLE,&Handle);           //获得面板的句柄值
    
              GetCtrlAttribute (panelHandle, PANEL_VIDEO, ATTR_LEFT, &CapLeft);
              GetCtrlAttribute (panelHandle, PANEL_VIDEO, ATTR_TOP, &CapTop);
              GetCtrlAttribute (panelHandle, PANEL_VIDEO, ATTR_HEIGHT, &CapHeight);
              GetCtrlAttribute (panelHandle, PANEL_VIDEO, ATTR_WIDTH, &CapWidth);
    
              CapHandle = (int) capCreateCaptureWindow ("TestCap",WS_CHILD | WS_VISIBLE ,CapLeft,
                                          CapTop,CapWidth,CapHeight,(HWND)Handle,0);                               //创建视频御览窗口    
    }
   }
   break;
  case EVENT_LOST_FOCUS:
   
   break;
  case EVENT_CLOSE:
   break;
  case EVENT_PANEL_SIZING:
   
   break;
  default:
   break;
}
return 0;
}

原创粉丝点击