很多文章提到了双目相机的驱动 以及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
#include
#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
关键是环境的配置一定要仔细