zoukankan      html  css  js  c++  java
  • MFC中使用OpenCV显示摄像头图像

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

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

    image

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

    1、将IplImage画到DC;

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

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

    1>、将IplImage的格式draw到DC中,使用的CvvImage类,这个类在高版本的OpenCV被和谐掉了,失去了一种比较好的方法。你要使用就需要添加CvvImage的源文件就好。

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

    // 将图片DRAW到DC
    void 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显示摄像头就完成了。如果还有不懂得请留言,本部分适合新手,大牛请飘过。

  • 相关阅读:
    数字三角形
    嵌套矩阵问题
    NKOJ1236 a^b
    历届试题 最大子阵
    【动态规划】最大连续子序列和,最大子矩阵和,最大m子段和
    历届试题 翻硬币
    历届试题 带分数
    用户模板和用户场景
    学习进度——第九周
    最大子数组——回调
  • 原文地址:https://www.cnblogs.com/leven20061001/p/2727865.html
Copyright © 2011-2022 走看看