最近在做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;
}