利用MFC來顯示攝像頭並拍照


今天是第一次嘗試寫一個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.在類向導里面添加,或者在下面的屬性窗口添加

 

 

                                        

                                                

 


免責聲明!

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



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