vs2017+opencv在MFC中显示摄像头

添加ontimer函数

我是用的定时器来显示视频。先说一下我理解的原理,opencv首先通过读取摄像头的一帧画面,显示到picture控件里,然后启动定时器,每隔一段时间触发一次,每次都读取一帧显示到picture控件中。
使用定时器需要做以下步骤:
1.打开定时器
SetTimer(1, 25, NULL);其中1表示定时器id,25表示间隔25ms触发一次。第三个参数暂时不知道,但因为我们的函数调用是在Dlg内调用,可以直接写为NULL;
2.编写ontimer函数
先打开 视图->类向导->消息。然后选择如下,最后点编辑程序即可
vs2017+opencv在MFC中显示摄像头_第1张图片
然后你就可以在Dlg.c里找到ontimer函数了。
3.关闭定时器
KillTimer(1);参数就是你刚才使用的定时器编号。

编写函数

1.需要先在Dlg.c开头定义以下几个变量。

//定义图片和视频显示用到的一些类
CvCapture* Capture;//保存图像捕获信息
Mat v_frame;//cvmat对象
Mat m_grabframe;

也可以定义在Dlg的class的else里面

2.在MFC对应的按钮控件函数里写以下函数

void CMFC1Dlg::OnBnClickedButton1()//打开摄像头
{
	// TODO: 在此添加控件通知处理程序代码
	
	Capture = cvCreateCameraCapture(1);								//打开摄像头
	if (Capture == 0)
	{
		MessageBoxA(NULL, "无法打开摄像头", "ss", IDOK);
		return;
	}
	v_frame = cvQueryFrame(Capture);								//从摄像头或者文件中抓取并返回一帧  
	normalize(v_frame, m_grabframe, 0, 255, NORM_MINMAX, -1);		//将mat数据归一化到0—255内   
	DrawPicToHDC(m_grabframe, IDC_Cameral);							//显示到设备的矩形框内  

	SetTimer(1, 25, NULL);											//定时器,定时时间和帧率一致 

}

其中normalize函数有些摄像头应该是不用的,我看别人写的有些就没用,我的不用不行。定时器也是在这里打开。
Capture = cvCreateCameraCapture(1); 这句打开的是外部摄像头,如果要打开内部的将1改为0.

3.编写ontimer函数

//定时器事件处理
void CMFC1Dlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	switch (nIDEvent)
	{
	case 1:
	{
		v_frame = cvQueryFrame(Capture);							//从摄像头或者文件中抓取并返回一帧  
		v_frame.copyTo(m_grabframe);								//复制该帧图像   
		DrawPicToHDC(m_grabframe, IDC_Cameral);						//显示到设备的矩形框内  
	}
	}


	CDialogEx::OnTimer(nIDEvent);
}

这里就一直获取图片,显示图片就行了
4.关闭摄像头

//关闭摄像头
void CMFC1Dlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码

	if (!Capture)													//判断摄像头状态
	{
		MessageBoxA(NULL, "没有打开摄像头!!", "ss", IDOK);
		return;
	}

	cvReleaseCapture(&Capture);

	v_frame = cvLoadImage("E:\\man_picture\\1.jpg");				//图片读取路径可以自己设定  
	v_frame.copyTo(m_grabframe);									//复制该帧图像    
	DrawPicToHDC(m_grabframe, IDC_Cameral);							//显示到设备的矩形框内   
	KillTimer(1);													//关闭定时器
}

这里需要最后加载的图片是初始化的那张图片,为了使界面好看一点。同时在这里需要关闭定时器。

最后,这里面的函数DrawPicToHDC,就是显示图片的一个函数,需要请见:https://blog.csdn.net/XHL_CSDN_DOW/article/details/104941231
到这就可以显示了:
vs2017+opencv在MFC中显示摄像头_第2张图片
vs2017+opencv在MFC中显示摄像头_第3张图片

你可能感兴趣的:(vs2017+opencv在MFC中显示摄像头)