今天是第一次嘗試寫一個MFC程序。水了一天,終於寫好了。總結一下。
一、配置環境
調用攝像頭是通過opencv庫進行的,所以首先要配置好opencv 的環境。這個可以通過這個鏈接進行配置。
https://blog.csdn.net/qq_41175905/article/details/80560429
需要注意的幾點:
1.在vs2017屬性管理器中配置路徑時,配置x64文件夾是代表MFC運行在64位系統上的,Win32(x86)是代表MFC運行在32位系統上的,所以要根據生成MFC的運行環境來進行配置。
2.這個教程應該是完全可以配置成功的。
3.需要注意的是,opencv3.0以上的版本是沒有x86的庫,可以用cmake進行編譯生成,但是我沒嘗試成功,可以下載低版本,配置方法稍微不點不同。
二、搭建整體框架
利用vs2017生成MFC框架。然后在資源視圖上,進行整體的規划。我設計的樣式如圖:
這里需要注意的點:
1.每個控件的ID,自己要修改命名。注意要能容易辨別出來。
2.添加控件變量時,會在類中自動添加。將變量與控件相互綁定起來。需要利用函數 :UpdateData();TRUE表示從控件傳給變量,FALSE表示從變量傳給控件。默認值是TRUE,即從控件傳給變量。
三、事件處理函數。
在資源視圖上雙擊需要添加事件處理函數的控件。進入源代碼中進行編寫程序。這個demo中主要是進行了“打開攝像頭”和“拍照”的事件處理。同時也添加了定時器的事件處理函數。主要源代碼如下
void CMFCCameraDlg::OnBnClickedOpencam() { // TODO: 在此添加控件通知處理程序代碼 //double m_observe_z[8]; Mat frame; cap.open(0); //for (int ii = 0; ii< 50;ii++) //{ cap >> frame; CDC* pDC = GetDlgItem(IDC_ShowImage)->GetDC();//得到圖片控件的指針對象。 HDC hDC = pDC->GetSafeHdc();//得到可以操作的句柄。這種形式類似於 CWND 和HWND //IplImage img = frame; CImage cimg; MATTOCIM mattocim; //自己定義的一個類,實現功能主要是CImage與Mat格式相互轉換。 mattocim.MatToCImage(frame, cimg);//Mat格式轉為 CImage類型。 CRect rect; GetDlgItem(IDC_ShowImage)->GetClientRect(&rect); cimg.Draw(hDC,rect); ReleaseDC(pDC); SetTimer(1, 1, NULL); //imshow("調用攝像頭", frame); //waitKey(30); //} } void CMFCCameraDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息處理程序代碼和/或調用默認值 Mat frame; //for (int ii = 0; ii< 50;ii++) //{ cap >> frame; CDC* pDC = GetDlgItem(IDC_ShowImage)->GetDC(); HDC hDC = pDC->GetSafeHdc(); //IplImage img = frame; CImage cimg; MATTOCIM mattocim; mattocim.MatToCImage(frame, cimg); CRect rect; GetDlgItem(IDC_ShowImage)->GetClientRect(&rect); cimg.Draw(hDC, rect); ReleaseDC(pDC); //SetTimer(1, 10, NULL); CDialogEx::OnTimer(nIDEvent); } void CMFCCameraDlg::OnBnClickedTakephoto() { Mat frame; //for (int ii = 0; ii< 50;ii++) //{ cap >> frame; imwrite("1.bmp", frame); KillTimer(1); cap.release(); // TODO: 在此添加控件通知處理程序代碼 }
需要注意的點:
1.在前面的MFC編程基礎中,我們已經提到了消息映射表。vs2017中會自動為我們添加這個映射表。
2.定時器事件需要自己手動增加。增加的步驟是:
1.打開類視圖
2.打開后,右鍵對話框類
3.在類向導里面添加,或者在下面的屬性窗口添加