改用DirectShow+Opencv解决外置单USB接口的双目摄像头调用cv::VideoCapture打不开的问题

12 篇文章 1 订阅

最近在做windows人脸识别的项目中遇到一个很纳闷的问题,采用OpenCv库的VideoCapture打不开外置单USB双目摄像头,其他的只要是一个摄像头一跟USB就可以打开,在网上找了很多资料,七七八八的最终得以解决了,在这整理下。

环境:win7+vs2013+opencv 3.0.0+DirectShow。
相关资源在网上都能找到,下载下来做如下配置:

 

把D:\DirectShow\include中的"CameraDS.h"、"CameraDS.cpp"复制到项目当前目录下,并加载到项目的"头文件"、"源文件"中。在winNT.h文件的 typedef void *PVOID;之后加入如下行代码
  typedef void *POINTER_64 PVOID64;

错误:
error C2872: “ACCESS_MASK”: 不明确的符号
原因:using namespace cv和windows中的名称冲突,建议不要使用using namespace cv, 改用cv::Mat;
网址http://blog.csdn.net/sdlkjtz/article/details/69260382)

找不到cxcore.h文件:因为我用的是opencv3.0.0,CameraDS.h默认的是opencv2.4.9,作如下修改

旧库文件都在opencv/文件夹下,用opencv/cxcore.h替换cxcore.h 。
 


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

	//获取所有摄像头的名称
	for (int i = 0; i < cam_count; i++)
	{
		char camera_name[1024] = {'\0'};
		std::string strCam_name = "";
		int retval = CCameraDS::CameraName(i, camera_name, sizeof(camera_name));
		if (retval >0){
			strCam_name = camera_name;
			if (strCam_name == CAM_COL_NAME || strCam_name == "USB2.0_CAM1"){ cam_id_col = i; }
			if (strCam_name == CAM_IR_NAME || strCam_name == "USB2.0_CAM2"){ cam_id_ir = i; }
		}
		
	}
	if (cam_count == 0) return -1;
	//打开第一个摄像头
	if (!m_cameraCol.OpenCamera(cam_id_col, true, 480, 640)) //弹出属性选择窗口,用代码制定图像宽和高
	{
		AfxMessageBox(CString("无法打开摄像头1"));
		return -1;
	}
	if (!m_cameraIr.OpenCamera(cam_id_ir, true, 480, 640)) //弹出属性选择窗口,用代码制定图像宽和高
	{
		AfxMessageBox(CString("无法打开摄像头2"));
		return -1;
	}
	// 设置计时器,每10ms触发一次事件
	SetTimer(1, 30, NULL);
	//SetTimer(2, 500,NULL);
	//启动识别线程
	m_PrsApiHandle->ThreadBegin();
	return 0;
}

以上代码可以打开单USB双目摄像头,但是也存在问题:调用OpenCamera(cam_id_col, true, 480, 640))时,true改成false,即不弹出属性设置对话框只能打开一个摄像头,单步调试OpenCamera接口到 如下if(iconfig->GetFormat(&pmt) !=S_OK)总是returnfalse。哪位大侠遇到这样的问题呢?

AM_MEDIA_TYPE* pmt;    
if(iconfig->GetFormat(&pmt) !=S_OK) 
{
   //printf("GetFormat Failed ! \n");
   return   false;   
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值