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顯示攝像頭就完成了。如果還有不懂得請留言,本部分適合新手,大牛請飄過。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM