2013-04-30 34 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

相關問題