1. 程式人生 > >QT+opencv環境搭建

QT+opencv環境搭建

這是我以前做的一個專案經歷,雖然是個不太大的專案,但感覺做完這個專案收穫不少知識,

過程中也解決可一些這樣那樣的問題,也走過一些彎路。

回過頭來就想把一些經歷的一些小挫折,完成專案的一些經驗分享給大家,希望能幫到大家,無論工作也好,學習也好能提高些效率。

專案簡介:開發板上晶片是arm A8架構的,開發板連線攝像頭,連線一個8寸顯示屏。連線上攝像頭,點開應用程式,會看到一個四格視窗介面,視窗顯示視訊畫面等

視窗用QT來畫,影象識別需要呼叫openCV的庫函式。還要用到TCP/UDP協議傳輸圖片。

開發環境:

Intel x86主機

Ubuntu 10.04作業系統

arm開發板

原始碼包:

開發板自帶資料 arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz

官網下載 qt-everywhere-opensource-src-4.6.2.tar.gz

官網下載 cmake-2.8.8-Linux-i386.tar.gz

官網下載 opencv-2.4.6.1.tar.gz


經驗過程:

1、安裝交叉編譯工具

2、編譯安裝QT

3、編譯安裝openCV

4、驗證程式

下面將依次介紹

1、安裝交叉編譯工具鏈

arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz放在 ~/Tiny210/Linux 目錄下

cd ~/Tiny210/Linux

$  tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz

執行命令將在當前路徑出現新目錄 opt/FriendlyARM/toolschain/4.5.1

執行sudo mkdir /usr/local/arm

sudo mv /home/archermind/opt/FriendlyARM/toolschain/4.5.1 /usr/local/arm/ -r

修改PATH路徑:

$  vi ~/.profile

在檔案最後加上一行

PATH=$PATH:/usr/local/arm/4.5.1/bin

vi /root/.profile

在檔案最後加上一行

PATH=$PATH:/usr/local/arm/4.5.1/bin

(/home/archermind為當前環境的主目錄,根據自己的主目錄具體修改

)

儲存退出,然後重啟電腦。

在終端執行 $ arm-linux-gcc –v

會顯示交叉編譯的版本資訊,說明安裝成功。


2、編譯安裝QT

在qt-everywhere-opensource-src-4.6.2.tar.gz所在目錄執行命令:

$  tar xvzf qt-everywhere-opensource-src-4.6.2.tar.gzC /home/archermind

$  cd /home/archermind

將會出現目錄qt-everywhere-opensource-src-4.6.2

$  cd qt-everywhere-opensource-src-4.6.2

執行配置命令

$  sudo ./configure -prefix /usr/local/Trolltech/qt4.6.2 -no-qvfb -embedded arm -depths 4,8,16,32 -qt-mouse-linuxtp -make libs -nomake tools -xplatform qws/linux-arm-g++ -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-glib -qt-freetype -little-endian -stl -v

$  sudo make

make過程中一般會報出各種各樣的錯誤,且每次編譯可能問題都不一樣,現將我所遇到的問題及解決方案理出如下:

遇到problem: undefine ....   

辦法在對應的Makefile 中 LIBS後加上 -lrt

遇到:png.h中有結構體未定義

辦法:下載較新libpng包,解壓到主目錄中,進入該目錄。

$./configure\

-hos=arm-linux\ prefix=/home/archermind/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi enable-shared enable-static

$ make 

$ make install

找到包中的pngconf.h  png.h,複製到指定include目錄中

  ->~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include

3

遇到:jpeghandler.cpp檔案編不過時

辦法:到上級目錄找到jpeg.pro 裡面,把jpeghandler.cpp去掉。

4

遇到:某個目錄下檔案怎麼弄也編不過時,如果該目錄內容對你不重要時。

辦法:找到目錄上一級配置檔案中刪除編譯這個目錄,還可以利用configure選項 例如 -nomake tools,這樣tools目錄不會再編譯了。

