USB免驱*敏*感*词*采集图像【VS2012+opencv+directShow(Cc
优采云 发布时间: 2020-08-10 23:03在Opencv英文网站上有关于directShow和opencv结合采集图像的教程,地址:%e4%bd%bf%e7%94%a8DirectShow%e9%87%87%e9%9b%86%e5%9b%be%e5%83%8f
但是该配置比较老,本文述说怎样基于该教程在 VS2012和opencv2.4.9上进行配置和更改,完成USB*敏*感*词*的驱动。
博主的USB免驱*敏*感*词*如下:
文末有完整代码的下载地址
1.环境配置
在Opencv英文网站上有关于directShow和opencv结合采集图像的教程,地址:%e4%bd%bf%e7%94%a8DirectShow%e9%87%87%e9%9b%86%e5%9b%be%e5%83%8f
但说明中的“本文档介绍的CCameraDS类调用采集函数可直接返回IplImage,使用更方便,且集成了DirectShow,勿需安装庞大的DirectX/Platform SDK”并不靠谱,DirectShow 似乎早已开始被谷歌给淘汰了,最后存在是在多年前的 DirectX 9.0b 包里。
注意这儿并不需要下载DirectX 9.0包,下面介绍在VS2012和opencv2.4.9下的配置过程。
1.1 配置VS2012和opencv环境
按照网上流行的配置即可,如 。配置好以后尝试运行一个打开图片的小程序检查opencv环境是否配置成功。
1.2 配置DirectX环境
新建工程,配置好Opencv环境,随后将从Opencv英文网上下载的 CameraDS.h 和 CameraDS.cpp 文件分别添加到项目的头文件和源文件中。
VS2012旗舰版是自带了 SDK 的,在 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include。
打开构建的VS2012项目的属性页,找到“VC++目录”,在“收录目录”里添加 (FrameworkSDKDir)Include,在“库目录”里添加(FrameworkSDKDir)Lib。
发现#include “qedit.h”报错,原因是现今的版本早已没有qedit.h这个头文件了,从网址: 中下载该文件,添加到项目的头文件中。
2. 运行
环境配置好以后,可以用 Opencv英文网 上下载的main.cpp运行,运行过程可能碰到const char* 无法转换的问题,将此处的代码除去即可。
下面是本人编撰的main函数,提供了USB单反的打开、监视、图像捕获功能。
2.1 查看系统的所有*敏*感*词*状态(initAllCameras函数)
参数是 CCameraDS 类的对象。该函数获取单反的数量而且显示单反名称。从输出中我们可以找到USB单反的编号,一般情况下编号为1。
//获取当前可用的*敏*感*词*并打开USB*敏*感*词*
int initAllCameras(CCameraDS &m_CamDS){
//仅仅获取*敏*感*词*数目
int m_iCamCount = CCameraDS::CameraCount();
printf("There are %d cameras.\n", m_iCamCount);
if(m_iCamCount == 0)
{
return -1;
}
//获取所有*敏*感*词*的名称
for(int i = 0; i < m_iCamCount; i++)
{
char szCamName[1024];
int retval = m_CamDS.CameraName(i, szCamName, sizeof(szCamName));
if(retval >0)
{
printf("Camera #%d's Name is '%s'.\n", i, szCamName);
}
else
{
printf("Can not get Camera #%d's name.\n", i);
}
}
return m_iCamCount;
}
运行结果如下所示:
There are 3 cameras.
Camera #0's Name is 'Lenovo EasyCamera'.
Camera #1's Name is '3D Camera'.
Camera #2's Name is 'Basler GenICam Source'.
从运行结果中可以看出,使用的3D相机的编号为1。
2.2 打开USB单反(openUsbCam函数)
函数有四个参数,第一个参数为CcameraDS类的对象,camNum设置为1,表明如今要打开的USB单反,而不是笔记本自带单反。camWidth和camHeight按照自己所使用单反的情况进行设置,设置为图象的长度和高度。
代码如下:
<p>// 打开 USB 相机 !! 在调用 camDisplay 和 camCapPic 之前必须调用该函数
// camNum = 1; // *敏*感*词*编号为1,表示当前要使用的是 USB *敏*感*词*
// camWidth = 2560; // 图片宽度
// camHeight = 720; // 图片高度
int openUsbCam(CCameraDS &m_CamDS, const int camNum=1, const int camWidth=2560, const int camHeight = 720){
// 获取当前可用的相机个数
// 在所有的相机中,一般编号为 0 的为电脑自带*敏*感*词*,编号为 1 的为要使用的 USB *敏*感*词*
int m_iCamCount = initAllCameras(m_CamDS);
if(m_iCamCount == -1){
cout