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

时间:2013-04-30 08:38:16

标签: c++ opencv g++ gtkmm

我会使用Gtkmm图形界面将OpenCV库用于程序,但是当我尝试使用cv :: imread打开图像时,执行期间会出现错误消息:gtk-error **使用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)或类似的东西。 上面的代码编译和链接很好,但在exceution期间产生上面提到的错误。 只需删除第17行(ImgOcv = cv :: imread(“icone.png”, - 1);)并且错误消失,图像由ImgGtk.set(“icone.png”)显示;。

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

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

提前感谢你。

1 个答案:

答案 0 :(得分:1)

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

有三种可能的行动方案:

  • 不要使用OpenCV的GUI工具(最好,但我不知道是否可以在不打开GUI库的情况下仅使用OpenCV的图像处理功能)
  • 将您的程序降级为2.x版本的GTKmm
  • 将OpenCV升级到GTK 3.0(高度劳动密集型,虽然很多人可能会感谢您完成所有工作。但我并不是真的推荐它。)