Labwindows/CVI下调用openCV实现多摄像头切换

来源:互联网 发布:第一人称冒险游戏java 编辑:程序博客网 时间:2024/05/21 10:26


基本要求为使用Labwindows设计一个摄像头监控程序,要求如下:

1、包含文件菜单,并有快捷图标。摄像头图片信息预览。

2、当有多个摄像头时候能设别多设备,界面上能选择与某个设备连接。

3、全尺寸读取图片信息,并且能按照设定的分辨率截取图片信息。

4、按键能进行截图操作,截图后保存出来,同时把图片加载至dll文件中。

5、额外编写 一个dll文件,该文件在按键截图时候,能加载所截取的图片并且给出一个处理后的简易图片(黑白处理等)。

6、显示处理后的图片。

7、在没有硬件接入的时候,能给出提示。

方案一:采用VFW技术,调用API接口函数capCreateCaptureWindowA 函数即可创建视频窗口,然后通过Windows标准的SendMessage函数发出控制指令,常用指令如下:

#define WM_CAP_START   WM_USER//开始

#define WM_CAP_STOP   WM_CAP_START + 68 //停止
#define WM_CAP_DRIVER_CONNECT   WM_CAP_START + 10   //连接
#define WM_CAP_DRIVER_DISCONNECT   WM_CAP_START + 11   //断开
#define WM_CAP_SAVEDIB   WM_CAP_START + 25
#define WM_CAP_GRAB_FRAME   WM_CAP_START + 60
#define WM_CAP_SEQUENCE   WM_CAP_START + 62
#define WM_CAP_FILE_SET_CAPTURE_FILEA   WM_CAP_START + 20 //保存至文件
#define WM_CAP_SEQUENCE_NOFILE  WM_CAP_START + 63 
#define WM_CAP_SET_OVERLAY  WM_CAP_START + 51 
#define WM_CAP_SET_PREVIEW  WM_CAP_START + 50 
#define WM_CAP_SET_CALLBACK_VIDEOSTREAM   WM_CAP_START + 6
#define WM_CAP_SET_CALLBACK_ERROR  WM_CAP_START + 2
#define WM_CAP_SET_CALLBACK_STATUSA  WM_CAP_START + 3
#define WM_CAP_SET_CALLBACK_FRAME  WM_CAP_START + 5
#define WM_CAP_SET_SCALE WM_CAP_START + 53
#define WM_CAP_SET_PREVIEWRATE  WM_CAP_START + 52
#define WM_CAP_COPYDIBWM_CAP_START + 30 //复制图片
#define WM_CAP_DLG_VIDEOSOURCE    WM_CAP_START + 42
基本流程:通过capCreateCaptureWindowA 函数创建视频窗口,然后发送WM_CAP_DRIVER_CONNECT指令,接下来进行视频预览配置:SendMessage((HWND)cam_handle, WM_CAP_SET_SCALE, 1, 0);
SendMessage((HWND)cam_handle, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage((HWND)cam_handle, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage((HWND)cam_handle, WM_CAP_SET_PREVIEW, 1, 0);

即可成功打开摄像头。通过SendMessage((HWND)cam_handle, WM_CAP_DLG_VIDEOSOURCE, 0, 0);指令即可弹出驱动定制的对话框选择视频来源,即在多摄像头之间切换。但是此方案仅能弹出对话框让用户自行选择,不能程序控制切换,而且有诸多BUG和兼容性问题存在。

方案二:使用openCV计算机视觉库。

OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

本次我们仅需调用其中的摄像头控制部分,仅需其中的CVCAM100.dll即可。而CVCAM部分在高版本的openCV中被替换为了DirectShow方案实现,高版本中被集成到其他库里面去了。所以我选择下载openCV1.0版本,将其中的CVCAM部分移植出来。

安装好openCV1.0后在其bin目录下将所有dll文件均复制到Windows\system32目录下,然后otherlib中找到cvcam相关的.h和.lib文件复制到工程目录下。打开工程将cvcam.h、cvcam.lib、cvcam100.dll导入,在主程序中包含cvcam.h文件即可。下面为测试程序部分代码:

ncams = cvcamGetCamerasCount();

HWND MyWin;
//选择摄像头
 cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE);
//camera
 cvcamSetProperty(0, CVCAM_PROP_RENDER, CVCAMTRUE);

MyWin = (HWND)PANEL_CANVAS;
 cvcamSetProperty(1, CVCAM_PROP_WINDOW, &cam_handle);
//设置回调函数
cvcamSetProperty(0, CVCAM_PROP_CALLBACK, callback);
cvcamInit();
cvcamStart();

//程序开始工作
cvWaitKey(0);
cvcamStop();
cvcamExit();






0 0
原创粉丝点击