5

遇到:Error: register or shift expression expected -- `orr r3,r2,lsl#16'

辦法:這是個BUGQT裡面應該先判斷編譯器版本的,結果人家找出來放到官網了,還好他們給出瞭解決方案:

http://bugreports.qt.nokia.com/browse/QTBUG-6521

To fix this issue patch /src/3rdparty/freetype/include/freetype/config/ftconfig.h Line 330.

    "orr %0, %2, lsl #16/n/t" /* %0 |= %2 << 16 */

    + "orr %0, %0, %2, lsl #16/n/t" /* %0 |= %2 << 16 */

他的意思是加多一個%0%2前面,加上後編譯過。

6

遇到:提示未找到命令:arm-linux-gcc

辦法:由於是sudo命令,需要root使用者也新增環境變數 export PATH=$PATH:/usr/local/arm/3.4.1/bin 

7

遇到:出現以下錯誤:../3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h:298:6: #error "Not supported ARM architecture"

make[1]: *** [obj/release/pcre_compile.o] 錯誤 1

make[1]:正在離開目錄 `/usr/local/qt/qt-everywhere-opensource-src-4.6.3-arm/src/script'

make: *** [sub-script-make_defaulrgefile

方法:add a line in your ./configure parameters, such as "-D__ARM_ARCH_5TEJ__" , or whichever architecture definition that suits the platform.

就是在./configure引數後面增加一個"-D__ARM_ARCH_5TEJ__"

make install

遇到 許可權問題

辦法 sudo make  

     sudo make install

Make完畢之後,執行:

$ sudo make install

結束後會在/usr/local/ Trolltech/qt4.6.2目錄中生成QT檔案。

$ sudo cp /usr/local/Trolltech/qt4.6.2/include/*  ~/Tiny210/Linux/opt/FriendlyARM/toolschain/

4.5.1/ arm-none-linux-gnueabi/include/

$ sudo cp /usr/local/Trolltech/qt4.6.2/ib/* ~/Tiny210/Linux/opt/FriendlyARM/toolschain/

4.5.1/ arm-none-linux-gnueabi/lib/

(拷貝QT標頭檔案和庫檔案,是為了編譯opencv做準備)


3、編譯安裝openCV

終端進入cmake-2.8.8-Linux-i386.tar.gz所在目錄,執行:

$ tar xvzf cmake-2.8.8-Linux-i386.tar.gzC /home/archermind

執行後會出現 /home/archermind/cmake-2.8.11.2-Linux-i386目錄

終端進入opencv-2.4.6.1.tar.gz所在目錄,執行:

$tar xvzf opencv-2.4.6.1.tar.gzC /home/archermind

執行後會出現/home/archermind/opencv-2.4.6.1目錄

$ cd /home/archermind/opencv-2.4.6.1

$ mkdir r build

$ /home/archermind/ cmake-2.8.11.2-Linux-i386/bin/cmake-gui

執行後會出現cmake配置圖形介面。

在視窗化介面中 

選擇原始碼目錄/home/archermind/opencv-2.4.6.1

選擇build目錄/home/archermind/opencv-2.4.6.1/build

點選Configure,保持generatorUnix Makefiles,選擇Specify options for cross-compiling,點選Next

Operating System填寫arm-linux

C compilers 填寫 ~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linuc-gcc

C++comilers填寫~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linuc-g++

ROOT Target 填寫/usr/local/Trolltech/qt4.6.2

(如果不編QT一般添~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1)

點選Finish

預設安裝路徑為 /usr/local,點選Generate生成Makefile

在圖形框主目錄找到WITH_QT 打鉤,WITH_TIFF 去掉鉤 ,點Configure

然後再找到新增的QT_QMAKE_EXECUTABLE選項,確保後面的路徑為/usr/local/Trolltech/qt4.6.2/bin/qmake

configure,再點Generate生成MAkefile

修改~/ opencv-2.4.6.1/modules/highgui/CMakeLists.txt

 找到set(highgui_srcs ,然後下一行加上一行:

           src/cap_v4l.cpp           //加上這個視訊檔案

修改~ /opencv-2.4.6.1/cmake/templates/ cvconfig.h.cmake

24行加上:#define HAVE_CAMV4L2

234行加上:#define HAVE_QT

$ cd /home/archermind/opencv-2.4.6.1/build

$ sudo make

Make過程中可能會遇到如下問題:

遇到:

Linking CXX executable ../../bin/opencv_createsamples

../../lib/libopencv_core.so: undefined reference to `clock_gettime'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'

../../lib/libopencv_core.so: undefined reference to `pthread_key_create

解決方法:

修改build/CMakeCache.txtCMAKE_EXE_LINKER_FLAGS原來為空,加上-lpthread -lrt,重新編譯,錯誤消除

遇到:

Linking CXX executable ../../bin/opencv_createsamples

../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFmalloc'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcpy'

../../lib/libopencv_highgui.so: undefined reference to `TIFFOpen'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFfree'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFwarningHandler'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcmp'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemset'

解決方法:修改build/CMakeCache.txtWITH_TIFF:BOOL=ON,改成OFF,重新編譯,錯誤消除

遇到:OpenCV-2.2.0/modules/ml/src/gbt.cpp:474: error: 'expl' was not declared in this scope

  解決:    修改gbt.cpp14行,16行:註釋掉

                    //#if ANDROID

                    #define expl(x) exp(x)

                    //#endif

遇到: lib/libopencv_features2d.so: undefined reference to `cv::SIFT::SIFT(double, bool, bool, int, int, int, int

  解決: 在OpenCV2.2.0/modules/features2d/src/sift.cpp下 

            #ifdef __arm__

            #define ARM_NO_SIFT

            #endif   

        註釋掉#define ARM_NO_SIFT.錯誤消除,

遇到:/home/ubuntu-1/opencv-2.4.6.1/modules/highgui/src/window_QT.cpp: In member function 'void GuiReceiver::showImage(QString, void*)':

/home/ubuntu-1/opencv-2.4.6.1/modules/highgui/src/window_QT.cpp:953:25: error: 'class QString' has no member named 'toStdString'

解決: vi modules/highgui/src/window_QT.cpp  

    953       cv::imshow(name.toStdString(), im);替換為:

954       cv::imshow(qPrintable(name), im);

編譯成功!

$ sudo make install

安裝成功!

sudo cp /usr/local/lib/* /usr/local/arm/4.5.1/arm-none-linux-gnueabi/lib/ -r

哈哈,到這裡即將大工告成了,下面我們就來編譯一個程式試試,

程式中將會用到交叉編譯器,qt庫,openCV庫等,如果編譯執行成功

說明我們配置的環境沒問題:

驗證程式:

編寫檔案opencv_test.cpp 內容如下:

#include <cv.h> 

#include <cxcore.h> 

#include <highgui.h> 

int main(int argc,char **argv) 

CvCapture* capture = NULL; 

IplImage* frame = NULL; 

if(!(capture = cvCaptureFromCAM(-1))) //我這裡寫的引數是代表dev/video0

fprintf(stderr, "Can not open camera./n"); 

return -1; 

cvNamedWindow("video", 1); 

while(frame = cvQueryFrame( capture ) ) 

cvShowImage("video", frame); 

cvDestroyWindow("video"); 

cvReleaseCapture(&capture);

return 0; 

}

在該檔案所在目錄,執行命令:

$  arm-linux-g++ -o opencv_test opencv_test.cpp -I /usr/local/include -L /usr/local/lib 

-lopencv_core -lopencv_highgui -lpthread –lrt

生成的程式opencv_test,用命令 readelf -h opencv_test 看看是不是arm執行的程式。

在開發板執行opencv-qt程式時,需要把QT所有lib庫和opencv所有lib庫,複製到開發板/lib/下。