admin 管理员组文章数量: 887021
2024年2月20日发(作者:sql数据库默认安装路径)
基于DirectShow的多摄像头视频采集
1.为什么使用DirectShow
笔者使用的是两个USB摄像头,单摄像头视频采集使用OpenCV的VideoCapture类没有问题,但是双摄像头就有问题,一个正常,另外一个采集不到信息,显示一片灰色。网上有种解决方法是逆序打开摄像头,结果两个窗口是可以采集到视频信息,但是竟然是同一个摄像头的视频信息,无奈的只能使用DirectShow采集多摄像头视频信息。
先看看什么是DirectShow:
DirectShow 是 DirectX 的组件之一, DirectX 软件开发包是 Microsoft 提供的一套在 Windows平台上开发高性能图形、声音、输入、输出和网络游戏的编程接口。这其中,DirectShow提供了应用程序从适当的硬件中捕捉和预览音、视频的能力。数据源包括: VCR、 Camera、 TV Tuner、 Microphone 或其他的数据源。应用程序可以立刻显示捕捉的数据(预览),或是保存到一个文件中。
摄像头采集信息常用的软件AMCap就是基于DirectShow SDK编写的。查阅一下官方文档,感觉好难的样子,难道要新学一门“快过时”的技术吗?幸好于仕琪老师写了一个CCameraDS类,可直接返回IplImage,使用方便。
2.在VS2010中配置DirectShow并采集双目摄像头视频
下载DirectShow相关文件,我已经共享在百度云盘,点击下载。解压以后copy到D:opencv里(放在这里为了管理方便)
在解决资源管理器中的项目名称处右键属性配置属性VC++目录,引用目录中添加DirectShow的include文件夹,我添加的是D:opencvDirectShowInclude
在引用目录下面有一个库目录,添加DirectShow的Lib文件夹,我添加的是D:opencvDirectShowLib;
下载CCameraDS类相关文件,点击下载。解压以后把CameraDS.h,复制到已经配置好OpenCV库的工程中,并添加到工程中。在解决资源管理器中,头文件和源文件分别右键添加现有项,把CCameraDS的头文件和源文件添加进去
main函数写入如下内容
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include "CameraDS.h"
using namespace cv;
int main()
{
int cam_count;
//仅仅获取摄像头数目
cam_count = CCameraDS::CameraCount();
printf("There are %d cameras.n", cam_count);
}
编译,error,一个一个解决
fatal error C1083: 无法打开包括文件:”dxtrans.h”: No such file or
directory
下载的DirectShow包里面没有该头文件,全盘搜索Windows也没有,后来发现使用该头文件的是qedit.h,估计这个文件有问题。直接在网上重新down了一个qedit.h(点击下载),替代了DirectShow自带的qedit.h,路径如下D:opencvDirectShowIncludeqedit.h。其它解决方法参考这里,也有效果
fatal error C1010:在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “StdAfx.h””?
在最上面一行添加#include "StdAfx.h"即可
运行,结果如下:
改写main函数,显示两个摄像头内容
int main()
{
int cam_count;
//仅仅获取摄像头数目
cam_count = CCameraDS::CameraCount();
printf("There are %d cameras.n", cam_count);
//获取所有摄像头的名称
for(int i=0; i < cam_count; i++)
{
char camera_name[1024];
int retval = CCameraDS::CameraName(i, camera_name,
sizeof(camera_name) );
if(retval >0)
printf("Camera #%d's Name is '%s'.n", i, camera_name);
else
printf("Can not get Camera #%d's name.n", i);
}
if(cam_count==0)
return -1;
CCameraDS camera1, camera2;
//手动打开摄像头
// if(! mera(0, true)) //弹出属性选择窗口
// {
// fprintf(stderr, "Can not open camera1.n");
// return -1;
// }
// if(! mera(1, true)) //弹出属性选择窗口
// {
// fprintf(stderr, "Can not open camera2.n");
// return -1;
// }
//自动打开摄像头
if(! mera(0, false, 320, 240)) //不弹出属性选择窗口,用代码制定图像宽和高
{
fprintf(stderr, "Can not open camera1.n");
return -1;
}
if(! mera(1, false, 320, 240))//不弹出属性选择窗口,用代码制定图像宽和高
{
fprintf(stderr, "Can not open camera2.n");
return -1;
}
while(1)
{
//获取一帧
IplImage *pFrame1 = rame();
IplImage *pFrame2 = rame();
//显示
cvShowImage("camera1", pFrame1);
cvShowImage("camera2", pFrame2);
if (cvWaitKey(20) == 'q')
break;
}
amera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头
cvDestroyWindow("camera1");
amera();
cvDestroyWindow("camera2");
return 0;
}
运行结果如下:
3.总结
版权声明:本文标题:基于DirectShow的多摄像头视频采集 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1708390483h522324.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论