使用 OpenCV 编译时出现 Gtk+ 3 错误
Posted
技术标签:
【中文标题】使用 OpenCV 编译时出现 Gtk+ 3 错误【英文标题】:Gtk+ 3 Error when compiling with OpenCV 【发布时间】:2017-07-14 16:24:29 【问题描述】:我最近在 linux 上从源代码构建了 OpenCV 3。我能够成功编译和运行 OpenCV 程序。
然后我下载了 Gtk+ 3 和所有必需的包(GLib 2.52、Pango 1.40、Gdk-Pixbuf 2.36、ATK 2.24、GObject-Introspection 1.52)。我能够成功编译并运行这个简单的程序编译:
g++ -std=c++11 gtkexample.cpp `pkg-config --cflags gtk+-3.0` -o gtkexample `pkg-config --libs gtk+-3.0`
源代码:
#include <gtk-3.0/gtk/gtk.h>
int main( int argc,
char *argv[] )
GtkWidget *window;
GdkRGBA *color;
gtk_init (&argc, &argv);
gdk_rgba_parse(color,"(0,0,0)");
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_decorated(GTK_WINDOW (window),FALSE);
gtk_window_set_position(GTK_WINDOW (window), GTK_WIN_POS_CENTER);
gtk_widget_override_background_color(window, GTK_STATE_FLAG_NORMAL, color);
gtk_widget_show (window);
for (int i=200;i<400;i++)
gtk_window_move(GTK_WINDOW (window),i,200);
gtk_main ();
return 0;
成功编译后,我尝试使用 Gtk+ 和 FlyCapture 相机执行我的 OpenCV 程序,但我遇到了:
"Gtk-ERROR **: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported"
pkg-config --cflags gtk+-3.0
的输出为:
-pthread -I/usr/local/include/gtk-3.0 -I/usr/local/include/gio-unix-2.0/ -I/usr/local/include/cairo -I/usr/local/include/pango-1.0 -I/usr/local/include/harfbuzz -I/usr/local/include/pango-1.0 -I/usr/local/include/atk-1.0 -I/usr/local/include/cairo -I/usr/local/include/gdk-pixbuf-2.0 -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/aarch64-linux-gnu/dbus-1.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12
pkg-config --libs gtk+-3.0
的输出是:
-L/usr/local/lib -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
OpenCV 程序的 sn-p 如下所示:
#include "FlyCapture2.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudalegacy/NCVHaarObjectDetection.hpp>
#include <opencv2/cudaobjdetect.hpp>
#include <thread>
#include <iostream>
#include <vector>
#include <gtk-3.0/gtk/gtk.h>
using namespace FlyCapture2;
int main( int argc,
char *argv[])
GtkWidget *window;
gtk_init (&argc, &argv); //This is where the error occurs
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_decorated(GTK_WINDOW (window),FALSE);
gtk_window_set_position(GTK_WINDOW (window), GTK_WIN_POS_CENTER);
gtk_widget_show(window);
gtk_main();
// ...
编译成功:
g++ -std=c++11 FlyCap2_to_MatImage.cpp `pkg-config --cflags gtk+-3.0` -I/home/nvidia/flycapture.2.11.3.121_arm64/include -I/usr/local/cuda-8.0/include -o FlyCap2_to_MatImage `pkg-config --libs gtk+-3.0` -lflycapture -lopencv_core -lopencv_highgui -lopencv_objdetect -lopencv_imgproc -lopencv_cudaobjdetect
我的问题是:
OpenCV 3 可能使用的是旧版本的 GTK+ 吗? 我是否必须重新构建 OpenCV 才能使用较新版本的 Gtk+ 进行配置?【问题讨论】:
考虑到您在构建 OpenCV 之后 安装了 Gtk+ 3,它似乎不太可能被构建为使用该特定版本的 Gtk+...所以,是的,您将需要重建它。由于您正在编写自己的 GUI,因此您可能完全可以在没有任何 highgui 后端的情况下构建它。 谢谢丹,你的评论帮助了我。只要我编译时不链接opencv_highgui库,程序就会运行。这是可能使用旧版本的库。 没错,就是包含便捷 GUI 实用程序的库。我不知何故错过了你正在与它链接的事实,即使你不使用它。 Dan,如果您对另一个 OpenCV/GTK+ 相关问题感兴趣,我最近刚刚发布了一个。再次感谢您的帮助。 嗨,亚历克斯。如果@DanMašek 的评论/回答对您有所帮助,请接受他的回答/点赞***.com/help/someone-answers 【参考方案1】:考虑到您在构建 OpenCV 之后安装了 Gtk+ 3,它很可能已经构建为与 Gtk+ 3 一起使用。由于它抱怨,它表明您已经安装了一些旧版本,它使用它。
因此,如果您想在 OpenCV 中使用 GUI 便利功能,您需要重新构建 OpenCV,确保它是使用正确版本的 Gtk+ 构建的。
但是,由于您提供自己的 GUI,因此您似乎并不需要使用 OpenCV 的那部分。由于您已将 OpenCV 构建为单独的模块,因此您不能简单地与 opencv_highgui
链接以避免冲突。
【讨论】:
【参考方案2】:我有同样的问题,但在 python 中,我通过在主 python 文件的头部附加这两行来解决它。当您的环境有多个 GTK 版本时,它将仅指定您想要的版本。祝你好运!
import gi
gi.require_version('Gtk', '2.0')
【讨论】:
以上是关于使用 OpenCV 编译时出现 Gtk+ 3 错误的主要内容,如果未能解决你的问题,请参考以下文章
为 OpenCV 的 C++ createTrackbar 运行 C 包装器时出现编译分段错误(核心转储)
在 Eclipse 上使用 opencv 3.0 时出现链接错误