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