MFC (VS2019)+ OpenCV,顯示圖片的3種方法
- 1 方法介紹
- 2 方法一:嵌套OpenCV窗口顯示圖片
-
- 2.1 建立供工程 添加控件
- 2.2 引用頭文件
- 2.3 找到OnInitDialog()函數,在其中添加如下代碼
- 2.4 在button觸發函數中加入代碼(就是你雙擊button進入的函數)
- 2.5 注意事項
- 3 方法二: 轉換圖片格式
-
- 3.1 MatToCImage格式轉換 定義
- 3.2 OnPaint() 添加代碼 畫出圖像
- 4 方法三: OpenCV圖片保存后,再用FMC讀取顯示
-
- 4.1 添加代碼
- 4.2 為什么要先保存在讀取呢?
1 方法介紹
1、嵌套。 直接將OpenCV窗口嵌套到MFC的Pictrue Control控件中。此方法既能直接顯示圖片,也可直接使用OpenCV的鼠標按鍵事件,但對于鼠標滾輪事件只能使用MFC本地的滾輪函數。
2、轉換。 將OpenCV讀取或處理的圖片轉換格式,使之成為MFC的Pictrue Control控件可顯示的圖片格式。此方法每刷新一次圖片便需要轉換格式一次,比較麻煩,且只能使用MFC的鼠標事件。
3、保存。 將OpenCV讀取或處理的圖片保存為本地圖片,然后用MFC讀取圖片的方法讀取并顯示。此方法是笨方法,在特定情況下使用,保存和讀取圖片比較耗時,但無需轉換格式,同樣只能使用MFC的鼠標事件。
2 方法一:嵌套OpenCV窗口顯示圖片
嵌套。直接將OpenCV窗口嵌套到MFC的Pictrue Control控件中。此方法既能直接顯示圖片,也可直接使用OpenCV的鼠標按鍵事件,但對于鼠標滾輪事件只能使用MFC本地的滾輪函數。
2.1 建立供工程 添加控件
新建工程,命名為 showRealVideo,創建好之后,自動生成以下文件
打開對話框后,
在工具箱選擇picture control控件,并拖到對話框內,(右鍵修改屬性),修改ID為IDC_PICTURE_STATIC
,
添加一個Button按鈕,修改ID為IDC_PICTURE_BUTTON
,描述文字為 “顯示圖像”
雙擊button (“顯示圖像”)按鈕,之后可以進入****Dlg.cpp,在里面進行如下修改代碼
編寫代碼,只需修改MFCApplication1Dlg.cpp文件。
具體修改步驟如下:
2.2 引用頭文件
在showRealVideoDlg.cpp中 添加opencv頭文件
#include <opencv2/opencv.hpp>
//cvGetWindowHandle("ImageShow");//嵌套opencv窗口,需要使用下面頭文件
#include<opencv2/highgui/highgui_c.h>
2.3 找到OnInitDialog()函數,在其中添加如下代碼
// TODO: 在此添加額外的初始化代碼cv::namedWindow("ImageShow");//創建OpenCV窗口HWND hWnd = (HWND)cvGetWindowHandle("ImageShow");//嵌套opencv窗口HWND hParent = ::GetParent(hWnd);::SetParent(hWnd,GetDlgItem(IDC_PICTURE_STATIC)->m_hWnd);::ShowWindow(hParent,SW_HIDE);
2.4 在button觸發函數中加入代碼(就是你雙擊button進入的函數)
void CshowRealVideoDlg::OnBnClickedPictureButton()
{// TODO: 在此添加控件通知處理程序代碼cv::Mat img = cv::imread("D:\\Projects\\test_Images\\9.jpg");CRect rect;CWnd* pWnd = GetDlgItem(IDC_PICTURE_STATIC);//獲取picture control控件pWnd->GetClientRect(&rect);//控制圖片的大小cv::resize(img, img, cv::Size(rect.Width(), rect.Height()));//將圖片resize,適用窗口尺寸imshow("ImageShow", img);}
2.5 注意事項
如果圖片沒有resize,那么圖片將以原尺寸顯示,不會自適應窗口大小;
超出窗口以外的尺寸,就不會顯示。
void CshowRealVideoDlg::OnBnClickedPictureButton()
{// TODO: 在此添加控件通知處理程序代碼cv::Mat img = cv::imread("D:\\Projects\\test_Images\\9.jpg");CWnd* pWnd = GetDlgItem(IDC_PICTURE_STATIC);//獲取picture control控件imshow("ImageShow",img);
}
也可以將代碼全部寫在Button按鈕函數中,
即將OnInitDialog()函數中自己添加的代碼,剪切到OnBnClickedPictureButton()函數里。
3 方法二: 轉換圖片格式
轉換。 將OpenCV讀取或處理的圖片轉換格式,使之成為MFC的Pictrue Control控件可顯示的圖片格式。此方法每刷新一次圖片便需要轉換格式一次,比較麻煩,且只能使用MFC的鼠標事件。
1、新建MFC應用程序、添加Pictrue Control控件(同上)
2、引用頭文件
在showRealVideoDlg.cpp中 添加opencv頭文件,
并聲明函數 void MatToCImage(Mat &mat, CImage &cImage);
#include <opencv2/opencv.hpp>
void MatToCImage(cv::Mat& mat, CImage& cImage);
3.1 MatToCImage格式轉換 定義
//在CshowRealVideoDlg::.cpp最后添加MatToCImage函數定義:
//將OpenCV處理的Mat圖片格式 轉換為MFC的Pictrue Control控件可顯示的CImage格式
void CshowRealVideoDlg