著作權聲明:對於本部落格所有原創文章,允許個人、教育和非商業目的使用,但務必保證文章的完整性且不作任何修改地以超連結形式註明原始作者、出處及本聲明。
部落格地址:http://blog.csdn.net/shuxiao9058
原始作者:季亞
前言:看過本人部落格的朋友都知道,我這個人還是比較青睞於紅帽子系統的,目前經常使用的Linux是rhel 6.2和Fedora 15,畢竟紅帽是那麼的穩定與方便,只不過資源不太好找。在編譯Learning OpenCV第二章第二個視頻例子的時候卻不能運行,我估摸著可能是解碼器的問題,聽朋友說Ubuntu比較方便,於是便下載安裝,並又再對OpenCV進行重新編譯,事實證明完全沒有問題。
還有,Linux下源碼我只在Ubuntu 11.10/12.04和rhel 6.2下編譯成功了,並且沒有任何問題,只不過視頻播放在rhel下比較難解決,不像ubuntu直接更新外掛程式就可以了。注意:本文是以OpenCV-2.3.1介紹編譯配置方法的,有關OpenCV版本的地方需要修改。
首先要確保ubuntu已經安裝GTK+ 2.x(可以執行“pkg-config --modversion gtk+-2.0”命令查看GTK+ 2.x版本,見圖1)或者Carbon,否則可能導致程式不能正常運行(2所示,這裡顯示的資訊是之前在Ubuntu 11.10版本編譯之後,運行程式出現的錯誤提示資訊[安裝完成gtk+ 2.x之後,程式正常運行],但是下面是我在Ubuntu 12.04下編譯配置的)。圖1 沒有安裝GTK+ 2.x 圖2 程式運行錯誤(因開始編譯OpenCV時沒有安裝GTK+ 2.x)
可見,我的電腦沒有安裝GTK+ 2.x,故現在要安裝GTK+ 2.x,安裝GTK環境只要安裝一個gnome-core-devel就可以了,裡面整合了很多其他的包。
即執行下面命令,注意在安裝軟體之前要配置好網路(VM下網路設定可參考本人博文:VMware WorkStation的三種網路連接方式):
$ sudo apt-get install gnome-core-devel
也可以使用如下命令只安裝GTK+ 2.x:
$ sudo apt-get install libgtk2.0-dev
或者
$ sudo apt-get install libgtk2.0*
再執行如下命令,以用於在編譯GTK程式時自動找出標頭檔及庫檔案位置:
$ sudo apt-get install pkg-config
最後,使用如下命令查看GTK+ 2.x版本
$ pkg-config --modversion gtk+-2.0
在整個過程中使用到的軟體包有lena(1).tiff、Video.avi、QtSdk-offline-linux-x86-v1.2.1.run、cmake-2.8.8.tar.gz和OpenCV-2.3.1a.tar.bz2,3所示,本人已經把這幾個檔案(壓縮包)放在案頭上了。 圖3 將預使用的檔案放在案頭上
一、首先要安裝cmake
Step1.1 具體操作如下:
$ tar zxvf cmake-2.8.8.tar.gz…$ cd cmake-2.8.8…$ ./bootstrap…
如果執行上面命令後出現如下錯誤,請執行命令“sudo apt-get install g++”安裝C++編譯器。
$ ./bootstrap ---------------------------------------------CMake 2.8.8, Copyright 2000-2011 Kitware, Inc.C compiler on this system is: cc ---------------------------------------------Error when bootstrapping CMake:Cannot find appropriate C++ compiler on this system.Please specify one using environment variable CXX.See cmake_bootstrap.log for compilers attempted.---------------------------------------------Log of errors: /home/jiya/Desktop/cmake-2.8.8/Bootstrap.cmk/cmake_bootstrap.log---------------------------------------------
這個操作需要消耗的時間比較長,這裡可以先喝杯茶繼續等。
Step1.2 完成後,會看到提示“CMake has bootstrapped. Now run make.”,然後執行命令:
-- Configuring done-- Generating done-- Build files have been written to: /home/jiya/Desktop/cmake-2.8.8---------------------------------------------CMake has bootstrapped. Now run make.$…$ make…
同樣的執行完這個操作後也要稍等片刻。
Step1.3 然後使用如下命令安裝到系統(此時若無許可權,請使用root進行操作,可以使用“sudo su”命令切換root使用者):
$ sudo make install…
Step1.4 這時我們可以使用“cmake –version”命令來查看終端是否有關於cmake的版本資訊。如果沒有的話,我們就需要修改使用者的PATH路徑,把cmake路徑加入使用者環境變數,可以運行如下命令:
$ echo "export PATH=$PATH:/usr/local/bin" >> ~/.bashrc
注意:這裡我們使用的是root使用者修改的,因此只對root使用者生效!如果其他使用者也要使用cmake命令,再使用其他使用者登入終端後修改使用者環境變數。
也可以修改~/.bashrc檔案,如下修改在檔案最後添加上面的代碼。
注意這裡與windows下面的環境變數不同的是環境變數之間是用冒號“:”分隔開的,而非分號“;”,重啟終端使使用者變數生效。
測試:重新登入系統(不必重啟機器,開始->logout 或者重新開啟終端即可),使以上設定生效,在命令列輸入cmake --version,會出現如下資訊,這說明cmake環境已經成功配置並可以正常使用了。
$ cmake --versioncmake version 2.8.8$
二、接下來我們來編譯Opencv
Step2.1 返回到案頭,使用如下命令:
$ tar -jxvf OpenCV-2.3.1a.tar.bz2$ cd OpenCV-2.3.1$ mkdir release$ cd release$
Step2.2 進入release目錄後,執行如下命令(注意這是一整條命令且最後有兩點“..”),其中“CMAKE_INSTALL_PREFIX=/home/OpenCV-2.3.1a”表示當我們使用“make install”命令安裝OpenCV的時候,會將相關檔案拷貝到/home/OpenCV-2.3.1a目錄下。
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/home/OpenCV-2.3.1a -D BUILD_PYTHON_SUPPORT=ON ..
執行上述命令後,release目錄下會生產Makefile檔案等,4所示: 圖4 release目錄下產生的檔案及目錄
Step2.3 便可執行:
$ make
等待編譯......
Step2.4 編譯完成後運行“sudo make install”命令,會在/home/OpenCV-2.3.1a目錄下產生opencv相關目錄及檔案,包括bin、lib、include等,5所示。 圖5 /home/OpenCV-2.3.1a目錄下產生的相關目錄及檔案
三、最後我們來配置編譯環境,這裡我們選擇Qt IDE
Step3.1 下載完成後,同樣的拷貝到Ubuntu案頭上。執行如下命令:
$ chmod +x QtSdk-offline-linux-x86-v1.2.1.run $ ./QtSdk-offline-linux-x86-v1.2.1.run
接著,按著嚮導一步一步地安裝Qt即可(一直單擊“Next”按鈕)。
下面我們配置Qt下OpenCV開發環境:
Step3.2 修改opencv.pc檔案(這一步不是必需的)
假設我們要將OpenCV相關檔案放在/home/OpenCV-2.3.1a目錄下(使用“cp /home/OpenCV-2.3.1a /opt -r”),放在/opt/OpenCV-2.3.1a目錄下,這時我們要修改一個檔案。該檔案位於“lib/pkgconfig”目錄下,即“lib/pkgconfig/opencv.pc”檔案,使用gedit開啟這個檔案,將“prefix=/opt/OpenCV-2.3.1a”改為“prefix=/opt/OpenCV-2.3.1a”儲存即可(6所示)。 圖6 修改/opt/OpenCV-2.3.1a/lib/pkgconfig/opencv.pc檔案並儲存
然後,將opencv.pc拷貝到/usr/share/pkgconfig目錄,此時可以使用“pkg-config opencv --cflags --libs”測試opencv.pc配置是否生效(7所示)。 7 測試opencv.pc配置是否生效
Step3.3 使用如下命令修改/etc/ld.so.conf檔案,將OpenCV連結庫添加進去。(此時若無許可權,請使用root進行操作,可以使用“sudo su”命令切換root使用者)。
$ echo "/opt/OpenCV-2.3.1a/lib " >> /etc/ld.so.conf
Step3.4 使用Qt IDE建立項目,依次選擇“建立項目-其他項目-空的Qt項目”,單擊“選擇”,瀏覽到指定目錄,依次單擊“下一步”即可。
在專案檔(*.pro,如本人建立項目的名稱為OpenCV,即需要修改OpenCV.pro)中添加如下內容:
INCLUDEPATH += /opt/OpenCV-2.3.1a/include/LIBS += `pkg-config opencv --cflags --libs`
其中“LIBS += `pkg-config opencv --cflags --libs`”也可以使用如下形式:
LIBS += /opt/OpenCV-2.3.1a/lib/libopencv_calib3d.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_contrib.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_core.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_features2d.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_flann.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_gpu.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_highgui.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_imgproc.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_legacy.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_ml.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_objdetect.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_ts.so.2.3.1 \ /opt/OpenCV-2.3.1a/lib/libopencv_video.so.2.3.1 \
建立源檔案(*.cpp,,如本人建立的源檔案的檔案名稱為OpenCV.cpp),編寫代碼,構建-構建所有項目(Ctrl+Shift+B)、構建-運行(Ctrl+R)即可。
測試例子(源碼):
#include <opencv/highgui.h>int main( int argc, char** argv ) { IplImage* img = cvLoadImage( argv[1] ); cvNamedWindow( "OpenCV", CV_WINDOW_AUTOSIZE ); cvShowImage( "OpenCV", img ); cvWaitKey(0); cvReleaseImage( &img ); cvDestroyWindow( "OpenCV" ); return ( 0 );}
編譯完成後,在可執行檔所在的目錄執行./OpenCV lena\(1\).tiff,效果8所示:圖8 測試效果
備忘:如果在Linux下面使用cvCaptureFromFile( )、cvCaptureFromAVI等函數不能夠開啟視頻,這是因為統解碼器的問題。我們只需要安裝ffmpeg解碼器(注意在執行./configure命令的時候一定要加上“—enable-shared”參數,不然OpenCV將找不到ffmpeg庫,如本人使用的命令為“./configure --enable-shared --enable-gpl”)。Ubuntu下也可以開啟任意一個視頻檔案(或者在Ubuntu軟體中心),將gstreamer的plugins通通裝上。具體方法請問穀哥度娘,這裡不做贅述。在Ubuntu下用OpenCV播放視頻效果7所示:圖7 Ubuntu下OpenCV播放視頻效果
相關代碼如下:
#include <opencv/cv.h>#include <opencv/highgui.h>intmain( int argc, char **argv ){ cvNamedWindow( "Video", CV_WINDOW_FULLSCREEN ); CvCapture *capture = cvCreateFileCapture( argv[ 1 ] ); IplImage *frame; while (1) { frame = cvQueryFrame( capture ); if ( !frame ) break; cvShowImage( "Video", frame ); char c = cvWaitKey( 33 ); if ( c == 27 ) break; } cvReleaseCapture( &capture ); cvDestroyWindow( "Video" ); return ( 0 );}
附錄:
1. Ubuntu中開啟終端的方法:
法1. (當然是笨方法了),依次開啟(應用程式-附件-終端),如果閑的麻煩,可以直接把它添加面板,這樣也方便點。
法2.首先按住Alt,然後按一下F2,出來一個運行框,在裡面輸入 gnome-terminal即可運行。在這個運行框裡,可以執 行很多命令,想當於Windows的[運行](Windows+R鍵),不過很難記住。
法3. 可以把終端視窗開啟放在滑鼠右鍵,效果是在案頭或檔案夾內的空白處右鍵點擊,將出現“從終端開啟”的捷徑。那個需要使用一個軟體。安裝很簡單,開啟終端,在裡面輸入以下命令:
$ sudo apt-get install nautilus-open-terminal
然後登出下,即可看到!
2.如果無法更新或者安裝軟體,請使用如下命令:
$ sudo dpkg --configure -a
參考連結:
http://opencv-extension-library.googlecode.com/svn/trunk/QtOpenCV/
http://code.google.com/p/qt-opencv-multithreaded/wiki/Documentation
http://qt.nokia.com/
http://ffmpeg.org/
http://www.cnblogs.com/niocai/archive/2011/07/15/2107472.html
http://blog.163.com/kingore@126/blog/static/8540871920113382233164/
附件下載:
Ubuntu系統光碟片:
http://115.com/file/an0mpuer# ubuntu-11.10-desktop-i386.iso
http://115.com/file/e78j6ym2# ubuntu-12.04-desktop-i386.iso
編譯後的檔案:
http://115.com/file/an0m24z1# QtSdk-offline-linux-x86-v1.2.1.run
http://115.com/file/c2ap6pm8# OpenCV-2.3.1a(ubuntu-11.10).tar.bz2
http://115.com/file/e78jirjm# OpenCV-2.3.1a(ubuntu-12.04).tar.bz2
http://115.com/file/e78bxqn2# OpenCV-2.3.1a(rhel-6.2).tar.gz
http://115.com/file/e7jwbi6p# OpenCV-2.4.0(ubuntu-12.04).tar.bz2
原始碼:
http://115.com/file/becmjqxa# OpenCV-2.3.1a.tar.bz2
http://115.com/file/anc42qnb# OpenCV-2.4.0.tar.bz2
http://115.com/file/becmju89# cmake-2.8.8.tar.gz