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.gz–C /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過程中一般會報出各種各樣的錯誤,且每次編譯可能問題都不一樣,現將我所遇到的問題及解決方案理出如下:
1
遇到problem: undefine ....
辦法: 在對應的Makefile 中 LIBS後加上 -lrt
2
遇到: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'
辦法:這是個BUG,QT裡面應該先判斷編譯器版本的,結果人家找出來放到官網了,還好他們給出瞭解決方案:
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.gz–C /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.gz–C /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,保持generator為Unix 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過程中可能會遇到如下問題:
1 遇到:
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.txt,CMAKE_EXE_LINKER_FLAGS原來為空,加上-lpthread -lrt,重新編譯,錯誤消除
2 遇到:
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.txt,WITH_TIFF:BOOL=ON,改成OFF,重新編譯,錯誤消除
3 遇到:OpenCV-2.2.0/modules/ml/src/gbt.cpp:474: error: 'expl' was not declared in this scope
解決: 修改gbt.cpp中14行,16行:註釋掉
//#if ANDROID
#define expl(x) exp(x)
//#endif
4 遇到: 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.錯誤消除,
5 遇到:/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))) //我這裡寫的引數是0 代表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/下。