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);//不使用计时器
}
到此打开摄像头显示图像,暂停功能都进行了实现,暂停后仍要继续运行则点击打开摄像头控件即可。
显示效果如下: