win7下VS2012配置DirectShow+Opencv并且多摄像头采集

配置环境:win7 64位旗舰版+VS2012+opencv2.4.9+Directshow


1.首先下载opencv2.4.9和配置opencv2.4.9。网上配置的方法很多,此处不再说明。

2.下载DirectShow,下载后解压。比如解压路径为:D:\DirectShow;

3.配置VS2012项目的属性:

             A.在"VC++目录"的"可执行文件目录"中添加D:\DirectShow\bin

             B.在"VC++目录"的"包含目录"中添加D:\DirectShow\include

             C.在"VC++目录"的"库目录"中添加D:\DirectShow\lib

             D.把D:\DirectShow\include中的"CameraDS.h"、"CameraDS.cpp"复制到项目当前目录下,并加载到项目的"头文件"、"源文件"中,如下图:

3.修改winNT.h

       以管理员身份(开始->所有程序->附件->命令提示符(右键,以管理员身份打开,然后打开目标文档))打开C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include目录

       在winNT.h文件第290行左右的如下两行

       typedef void *PVOID;

       typedef void *POINTER_64 PVOID64;

      之前添加:

      #define POINTER_64 __ptr64

4.添加主程序

程序如下:

#include <stdio.h>

#include "camerads.h"

#include <highgui.h>

const char *g_szTitle = "Camera";

int main()
{
	int m_iCamCount = CCameraDS::CameraCount();
	printf("There are %d cameras.\n", m_iCamCount);

	if(m_iCamCount == 0)
	{
		return (-1);
	}

	CCameraDS m_CamDS0;
	CCameraDS m_CamDS1;

	IplImage *pFrame0 = NULL;
	IplImage *pFrame1 = NULL;
	IplImage *pFrame2 = NULL;

	m_CamDS0.OpenCamera(0, false, 320, 240);
	m_CamDS1.OpenCamera(1, false, 320, 240);

	cvNamedWindow("video0");
	cvNamedWindow("video1");

	while(1)
	{
		//获取一帧
		pFrame0 = m_CamDS0.QueryFrame();

		//显示
		cvShowImage("video0", pFrame0);

		//获取一帧
		pFrame1 = m_CamDS1.QueryFrame();

		//显示
		cvShowImage("video1", pFrame1);

		if (cvWaitKey(20) == 'q')
		{
			break;
		}
	}

	m_CamDS0.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头
	m_CamDS1.CloseCamera();
	cvDestroyWindow("video0");
	cvDestroyWindow("video1");


	return 0;
}

程序实现同时控制2个摄像头采集图像。效果如下:


当尝试用相同的方式去打开第三个摄像头的时候,程序便产生异常报错

即当采用如下程序时,无法打开摄像头。

#include <stdio.h>

#include "camerads.h"

#include <highgui.h>

const char *g_szTitle = "Camera";

int main()
{

	int m_iCamCount = CCameraDS::CameraCount();
	printf("There are %d cameras.\n", m_iCamCount);

	if(m_iCamCount == 0)
	{
		return (-1);
	}

	CCameraDS m_CamDS0;
	CCameraDS m_CamDS1;
	CCameraDS m_CamDS2;

	IplImage *pFrame0 = NULL;
	IplImage *pFrame1 = NULL;
	IplImage *pFrame2 = NULL;

	m_CamDS0.OpenCamera(0, false, 320, 240);
	m_CamDS1.OpenCamera(1, false, 320, 240);
	m_CamDS1.OpenCamera(2, false, 320, 240);
	cvNamedWindow("video0");
	cvNamedWindow("video1");
	cvNamedWindow("video2");//cvNamedWindow("video1");
	//显示


	while(1)
	{
		//获取一帧
		pFrame0 = m_CamDS0.QueryFrame();

		//显示
		cvShowImage("video0", pFrame0);

		//获取一帧
		pFrame1 = m_CamDS1.QueryFrame();

		//显示
		cvShowImage("video1", pFrame1);

		//获取一帧
		pFrame2 = m_CamDS2.QueryFrame();

		//显示
		cvShowImage("video2", pFrame2);
		if (cvWaitKey(20) == 'q')
		{
			break;
		}
	}

	m_CamDS0.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头
	m_CamDS1.CloseCamera();
	m_CamDS2.CloseCamera();
	cvDestroyWindow("video0");
	cvDestroyWindow("video1");
	cvDestroyWindow("video2");

	return 0;
}

不能用以上程序同时打开3个摄像头,于是改变思路,修改程序,新程序如下:

#include <stdio.h>

#include "camerads.h"

#include <highgui.h>

const char *g_szTitle = "Camera";

int main()
{
	// 1、考虑到已经存在了显示图像的窗口,那就不必再次驱动摄像头了,即便往下驱动那也是摄像头已被占用。
	//if(IsWindowVisible(FindWindow(NULL, g_szTitle)))
	//{
	//	return (-1);
	//}

	//仅仅获取摄像头数目
	int m_iCamCount = CCameraDS::CameraCount();
	printf("There are %d cameras.\n", m_iCamCount);

	if(m_iCamCount == 0)
	{
		return (-1);
	}

	CCameraDS m_CamDS0;
	CCameraDS m_CamDS1;
//	CCameraDS m_CamDS2;

	IplImage *pFrame0 = NULL;
	IplImage *pFrame1 = NULL;
//	IplImage *pFrame2 = NULL;


//	m_CamDS0.OpenCamera(0, false, 320, 240);
//	m_CamDS1.OpenCamera(1, false, 320, 240);
//	m_CamDS1.OpenCamera(2, false, 320, 240);
	cvNamedWindow("video0");
	cvNamedWindow("video1");
	cvNamedWindow("video2");//cvNamedWindow("video1");

	while(1)
	{
		m_CamDS0.OpenCamera(0, false, 320, 240);
		pFrame0 = m_CamDS0.QueryFrame();//获取一帧
		cvShowImage("video0", pFrame0);//显示
		m_CamDS0.CloseCamera();
		
		m_CamDS1.OpenCamera(1, false, 320, 240);
		pFrame1 = m_CamDS1.QueryFrame();//获取一帧
		cvShowImage("video1", pFrame1);//显示
		m_CamDS1.CloseCamera();
		
		m_CamDS0.OpenCamera(2, false, 320, 240);
		pFrame0 = m_CamDS0.QueryFrame();//获取一帧
		cvShowImage("video2", pFrame0);//显示
		m_CamDS0.CloseCamera();
	
		//获取一帧
		//pFrame2 = m_CamDS2.QueryFrame();

		//显示
		//cvShowImage("video2", pFrame2);
		if (cvWaitKey(400) == 'q')
		{
		    break;
		}
	}

	m_CamDS0.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头
	m_CamDS1.CloseCamera();
//	m_CamDS2.CloseCamera();
	cvDestroyWindow("video0");
	cvDestroyWindow("video1");
	cvDestroyWindow("video2");

	return 0;
}

以上程序思路为:打开一个摄像头后,采集图像然后关闭该摄像头,接着再去打开另一个摄像头,另一个摄像头打开后采集完图像再关闭,然后再打开了第一个摄像头。

但是,摄像头采集的视频很卡,效果不好。

程序效果如下:






  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值