[opencv]MFC打开摄像头显示图像

1.创建基于对话框的MFC项目。

2.opencv的相关配置见http://blog.csdn.net/kingcooper/article/details/50769894

3.MFC下使用opencv。

由于opencv2.2以后取消了CvvImage类,所以需要在项目中分别添加CvvImage.h和CvvImage.cpp。
在头文件中添加CvvImage.h文件,在源文件中添加CvvImage.cpp,在...Dlg.cpp源文件中添加
#include "CvvImage.h"
#include "cv.h"
#include "highgui.h"
using namespace cv;
using namespace std;
Mat frame;
CvvImage cimg1;
VideoCapture cap(0);

4.编辑窗口

对对话框进行控件添加,得到如下结果:

有时窗口编辑界面找不到,点击至资源视图-项目名-项目名.rc*-Dialog-IDD_MFC_Dialog,双击即可。

5.添加代码

更改打开摄像头控件ID为IDC_opencamera,更改暂停控件ID为IDC_pause,更改图像控制Picture Control的ID为IDC_frame。
双击打开摄像头控件生成事件处理函数,添加代码如下:
void CMFC打开摄像头显示图像Dlg::OnBnClickedopencamera()
{
	// TODO:  在此添加控件通知处理程序代码
	CDC *pDC = GetDlgItem(IDC_frame)->GetDC();//根据ID获得窗口指针再获取与该窗口关联的上下文指针	 
	HDC hdc = pDC->GetSafeHdc();                      // 获取设备上下文句柄	 
	CRect rect;// 矩形类   
	GetDlgItem(IDC_frame)->GetClientRect(&rect); 

	if (cap.isOpened())
	{
		cap >> frame;
		IplImage img1 = IplImage(frame);
		cimg1.CopyOf(&img1);
		cimg1.DrawToHDC(hdc, &rect);
		SetTimer(1, 1, NULL);//第一个1为计时器名称,第二个为时间间隔,单位毫秒
	}
}
由于opencv的waitKey不能有效使用,这里使用SetTimer函数,需要添加计时器以实现循环。
添加计时器:类向导-消息-WM-TIMER,双击添加OnTimer函数,如下
void CMFC打开摄像头显示图像Dlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值

	CDialogEx::OnTimer(nIDEvent);
}
添加程序如下
void CMFC打开摄像头显示图像Dlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	CDC *pDC = GetDlgItem(IDC_frame)->GetDC();//根据ID获得窗口指针再获取与该窗口关联的上下文指针	 
	HDC hdc = pDC->GetSafeHdc();                      // 获取设备上下文句柄	 
	CRect rect;// 矩形类   
	GetDlgItem(IDC_frame)->GetClientRect(&rect); 

	if (cap.isOpened())
	{
		cap >> frame;
		IplImage img1 = IplImage(frame);
		cimg1.CopyOf(&img1);
		cimg1.DrawToHDC(hdc, &rect);
		SetTimer(1, 10, NULL);
	}
	CDialogEx::OnTimer(nIDEvent);
}
此时,第一个控件打开摄像头显示图像的功能便可实现了。
双击暂停控件产生事件处理函数,添加程序如下:
void CMFC打开摄像头显示图像Dlg::OnBnClickedpause()
{
	// TODO:  在此添加控件通知处理程序代码
	KillTimer(1);//不使用计时器
}
到此打开摄像头显示图像,暂停功能都进行了实现,暂停后仍要继续运行则点击打开摄像头控件即可。
显示效果如下:


评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值