簡體   English   中英

使用 OpenCV 編譯時出現 Gtk+ 3 錯誤

[英]Gtk+ 3 Error when compiling with OpenCV

我最近在 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 程序的一個片段如下所示:

#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+ 3 一起使用。由於它抱怨,它表明您已經安裝了一些舊版本,並且它使用了它。

因此,如果您想在 OpenCV 中使用 GUI 便利功能,您需要重新構建 OpenCV,確保它是使用正確版本的 Gtk+ 構建的。

但是,由於您提供自己的 GUI,因此您似乎並不真的需要使用 OpenCV 的那部分。 由於您已將 OpenCV 構建為單獨的模塊,因此您可以簡單地不與opencv_highgui鏈接以避免沖突。

我有同樣的問題,但在 python 中,我通過在主 python 文件的頭部附加這兩行來解決它。 當您的環境有多個 GTK 版本時,它將僅指定您想要的版本。 祝你好運!

import gi  
gi.require_version('Gtk', '2.0')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM