改用DirectShow+Opencv解決外置單USB接口的雙目攝像頭調用cv::VideoCapture打不開的問題

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章