我想在 gtkmm 编写的 Gui 中显示一个 cv::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++ 编译器)。所有相同的结果。
更新:
我测试了很 multimap 像。有时图像损坏,有时程序崩溃
The program has unexpectedly finished.
最佳答案
通常,这种“损坏”的图像会在我的脑海中发出警告:“错误的 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
关于c++ - 在 gtkmm 中显示 opencv cv::Mat 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46705040/