日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在OpenCV中将cv::Mat绘制到MFC的视图中

發(fā)布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在OpenCV中将cv::Mat绘制到MFC的视图中 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

畢設(shè)時遇到了一個問題,不能在MFC中顯示由GrabCut摳出來的圖。經(jīng)一番折騰發(fā)現(xiàn):
  在OpenCV中如果圖像最初是Mat類型的話,就不能通過轉(zhuǎn)換為IplImage,再轉(zhuǎn)換為CvvImage來顯示到View里(OpenCV里沒有函數(shù)能直接將Mat顯示到View里),只能通過StretchDIBits來繪制。
  下面介紹StretchDIBits函數(shù)的使用方法:(轉(zhuǎn)自:在MFC中應(yīng)用OpenCV(無CvvImage類))
  1)創(chuàng)建MFC單文檔項目(我創(chuàng)建了UseOpenCV),設(shè)置包含目錄與庫目錄,添加相關(guān)附加依賴項。
  2)在文檔頭文件(UseOpenCVDoc.h)中添加包含文件
#include #include   添加OpenCV Mat類類型成員變量 m_cvImg,形式如下:
protected: // 僅從序列化創(chuàng)建 CUseOpenCVDoc(); DECLARE_DYNCREATE(CUseOpenCVDoc) cv::Mat m_cvImg;   

3)在文檔實現(xiàn)文件(UseOpenCVDoc.cpp)中重寫OnOpenDocument函數(shù),如下:
BOOL CUseOpenCVDoc::OnOpenDocument(LPCTSTR lpszPathName) {

if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE;

if (lpszPathName != NULL) {

// 將lpszPathName 轉(zhuǎn)換成 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)構(gòu)造函數(shù)如下:
CUseOpenCVView::CUseOpenCVView() {

// TODO: 在此處添加構(gòu)造代碼 // 初始化 BITMAPINFO結(jié)構(gòu) 及 BITMAPINFOHEADER結(jié)構(gòu)

m_bmi = (BITMAPINFO*) m_buffer; m_bmih = &(m_bmi->bmiHeader);

memset(m_bmih, 0, sizeof(*m_bmih));

m_bmih->biSize = sizeof(BITMAPINFOHEADER);}   

6)修改視圖繪制函數(shù)如下:
void CUseOpenCVView::OnDraw(CDC* pDC)

{

CUseOpenCVDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc); if (!pDoc) return;

// TODO: 在此處為本機數(shù)據(jù)添加繪制代碼

m_cvImg = pDoc->m_cvImg; m_bmih->biWidth = m_cvImg.cols; m_bmih->biHeight = -m_cvImg.rows;

// 在自下而上的位圖中 高度為負(fù) 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);

}

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的在OpenCV中将cv::Mat绘制到MFC的视图中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。