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

来源:互联网 发布:ubuntu运行loic.exe 编辑:程序博客网 时间:2024/04/30 16:50

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

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

3.MFC下使用opencv。

由于opencv2.2以后取消了CvvImage类,所以需要在项目中分别添加CvvImage.h和CvvImage.cpp。
下载链接:http://download.csdn.net/detail/kingcooper/9450106
在头文件中添加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);//不使用计时器}
到此打开摄像头显示图像,暂停功能都进行了实现,暂停后仍要继续运行则点击打开摄像头控件即可。
显示效果如下:


1 0
原创粉丝点击