• Open Source Computer Vision Library

MFC中快速應用OpenCV

Wikipedia,自由的百科全书

目錄

簡介和緣起

本教程原始討論主題,請見 【原創】MFC中快速應用OpenCV教程,製作此教程的目的,就是為了方便廣大windows下麵使用MFC的用戶可以輕鬆的在MFC視窗View類中,實現OpenCV格式圖片的顯示。

視頻教程

介紹基本的openCV和MFC的操作

在MFC中如何應用菜單,和Canny運算元的實例

創建SDI工程

我使用的是Visual C++ 6.0,因此,本教程描述的是在VC6上面演示操作,如果您使用別的版本的VC,我想應該也差不多。 首先,按照VC的嚮導,產生一個預設的MFC的工程,註意,選擇SDI單文檔支持的,同時最好選擇“use MFC As a static library”(防止MFC中使用OpenCV的記憶體泄露問題) 具體請參看下麵兩幅圖所示
Image:Mfc_opencv_01.JPG
Image:Mfc_opencv_02.JPG
就這樣子一路下去之後,基本的MFC框架就創建完成了。

加入OpenCV庫支持

現在加入openCV必須的頭文件和庫文件。如下圖所示,我們添加庫文件: cxcore.lib cv.lib highgui.lib
Image:Mfc_opencv_06.JPG

在Doc類中添加變數

Image:Mfc_opencv_07.jpg
找到 ***Doc 也就是文檔類的定義,在開頭加上 HighGui.h 的頭文件包含, 同時添加一個變數CImage m_image;

註意,如果你使用的不是VC6,按照我的教程,可能編譯無法通過(我的教程中,對 m_image 是設置成 protected類型的),解決的辦法是將 m_image的類型設置為public,以後建議大家都使用public修飾符。 具體的bug報告和分析請看這裡:建議使用public修飾符

添加虛函數

添加兩個函數,分別用來打開圖片文件和保存圖片文件,添加過程見下圖的右鍵菜單。

Image:Mfc opencv 04.jpg

Image:Mfc opencv 05.jpg

分別添加函數OnOpenDocument 和 OnSaveDocument 如下麵的代碼

BOOL CSDI OpenCVDoc::OnOpenDocument(LPCTSTR lpszPathName){
    if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE;
    // TODO: Add your specialized creation code here
    m_image.Load(lpszPathName);
    return TRUE;
}
BOOL CSDI OpenCVDoc::OnSaveDocument(LPCTSTR lpszPathName){
    // TODO: Add your specialized code here and/or call the base class
    m_image.Save(lpszPathName);
    return TRUE;
   // return CDocument::OnSaveDocument(lpszPathName);
}

註意,上面本來是 return CDocument::OnSaveDocument(lpszPathName); 但是後來發現有問題,保存了圖片,會導致保存後的圖片的大小變成0了,改用 return TRUE;就沒有問題了,具體請看論壇的討論: http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4932&p=18215#p18215

在View類中添加顯示圖像代碼

在View類中間添加必要的圖片顯示代碼,主要是在Ondraw裡面。

void CSDI_OpenCVView::OnDraw(CDC* pDC)
{
	CSDI_OpenCVDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CImage & img = pDoc ->m_image;
	CRect r;
	GetClientRect (&r);
		img.DrawToHDC(pDC->GetSafeHdc() ,r);
}

編譯整個程式,就可以通過“打開菜單”打開圖像並且顯示在MFC的View類中了。

Image:Mfc_opencv_08.jpg

2010-12-28重要更新

由於OpenCV2.2裡面,把原來的CvvImage整個類給刪除掉了,因此在MFC下使用帶來諸多不方便,大家可以通過提前opencv2.1中的代碼的方法來解決(弄一個h文件和一個cpp文件,然後放到你的項目裡面一起編譯就可以了)。具體的方法和文件內容,請看: Re: OpenCV2.2里CImage(CvvImage)取消,MFC下顯示圖片少了個好方法

感謝和後記以及相關討論

  1. 文檔由User:Ollydbg23撰寫,另外,我整理的本論壇精華區,也是以wiki的形式,放在這裡論壇精華區
  2. 如有疑問,可以去原主題下麵發表回覆參與討論 【原創】MFC中快速應用OpenCV教程
  3. 關於圖片太大,無法放入view里的一個解決方案,請看 feixiaolin 的帖子 opencv 數據讀寫操作+圖像雜訊+ MFC下OpenCV源代碼 以及 如何插入滾動條
  4. OpenCV繪圖函數DrawToHDC的一個簡要解釋
  5. 在opencv1.0版本中,使用上面介紹的canny的方法,存在單通道圖片無法打開的錯誤,具體的原因請看這裡,這主要是由於opencv1.0中的一個bug所導致的。原因
  6. 在opencv 1.1版本中使用,可能導致MFC的程式無法退出,解決辦法請看這裡 程式無法正常退出
  7. 註意,其中的 CImage 其實就是 CvvImage 這兩個可以直接替換使用。
  8. OLE錯誤對話框的問題,請看這裡 如何解決OLE的問題的論壇討論

網路其他OpenCV資源

Views
個人工具