MFC中使用OpenCV显示摄像头图像

来源:互联网 发布:淘宝蚕丝面膜美即 编辑:程序博客网 时间:2024/05/17 23:08

 之前一直想在MFC上学习,但是苦于对一些算法的研究花了比较多的时间,现在回头来学习MFC,学习的内容比较简单,只是简单的显示摄像头的图像,

以下是我程序的界面部分:

image

这里其实需要往MFC里面添加的有以下几部分:

1、将IplImage画到DC;

2、设置计时器以便能够持续抓到帧;

3、增加OnClose来释放摄像头及计时器。

1>、将IplImage的格式draw到DC中,使用的CvvImage类(地址:http://blog.chinaunix.net/uid-26020768-id-3198250.html),这个类在高版本的OpenCV被和谐掉了,失去了一种比较好的方法。你要使用就需要添加CvvImage的源文件就好。

这里简单些一个函数来实现:

// 将图片DRAW到DCvoid CShowCaptureDlg::drawToDC(IplImage* image, UINT ID){    CDC* pDC = GetDlgItem(ID)->GetDC();    HDC pHdc = pDC->GetSafeHdc();    CRect rect;    GetDlgItem(ID)->GetClientRect(&rect);    CvvImage cimg;    cimg.CopyOf(image);    cimg.DrawToHDC(pHdc, rect);    ReleaseDC(pDC);}

2>、设置计时器的目的是能够持续的显示连续的视频图像,用的MFC中的setTimer和WM_TIMER来实现,这里不讲述他们的原理了。先给出Open按钮的代码:

void CShowCaptureDlg::OnBnClickedOpenCamera(){    // TODO: 在此添加控件通知处理程序代码        if(!pCapture)    {        pCapture = cvCaptureFromCAM(-1);        pFrame = cvQueryFrame(pCapture);        drawToDC(pFrame, IDC_CAPTURE);    }    SetTimer(ID_TIMER1, 10, NULL);    }

你看到了一个setTimer()的函数,没错,就是这里添加一个计时器,Deal按钮也需要添加计时器:

void CShowCaptureDlg::OnBnClickedProcess(){    // TODO: 在此添加控件通知处理程序代码    SetTimer(ID_TIMER2, 10, NULL);}

添加计时器以后,你需要把计时器的消息传递给WM_TIMER,需要在类向导里面添加:类视图-》CShowCaptureDlg右键-》属性,然后你可以再属性类表中找到消息,你就可以在WM_TIMER中添加OnTimer来响应计时器了。不懂得可以看下图:

image    image          image

OnTimer的代码:

void CShowCaptureDlg::OnTimer(UINT_PTR nIDEvent){    // TODO: 在此添加消息处理程序代码和/或调用默认值    switch(nIDEvent)    {    case ID_TIMER1:        {                    if(m_bOpenCamera)            {                pFrame = cvQueryFrame(pCapture);                drawToDC(pFrame, IDC_CAPTURE);            }            break;        }            case ID_TIMER2:        {            IplImage* pGray = cvCreateImage(cvGetSize(pFrame), 8, 1);            cvCvtColor(pFrame, pGray, CV_BGR2GRAY);            cvThreshold(pGray, pGray, 100, 255, CV_THRESH_BINARY);            drawToDC(pGray, IDC_DEAL);            break;        }    }    CDialog::OnTimer(nIDEvent);}

这样,就可以抓到视频了,但是我们还必须做的是清理动作,同样,在WM_CLOSE添加OnClose代码:

void CShowCaptureDlg::OnClose(){    // TODO: 在此添加消息处理程序代码和/或调用默认值    cvReleaseCapture(&pCapture);    KillTimer(ID_TIMER1);    KillTimer(ID_TIMER2);    CDialog::OnClose();}

这样,完整的MFC显示摄像头就完成了。如果还有不懂得请留言,本部分适合新手,大牛请飘过。

0 0
原创粉丝点击