在OpenCV中将cv::Mat绘制到MFC的视图中
畢設時遇到了一個問題,不能在MFC中顯示由GrabCut摳出來的圖。經一番折騰發現:
在OpenCV中如果圖像最初是Mat類型的話,就不能通過轉換為IplImage,再轉換為CvvImage來顯示到View里(OpenCV里沒有函數能直接將Mat顯示到View里),只能通過StretchDIBits來繪制。
下面介紹StretchDIBits函數的使用方法:(轉自:在MFC中應用OpenCV(無CvvImage類))
1)創建MFC單文檔項目(我創建了UseOpenCV),設置包含目錄與庫目錄,添加相關附加依賴項。
2)在文檔頭文件(UseOpenCVDoc.h)中添加包含文件
#include #include 添加OpenCV Mat類類型成員變量 m_cvImg,形式如下:
protected: // 僅從序列化創建 CUseOpenCVDoc(); DECLARE_DYNCREATE(CUseOpenCVDoc) cv::Mat m_cvImg;
3)在文檔實現文件(UseOpenCVDoc.cpp)中重寫OnOpenDocument函數,如下:
BOOL CUseOpenCVDoc::OnOpenDocument(LPCTSTR lpszPathName) {
if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE;
if (lpszPathName != NULL) {
// 將lpszPathName 轉換成 std::string類型 文件名
#ifdef UNICODE
// 中文路徑時會存在問題
size_t i = 0;
char* nstring = new char[(wcslen(lpszPathName)+1)*2];
wcstombs_s(?&i, nstring, (wcslen(lpszPathName)+1)*2, lpszPathName, (wcslen(lpszPathName)+1)*2);
std::string filename(nstring);
delete[] nstring; #else std::string filename(lpszPathName);
#endif m_cvImg = cv::imread(filename);
if (!m_cvImg.data) { MessageBox(NULL, lpszPathName, _T('圖像文件打開失敗'), MB_OK); return FALSE; }
} return TRUE;
}
4)在視圖頭文件(UseOpenCVView.h)中添加四個成員變量,如下:
protected: cv::Mat m_cvImg; BITMAPINFO* m_bmi;
BITMAPINFOHEADER* m_bmih;
unsigned int m_buffer[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];
5)修改視圖類 (CUseOpenCVView)構造函數如下:
CUseOpenCVView::CUseOpenCVView() {
// TODO: 在此處添加構造代碼 // 初始化 BITMAPINFO結構 及 BITMAPINFOHEADER結構
m_bmi = (BITMAPINFO*) m_buffer; m_bmih = &(m_bmi->bmiHeader);
memset(m_bmih, 0, sizeof(*m_bmih));
m_bmih->biSize = sizeof(BITMAPINFOHEADER);}
6)修改視圖繪制函數如下:
void CUseOpenCVView::OnDraw(CDC* pDC)
{
CUseOpenCVDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); if (!pDoc) return;
// TODO: 在此處為本機數據添加繪制代碼
m_cvImg = pDoc->m_cvImg; m_bmih->biWidth = m_cvImg.cols; m_bmih->biHeight = -m_cvImg.rows;
// 在自下而上的位圖中 高度為負 m_bmih->biPlanes = 1;
m_bmih->biCompression = BI_RGB;
m_bmih->biBitCount = 8 * m_cvImg.channels();
CRect rect; GetClientRect(&rect);
StretchDIBits( pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, m_cvImg.cols, m_cvImg.rows, m_cvImg.data, (BITMAPINFO*) m_bmi, DIB_RGB_COLORS, SRCCOPY);
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的在OpenCV中将cv::Mat绘制到MFC的视图中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RTP格式图 NNEXB格式和RTP格
- 下一篇: 在MFC的picture控件中如何显示M