在linux環境下編譯運行OpenCV程序的兩種方法 - woshijpfgg
時間 2014-07-13 23:08:00
博客園精華區
原文 http://www.cnblogs.com/woshijpf/p/3840530.html
主題
OpenCV Linux
原來以為在Ubuntu下安裝好了OpenCV之後,自己寫個簡單的程序應該很容易吧,但是呢,就是為了編譯一個簡單的顯示圖片的程序我都快被弄崩潰了。
在谷歌和上StackOverFlow查看相關問題解答之後,我下面就介紹Command Line和CMake兩種方式。
首先我先粘上我測試的代碼吧,文件名為Test.c
1 #include <highgui.h>
2
3 int main(int argc,char ** argv) {
4
5 IplImage* img = cvLoadImage(argv[1],CV_LOAD_IMAGE_COLOR);
6 cvNamedWindow("Image_show",CV_WINDOW_AUTOSIZE);
7 cvShowImage("Image_show",img);
8 cvWaitKey(0);
9 cvReleaseImage(&img);
10 cvDestroyWindow("Image_show");
11 return 0;
12 }
第一種方法:Command Line(使用命令行參數的方法)
gcc Test.c -o Test `pkg-config --cflags --libs opencv`
./Test baboon.jpg
在這裡我稍微解釋下這條命令的作用吧。
在上面的編譯命令中我們其實用到了一個工具“pkg-config”,它主要有以下幾個功能:
檢查庫的版本號。如果所需要的庫的版本不滿足要求,它會打印出錯誤信息,避免鏈接錯誤版本的庫文件。
獲得編譯預處理參數,如宏定義,頭文件的位置。
獲得鏈接參數,如庫及依賴的其它庫的位置,文件名及其它一些連接參數。
自動加入所依賴的其它庫的設置
所有有了這個工具之後我們的編譯就很方便了( 不過在此之前你要確保你安裝的OpenCV的安裝鏈接庫文件的目錄下有一個pkgconfig文件夾,在該文件夾裡面有個opencv.pc的文件,其實這就是pkg-config下OpenCV的配置文件 )。
使用pkg-config時,選項--cflags 它是用來指定程序在編譯時所需要頭文件所在的目錄,選項 --libs則是指定程序在鏈接時所需要的動態鏈接庫的目錄。例如我下面這張圖就顯示了我電腦上OpenCV的相關目錄。
第二種方法:使用OpenCV推薦的CMake工具
這個方法,我郁悶了很久,試了各種辦法,最終還是編譯運行成功啦。一把心酸淚啊。
下面我就一步步介紹下步驟吧:
step1:新建一個目錄用於存放我們的代碼和程序中要處理的相關圖片
step2:添加cmake工具編譯時所需的文件CMakeLists.txt
CMakeLists.txt文件中的具體內容如下( 注:這個文件你可以到你的OpenCV源代碼解壓出來的文件夾下的/samples/c/example_cmake/文件夾下拷過來,然後再做修改 )。
下面我就簡要的介紹下這裡面內容的大概意思吧
PROJECT(OpenCV_Example) //這是建立一個工程項目(類似於我們VS中建立C++項目一樣),括號裡面時工程名,工程名我們可以任意給,最後程序編譯出來的可執行文件就是這個名字
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) //這是對CMake工具最低版本要求,這裡我們要檢查下我們的CMake工具的版本信息,我們可以使用命令“cmake --version”查看
if(COMMAND cmake_policy)
cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)
FIND_PACKAGE( OpenCV REQUIRED ) //這是cmake用來查找opencv包用的,不用改
# Declare the target (an executable)
ADD_EXECUTABLE(OpenCV_Example Image_show.c) //這裡括號裡面的兩個參數分別是工程項目名和我們要編譯文件名的意思,記住中間一空格鍵隔開
TARGET_LINK_LIBRARIES(OpenCV_Example ${OpenCV_LIBS}) //這是我們鏈接到OpenCV庫的環節,我們只要更改前面第一個參數位我們的工程項目名即可
#MESSAGE(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}") //好了,就修改這麼點東西,保存,關閉。
然後我們就將終端的工作目錄切換到我們建立工程文件的這個目錄
( 注意,千萬要注意:你這時一定要查看你安裝OpenCV時建立的那個編譯文件,有沒有帶鎖的標志(即你編譯OpenCV是用root權限編譯的),就這點就把我坑慘了,例如的我電腦上顯示的就是這樣的
看到上面圖片中的build文件夾沒,那就是我編譯OpenCV源代碼時建立的文件夾。)
所以,如果你是以root的權限編譯的OpenCV此時你就要以切換到root用戶,再切換到當前的工作目錄。如果不是用root權限編譯的OpenCV編譯的話,你就直接切換目錄就OK了。
我的電腦是要切換到root狀態的
Step3:讓後我們輸入命令"cmake ."對當前的工程進行編譯。啊哦,這時你就會發現你編譯時出現了一個Bug
這個警告的大概意思就是:Cmake找不到OpenCV的鏈接庫文件,你需要手動地設置OpenCV_DIR來指向包含庫文件的路徑。
好吧,這是最蛋疼的地方,就這個問題我google和上StackOverFlow都沒有找到答案,只能自己嘗試了,不過還是找到網友給的一些提示。
其實通過它給我們的提示我們就是要設置好這個路徑。接下來我們通過camke的qt界面進行設置吧。
Step4:設置OpenCV_DIR
(1)先安裝cmake的qt界面 "sudo apt-get install cmake-gui"
(2)打開cmake-gui界面
(3)我們這是就在Where is the source code 和 where to build binaries 的選項裡選擇我們的目錄剛才建立包含我們程序的文件路徑吧。
(4)我們選擇cmake界面中的“Add Entry”選項,按照我下面圖中的方式輸入信息吧,其中alue值就是我OpenCV安裝的那個目錄(回想下我上面說的)。
這樣我們就點擊ok吧,得到下面的圖了
到此OpenCV_DIR就配置完成了,單擊下面的Configure和Generate,如果沒報錯則一切搞定啦。我們可以愉快的回到終端編譯我們的程序啦。
(5)編譯的方式如圖所示
看到了嗎,綠色OpenCV_Example就是我們剛生成的可執行文件,到此大功告成啊。
Step5:運行測試吧
好了,搞定啦,睡覺啦!
轉載請注明出處:http://www.cnblogs.com/woshijpf/