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);
}
第一种方法效果很好。
然而,第二种方法不作为图片所示工作良好,我得到的屏幕上的图像破坏。
如果我设置has_alpha参数设置为true,结果也怪(见照片。下文)。
类似的测试通过使用Gtk :: DrawingArea完成。使用不同的IDE(但是Linux下的所有g ++编译器)。所有相同的结果。
更新:
我测试了很多图片。有时图像被破坏,有时程序崩溃
程序意外完成。
通常,这种“破碎”的图像在我的脑海里触发了一个警告:“错误的rawstride!”。在Gdk::Pixbuf
中的rawstride中的一行数据的长度以字节为单位。这是因为你可能有一些字节对齐限制,所以在一行的末尾可能会有一些填充。
我检查了这个step
参数是什么,是的,这在OpenCV中与Gdk :: Pixbuf中的rawstride相同。直到我意识到outImage.step
是cv:MatStep
对象,而Gdk::Pixbuf::create_from_data
期望int。我想你应该使用outImage.step[0]
。
请仔细阅读https://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat
'cv :: MatStep'被隐式转换为'size_t',所以可以像这样使用'outImage.step'。 – Miki
谢谢你的回答。是的,我同意@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);
谢谢你的代码,但我认为它与我的基本相同。无论如何我都试过了,结果是一样的。如果它在你身边,它一定是我的编译器或系统的问题或我的库的版本我不知道:( –
我认为问题是OpenCV和GTKmm的版本不一样。尝试gtkmm 2.4 – moisrex
是否检查图像实际上并不包含alpha通道?对我来说似乎是这样,除非灰色背景是图像的一部分。 – KjMag
@KjMag THANKS,但has_alpha为“true”的结果也不正确,我更新了问题的结果。 –
24而不是8作为“bits_per_sample”? – Miki