c++ - 在 gtkmm 中显示 opencv cv::Mat 图像

标签 c++ linux opencv gtk gtkmm

我想在 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);
}

第一种方法效果很好。

enter image description here

但是,第二种方法效果不佳,我在屏幕上看到了一个被破坏的图像,如图所示。

enter image description here

如果我将 has_alpha 参数设置为 true,结果也很奇怪(见下图)。 enter image description here

使用 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/

相关文章:

c++ - 覆盖方法的问题(使用泛型)

c++ - 如何使用Win32线程池API?

c - Linux系统调用返回值

python - “ImportError: No module named scapy.all” 树莓派 Raspbian

Java:opencv 和 openni

c++ - 自定义 QWidget 中的背景颜色错误

python - JupyterHub 内核对用户安全吗?

c++ - QSystemTrayIcon 上下文菜单中的用户界面

python - 使用 OpenCV 对图像进行 mask 和平滑处理

c++ - 使用 c++ api 访问 cv::Mat 中的元素 (x,y)