如何解决 Opencv 和 GTKmm 之间的冲突?

Posted

技术标签:

【中文标题】如何解决 Opencv 和 GTKmm 之间的冲突?【英文标题】:How can I solve this conflict between Opencv and GTKmm? 【发布时间】:2013-04-30 08:38:16 【问题描述】:

我会在使用 Gtkmm 图形界面的程序中使用 OpenCV 库,但是当我尝试使用 cv::imread 打开图像时,执行期间出现错误消息:gtk-error ** Using gtk+ 2.x不支持和gtk+ 3在同一个进程中。

这是一个非常简单的示例代码:

#include <gtkmm/main.h>
#include <gtkmm/window.h>
#include <gtkmm/image.h>

#include "opencv2/highgui/highgui.hpp"

int main(int argc, char* argv[]) 

Gtk::Main app(argc, argv);
Gtk::Image ImgGtk;
Gtk::Window Win0;
cv::Mat ImgOcv;

Win0.set_border_width(5);
Win0.set_default_size(250, 100);

ImgOcv= cv::imread("icone.png", -1);
ImgGtk.set("icone.png");
Win0.add(ImgGtk);

Win0.show_all();
Gtk::Main::run(Win0);

return 0;

想法是替换“ImgGtk.set("icone.png");”通过 create_from_data 和 gtk_img.set(pixbuf) 或类似的东西。 上面的代码编译和链接很好,但在执行过程中会产生上述错误。 只需删除第 17 行 (ImgOcv= cv::imread("icone.png", -1);) 并且错误消失,图像由 ImgGtk.set("icone.png"); 显示。

有人听说过这种冲突吗?有人知道如何调试吗?

我正在使用 gtkmm 3.0 并将 opencv 升级到 2.4.5,但这并没有解决问题。 操作系统为 Ubuntu 12.04。

提前谢谢你。

【问题讨论】:

【参考方案1】:

OpenCV 使用 GTK 库的 2.0 版 API,它与您的主程序正在使用的 3.0 版 API 不兼容。具体来说,GTK 包含的代码会尝试检测它们何时被组合,然后崩溃以告知您无法这样做。

有三种可能的行动方案:

不要使用 OpenCV 的 GUI 工具(最好,但我不知道是否可以只使用 OpenCV 的图像处理功能而不打开 GUI 库) 将您的程序降级到 GTKmm 的 2.x 版本 将 OpenCV 升级到 GTK 3.0(高度劳动密集型,尽管许多人可能会感谢您所做的所有工作。不过我并不真正推荐它。)

【讨论】:

非常感谢您提供这种非常明确的回答。我在为自己的研究编程时使用控制台应用程序。但目前,为了同事的利益,我会将程序从控制台应用程序“移植”到 GUI 应用程序。他们习惯于用户友好的环境,并且我根据经验知道,有些(实际上大多数)看起来非常可疑的程序需要一个三行长的命令。我会尝试第二个建议。再次感谢。 使用#1 你仍然可以编写自己的 GUI,只是不要使用 OpenCV 中包含的那个。 2014 年更新 (当问题被谷歌搜索时,这个问题排名很高;)):当我遇到这个问题时,我发现拉请求 2943(2014 年 7 月)进入 master将一堆基本方法(例如imread(...)imwrite(...))从依赖于 GTK 的 highgui 模块中取出到新的独立视频和图像编解码器模块中。这意味着现在使用 opencv 和链接到 GTK3+ 更容易(以前非常不切实际):只是不要包含 highgui 模块。例如,在 cmake 中:find_package( OpenCV REQUIRED core imgproc imgcodecs)。最好的。

以上是关于如何解决 Opencv 和 GTKmm 之间的冲突?的主要内容,如果未能解决你的问题,请参考以下文章

为 gtk、gtkmm 和 opencv 更正 CMakeLists.txt 文件

在 Anaconda 下安装 OpenCV 后如何解决调试/发布冲突

从opencv读取时gtkmm DrawingArea分段错误

CPP中OpenCV和pcl库之间的冲突

PCL:解决PCL和OpenCV冲突的方法

jQuery版本之间冲突如何解决?