【整理】同一Hub 同时显示一块板上的两个USB摄像头

很多文章提到了双目相机的驱动 以及DirectShow SDK的安装,但是我在实际的操作中还是遇到了许多问题

目前解决了一部分,先在总结如下,供大家参考。

 

针对单Hub,就是2个摄像头共用一个USB接口

1.编译BaseClasses工程,才能生成我们需要的基本库baseclasses

生成→生成BaseClass

路径:F:\Program Files (x86)\opencv\DirectShow\Samples\C++\DirectShow\BaseClasses

Debug_Unicode目录下将产生相应的库

路径:F:\Program Files (x86)\opencv\DirectShow\Samples\C++\DirectShow\BaseClasses\Debug_Unicode

 

2.以Amcap为例,将DirectShow SDK集成到我们的项目工程

1.没有配置opencv 直接按照文档测试()

在包含目录中添加

 

DirectShow\Include; DirectShow\Samples\C++\DirectShow\BaseClasses;

n 在库目录中添加

DirectShow\Lib; DirectShow\Samples\C++\DirectShow\BaseClasses\Debug_Unicode; 在“配置属性-->链接器目录”中进行操作:

n 在附加库目录中添加

DirectShow\Samples\C++\DirectShow\BaseClasses\Debug_Unicode; DirectShow\Lib;

点击工程“右键-->清理-->生成”,将生成exe可执行文件,即可调试。至此已成功搭建了DirectShow的开发环境。

3.DirectShow SDK开发环境的搭建

在VS2013中导入并编译 DirectShow SDK 安装路径下\ Samples\C++\DirectShow \BaseClasses 工程,可以编译为debug版本,也可以编译release 版本。 编译成功后在\Samples\C++\DirectShow\BaceClasses\Debug_Unicode\目录下将产生相应的库。 将DirectShow SDK集成到我们的项目工程,以Amcap为例: 在VS2013中导入Amcap源码,右键点击工程选择 “属性-->配置属性-->VC++目录”中进行操作:
 在包含目录中添加
DirectShow\Include; DirectShow\Samples\C++\DirectShow\BaseClasses;
 在库目录中添加
DirectShow\Lib; DirectShow\Samples\C++\DirectShow\BaseClasses\Debug_Unicode; 在“配置属性-->链接器目录”中进行操作:
 在附加库目录中添加
DirectShow\Samples\C++\DirectShow\BaseClasses\Debug_Unicode; DirectShow\Lib; 点击工程“右键-->清理-->生成”,将生成exe可执行文件,即可调试。至此已成功搭建了DirectShow的开发环境。

这一部分最后直接将DirectShow整个文件(不是子文件)放到你的工程里面去,然后在进行添加,我的整个目录如下(比较长)

F:\documents13\visual studio 2013\Projects\BV_test_0508\BV_test_0508\DirectShow\Samples\C++\DirectShow\BaseClasses

 

ps:配置前默认已经在vs中配置好了opencv(配置参考链接http://johnhany.net/2013/11/environment-for-opencv-with-vs2010/)

=========================到此为止都是测试环境是否搭建好=======

1、将编译完成的BaseClasses的DirectShow拷贝到目标项目

2、在目标项目中按照amcap中添加路径方法,配置环境

3、拷贝压缩包中.h .cpp文件进行编译

主函数如下:

 

 


// CaptureTwoCamera.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
#include <highgui.h>
#include "stdafx.h"
#include "CameraDS.h"


int _tmain(int argc, _TCHAR* argv[])
{
	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;
	CCameraDS camera2;

	//打开第一个摄像头
	//if(! camera.OpenCamera(0, true)) //弹出属性选择窗口 我的摄像头默认不是MJPEG 需要调一下(代码?本王不会啊!)有些人说到能显示一个另外一个是一个灰色的图有可能是格式的问题
	if (!camera1.OpenCamera(0, true, 320, 240)) //弹出属性选择窗口,用代码制定图像宽和高
	{
		fprintf(stderr, "Can not open camera1.\n");
		return -1;
	}
	if (!camera2.OpenCamera(1, true, 320, 240)) //弹出属性选择窗口,用代码制定图像宽和高
	{
		fprintf(stderr, "Can not open camera2.\n");
		return -1;
	}

	cvNamedWindow("camera1");
	cvNamedWindow("camera2");
	while (1)
	{
		//获取一帧
		IplImage *pFrame1 = camera1.QueryFrame();
		IplImage *pFrame2 = camera2.QueryFrame();
		//显示
		/*cvShowImage("camera", pFrame);

		if (cvWaitKey(20) == 'q')
		break;*/
		//cvShowMultiImages( "Multiple Cameras", 2, pFrame1, pFrame2);
		//cvReleaseImage(&frame1); 
		//cvReleaseImage(&frame2);
		cvShowImage("camera1", pFrame1);
		cvShowImage("camera2", pFrame2);
		if (cvWaitKey(20) == 'q')
			break;
	}
	//camera.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头
	camera1.CloseCamera();
	camera2.CloseCamera();

	cvDestroyWindow("camera1");
	cvDestroyWindow("camera2");
	return 0;
}


 

 

 

 

相关文件打包发到百度网盘 https://pan.baidu.com/s/1eR9Gt6i 提取码986e

 

关键是环境的配置一定要仔细

 

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值