display opencv cv ::在gtkmm中的Mat图像

问题描述:

我想在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

通常,这种“破碎”的图像在我的脑海里触发了一个警告:“错误的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],没有任何变化。 –

在这里我们去:

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