2010-02-05 26 views
16

我想使用OpenCV的圖像處理功能,但不使用OpenCV GUI。我正在使用OpenCV 2.0。我將使用Qt4或WxWidgets進行GUI功能。我用VC++ 2008 Express(VC++ 9.0)進行編譯。Win32 VC++與其他GUI(如Qt或WxWidgets)的OpenCV

我猜它分解成兩個或三個問題:

  1. 是否有必要做一些禁用的OpenCV的higui所以它不與優選的GUI庫干擾,如果是這樣,怎麼樣?

  2. 如何將OpenCV圖像轉換爲首選GUI可以顯示(也許保存)的東西(位圖?)?

  3. (可選)如何將使用首選接口加載的圖像轉換爲OpenCV可以使用的窗體?

回答

2

好的。我已經爲我自己的WxWidgets問題得到了答案。一個關鍵不是要打開關於RGB序列的openCV市政廳。 OpenCv真的很喜歡「BGR」。 WxWidgets只使用「RGB」。opencv數據結構有一個用於字節序列的字段,但它很少被使用。如果字節序列設置爲「RGB」,即使是顯示圖像的highGui函數(在MS Windows上)也會顯示出壯觀的藍色橘子。我在本地安裝中固執地修復了這個bug,但其他操作也失敗了。所以,我只是感嘆並將opencv端的字節順序設置爲「BGR」,並根據需要進行字節交換。

下面的C++代碼要求它轉換爲wxImages的openCV圖像是RGB,序列「BGR」,8位深度和3個交織通道,並且width_step = width * 3。這些例程不檢查兼容性。用於自己的危險。準備黃金時間版本將提供興趣區域(ROI)和其他幻想。

#include "wx/wx.h" 
#include "cv.h" 
#include "highgui.h" // Optional 


void copy_and_swap_rb(char *s, char *d, int size) { 
    // Copy image data source s to destination d, swapping R and B channels. 
    // Assumes 8 bit depth, 3 interleaved channels, and width_step = width*3 
    const int step = 3; 
    char *end = s + size; 
    while (s<end) { 
     d[0] = s[2]; 
     d[1] = s[1]; 
     d[2] = s[0]; 
     d += step; s += step; 
    } 
} 

void wx2cv(wxImage &wx, IplImage *ipl) { 
    // Copy image data from wxWidgets image to Ipl (opencv) image 
    // Assumes ipl image has seq "GBR", depth 8, and 3 channels, and 
    // has the same size as the wxImage, and width_step = width*3. 
    copy_and_swap_rb((char*)wx.GetData(), ipl->imageData, ipl->imageSize); 
} 

void cv2wx(IplImage *ipl, wxImage &wx) { 
    // Copy image data from Ipl (opencv) image to wxImage 
    // Assumes ipl image has seq "GBR", depth 8, and 3 channels, and 
    // has the same size as the wxImage, and width_step = width*3. 
    copy_and_swap_rb(ipl->imageData, (char*)wx.GetData(), 
         wx.GetWidth()*wx.GetHeight()*3); 
} 

IplImage *cv_from_wx(wxImage &wx) { 
    // Return a new IplImage copied from a wxImage. 
    // Must be freed by user with cvReleaseImage(). 
    IplImage *ret = cvCreateImage(cvSize(wx.GetWidth(), wx.GetHeight()), 
            IPL_DEPTH_8U, 3); 
    wx2cv(wx, ret); 
    return ret; 
} 

wxImage wx_from_cv(IplImage *cx) { 
    // Return new wxImage copied from a compatible IplImage. 
    // Assumes ipl image has seq "GBR", depth 8, and 3 channels 
    // Fear not. The copy on return is cheap; does not deep-copy the data. 
    wxImage wx(cx->width, cx->height, (unsigned char*) malloc(cx->imageSize), false); 
    cv2wx(cx, wx); 
    return wx; 
} 
+0

這似乎適用於RGB圖像。如果我有一個灰度IplImage怎麼辦? – Sunny 2010-06-08 08:30:21

0

那麼我不太瞭解OpenCV,但我使用wxWidgets很多。

我強烈推薦wxWidgets,因爲它的直觀結構和代碼佈局。

此外,QT僅適用於Windows下的LGPL,因此許可可能是一個問題。 wxWidgets可以在沒有限制的商業項目中使用。

對於來回轉換圖像,wxWidgets具有大量用於處理圖像的類/函數。

+3

唯一的問題我有LPGL'ed QT看(無論是在Windows或Linux,無所謂)是** ** IF Jive的改變東西在QT庫和唐我不想分享他的改變。這是一個不行。除此之外,沒有許可證問題是令人害怕的。 – 2010-02-06 11:08:15

1

是否有必要做一些事情來禁用OpenCV的higui,以免干擾首選的GUI庫,如果是這樣,如何?

答:我不明白爲什麼它不應該是可行的,或者它是一個設計不佳的庫(我不認爲OpenCV是)。

對於您的其他問題(以及問題1的「如何」),我在QtCentre上進行了快速搜索,並找到一條關於OpenCV integration with Qt的有趣線索。有一些您可以查看的源代碼示例。

如果您沒有在該線程中找到您正在尋找的內容,則可以開始一個新的。

或谷歌的OpenCV integration in Qt或搜索谷歌代碼,有一些項目同時使用Qt和OpenCV(OpenCV Stereo Vision is one)。

祝你好運。

0

我已經取得了一些進展。 OpenCV的GUI部分似乎沒有妨礙。我甚至在WxWidgets應用程序中使用它來顯示圖像,並且沒有什麼不好的事情發生。這是在使用VC++ 2008的Windows XP盒子上。OpenCV/highGUI對窗口系統的唯一交互作用是直接進行Windows API調用,並監視傳遞的鍵盤事件的事件隊列。

我正在研究如何從OpenCV圖像轉換爲WxWidgets圖像並返回。你們有很大的幫助。 :-)

5

我知道我對這次討論超級遲,但是我只是偶然發現了它。不管怎麼說,我一直在使用的OpenCV和wxWidgets的在一起很愉快,現在幾年了,所以我想我會全情:

是否有必要做一些禁用的OpenCV的higui所以它不會干擾首選的GUI庫,如果是這樣,怎麼樣?

不一般。對於特定版本的OpenCV和Windows,您可以遇到一些麻煩。但是,大部分情況下,整合非常順利。我經常使用wx作爲我的前端 highgui中支持圖像捕獲的部分。我這樣做在Windows,Ubuntu的幾個版本,以及OS X.

如何將OpenCV的圖像轉換成東西(位圖?),首選的GUI可以顯示(也許是保存)?

在wxImage之間來回複製的替代方法是將IplImage的數據直接填充到OpenGL紋理中並將其繪製在wxGLCanvas上。這種策略的一大優勢是,您可以使用標準的OpenGL方法在紋理的頂部繪製。

(可選)如何將使用首選接口加載的圖像轉換爲OpenCV可以使用的窗體?

不要:)我使用wxFileDialog等讓用戶指定路徑,但所有的後端直接是OpenCV。

(開始自我插頭)我寫做了很多這方面

代碼是一個叫做MADTraC項目,這是對實時計算機視覺應用的GUI /應用程序框架的一部分。

(完自我插頭)