2017-10-12 283 views
2

我想在gtkmm編寫的Gui中顯示cv :: Mat。所以我做了一個測試。display opencv cv ::在gtkmm中的Mat圖像

我有一個小部件Gtk::Image image,我想有以下兩種方法設置圖像:

// first method, display from file 
void displayImage1() 
{ 
    Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_file("gtk.png"); 
    image.set(pixbuf); 
} 

// second method, display from cv::Mat 
void displayImage2() 
{ 
    cv::Mat outImage = cv::imread("gtk.png"); 
    cv::cvtColor(outImage, outImage, CV_BGR2RGB); 
    Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_data(outImage.data, Gdk::COLORSPACE_RGB,false, 8, outImage.cols, outImage.rows, outImage.step); 
    image.set(pixbuf); 
} 

第一種方法效果很好。

enter image description here

然而,第二種方法不作爲圖片所示工作良好,我得到的屏幕上的圖像破壞。

enter image description here

如果我設置has_alpha參數設置爲true,結果也怪(見照片。下文)。 enter image description here

類似的測試通過使用Gtk :: DrawingArea完成。使用不同的IDE(但是Linux下的所有g ++編譯器)。所有相同的結果。

更新:

我測試了很多圖片。有時圖像被破壞,有時程序崩潰

程序意外完成。

+0

是否檢查圖像實際上並不包含alpha通道?對我來說似乎是這樣,除非灰色背景是圖像的一部分。 – KjMag

+0

@KjMag THANKS,但has_alpha爲「true」的結果也不正確,我更新了問題的結果。 –

+0

24而不是8作爲「bits_per_sample」? – Miki

回答

0

通常,這種「破碎」的圖像在我的腦海裏觸發了一個警告:「錯誤的rawstride!」。在Gdk::Pixbuf中的rawstride中的一行數據的長度以字節爲單位。這是因爲你可能有一些字節對齊限制,所以在一行的末尾可能會有一些填充。

我檢查了這個step參數是什麼,是的,這在OpenCV中與Gdk :: Pixbuf中的rawstride相同。直到我意識到outImage.stepcv:MatStep對象,而Gdk::Pixbuf::create_from_data期望int。我想你應該使用outImage.step[0]

請仔細閱讀https://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat

+1

'cv :: MatStep'被隱式轉換爲'size_t',所以可以像這樣使用'outImage.step'。 – Miki

+0

謝謝你的回答。是的,我同意@Miki。不過,我嘗試了outImage.step [0],沒有任何變化。 –

0

在這裏我們去:

auto lenna = imread("Lenna.png"); 
Image image; 

cvtColor(lenna, lenna, COLOR_BGR2RGB); 
auto size = lenna.size(); 
auto img = Gdk::Pixbuf::create_from_data(lenna.data, Gdk::COLORSPACE_RGB, lenna.channels() == 4, 8, size.width, size.height, (int) lenna.step); 

image.set(img); 
+0

謝謝你的代碼,但我認爲它與我的基本相同。無論如何我都試過了,結果是一樣的。如果它在你身邊,它一定是我的編譯器或系統的問題或我的庫的版本我不知道:( –

+0

我認爲問題是OpenCV和GTKmm的版本不一樣。嘗試gtkmm 2.4 – moisrex