2013-04-30 110 views
1

我将OpenCV库用于使用Gtkmm图形界面的程序中,但是当我尝试用cv :: imread打开图像时,在执行过程中出现错误消息:gtk-error **使用gtk + 2.x和gtk + 3在同一进程中不受支持。如何解决Opencv和GTKmm之间的冲突?

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

#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(高度劳动密集型的,虽然很多人可能会感谢你做所有的工作。我真的不推荐它尽管)
+0

非常感谢您提供这种非常明确的答案。 我在为自己的研究编程时使用控制台应用程序。但是现在我会将程序从控制台应用程序“移植”到GUI应用程序中,以便让我的同事们受益。他们习惯于用户友好的环境,而且我从经验中了解到,其中一些(其中大多数是真的)看起来非常可疑,需要三行命令的程序。 我会尝试第二个建议。 再次感谢。 – user2335023 2013-05-02 06:51:04

+0

#1你仍然可以编写自己的图形用户界面,只是不使用OpenCV中包含的图形用户界面。 – ptomato 2013-05-03 07:41:42

+0

** 2014年更新**(当问题是谷歌搜索时,这个问题排名很高;)):当我遇到这个问题时,我发现拉请求[2943](https://github.com/Itseez/opencv/pull/2943 )(2014年7月)转化为master从GTK相关的highgui模块中抽取了一些基本方法(例如'imread(...)'和'imwrite(...)')到新的独立视频和图像编解码器模块中。这意味着现在使用opencv和链接对GTK3 +来说更容易了(以前它是非常不切实际的):只是不包含highgui模块。例如,在cmake中:'find_package(OpenCV REQUIRED core imgproc imgcodecs)'。最好。 – Tom 2014-10-23 20:00:37

相关问题