之前一直想在MFC上學習,但是苦於對一些算法的研究花了比較多的時間,現在回頭來學習MFC,學習的內容比較簡單,只是簡單的顯示攝像頭的圖像,
以下是我程序的界面部分:
這里其實需要往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來響應計時器了。不懂得可以看下圖:
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顯示攝像頭就完成了。如果還有不懂得請留言,本部分適合新手,大牛請飄過。