基于网上许多人说到opencv打不开4个摄像头,事实果真如此么,记得哦:opencv是开源的,所以本作者我利用vs2013自己配置了一下opencv与directshow的开发环境,具体要怎么配置我就不详细讲了,上网搜一下就能找得到了,下面我详细讲一下如何将mfc和多线程与opencv和directshow结合实现4个摄像头同步采集图像,本作者正读大二,能力有限,有更好的方法也告诉我一下哈。
一.先在mfc上把界面先布局好如下图
将布局好的界面稍微改一下相关的属性值
1-1将显示摄像头区域的ID分别改为:
IDC_Camera1
IDC_Camera2
IDC_Camera3
IDC_Camera3
1-2将控制摄像头开关和关闭界面的控件ID分别改为:
IDC_Capture1
IDC_Capture2
IDC_Capture3
IDC_Capture4
IDCANCEL
二.在对话框的头文件里添加4个线程句柄和打开4个摄像头和一个关闭界面的响应函数:
//创建4个线程句柄
protected:
HANDLE h1;
HANDLE h2;
HANDLE h3;
HANDLE h4;
// 创建打开摄像头和关闭界面的映射函数
public:
afx_msg void OnBnClickedCancel();
afx_msg void OnBnClickedCapture1();
afx_msg void OnBnClickedCapture2();
afx_msg void OnBnClickedCapture3();
afx_msg void OnBnClickedCapture4();
三.在对话框的.cpp文件里的OnInitDialog()函数内初始化句柄
3.1定义一些全局变量来获取图片的句柄
//定义一些全局变量来获取图片的句柄
CRect rect1;
CRect rect2;
CRect rect3;
CRect rect4;
CDC* pDC1;
CDC* pDC2;
CDC* pDC3;
CDC* pDC4;
HDC hDC1;
HDC hDC2;
HDC hDC3;
HDC hDC4;
CWnd* pwnd1;
CWnd* pwnd2;
CWnd* pwnd3;
CWnd* pwnd4;
3.2OnInitDialog()函数内初始化句柄
//句柄的初始化
pwnd1 = GetDlgItem(IDC_Camera1);
pDC1 = pwnd1->GetDC();
hDC1 = pDC1->GetSafeHdc();
pwnd1->GetClientRect(&rect1);
pwnd2 = GetDlgItem(IDC_Camera2);
pDC2 = pwnd2->GetDC();
hDC2 = pDC2->GetSafeHdc();
pwnd2->GetClientRect(&rect2);
pwnd3 = GetDlgItem(IDC_Camera3);
pDC3 = pwnd3->GetDC();
hDC3 = pDC3->GetSafeHdc();
pwnd3->GetClientRect(&rect3);
pwnd4 = GetDlgItem(IDC_Camera4);
pDC4 = pwnd4->GetDC();
hDC4 = pDC4->GetSafeHdc();
pwnd4->GetClientRect(&rect4);
四.在对话框源文件里填加4个互斥对象并添加对应的响应函数:
HANDLE hMutex1; //互斥对象1
CCameraDS camera1;//摄像头1
unsigned long _stdcall ThreadP