編譯OpenCV for arm-linux 轉


轉:http://blog.csdn.net/noodies/article/details/5798434

OpenCV是Intel支持的開源計算機視覺庫。它由一系列C函數和少量C++類構成,實現了圖像處理和計算機視覺方面的很多通用算法。它不依賴於其它的外部庫—盡管也可以使用某些外部庫。

 

OpenCV使用BSD License,對非商業應用和商業應用都可以免費使用。

 

OpenCV的主要應用環境是Windows和Linux,對於嵌入式系統如arm-linux,很少有資料提到,因此將我在arm-linux編譯過程記錄下來和大家分享。


預備工作:

 

a. 安裝交叉編譯鏈
  我使用的是arm-linux-gcc 4.3.2,解壓到目錄/usr/local/arm/4.3.2,然后在環境變量PATH中增加/usr/local/arm/4.3.2/bin

b. 安裝CMake
  OpenCV 2.0之后的版本,必須使用CMake創建Makefile。我使用的CMake版本是2.8.2,解壓到目錄/usr/local/cmake- 2.8.2-Linux-i386,然后在環境變量PATH中增加/usr/local/cmake-2.8.2-Linux-i386/bin


編譯OpenCV:


1、解壓OpenCV 2.1到/usr/local/OpenCV-2.1.0目錄下

 

2、創建/usr/local/opencv-arm/目錄,作為CMake編譯arm版本的工作目錄

 

3、在X環境下,運行cmake-gui
   選擇源代碼目錄:/usr/local/OpenCV-2.1.0
   選擇Build目錄:/usr/local/opencv-arm/
   點擊Configure,保持generator為Unix Makefiles,選擇Specify options for cross-compiling,點擊Next
   Operating System填寫arm-inux
   C Compilers填寫/usr/local/arm/4.3.2/bin/arm-linux-gcc
   C++ Compilers填寫/usr/local/arm/4.3.2/bin/arm-linux-g++
   程序庫的Target Root填寫/usr/local/arm/4.3.2/,然后點擊Finish

   修改默認配置,默認安裝目錄為/usr/local,對於交叉編譯的庫來說並不合適,所以我把CMAKE_INSTALL_PREFIX變量改為/usr/local/arm/lib/opencv/
   另外,我沒有安裝tiff圖像的支持,因此去掉WITH_TIFF

   點擊Generate生成Makefile

 

4、在終端界面中,進入目錄/usr/local/opencv-arm,運行make編譯opencv

 

編譯時發現如下錯誤:
Linking CXX executable http://www.cnblogs.com/bin/opencv_createsamples
http://www.cnblogs.com/lib/libcxcore.so: undefined reference to `clock_gettime'
http://www.cnblogs.com/lib/libcxcore.so: undefined reference to `pthread_key_create'
http://www.cnblogs.com/lib/libcxcore.so: undefined reference to `pthread_getspecific'
http://www.cnblogs.com/lib/libcxcore.so: undefined reference to `pthread_setspecific'

原因是cmake不認識我定義的arm-linux系統標記,沒有加上庫pthread和rt的鏈接選項

 

5、修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原來為空,加上-lpthread -lrt,重新編譯,錯誤消除

 

6、運行make install,將opencv生成的庫和頭文件安裝到目錄/usr/local/arm/lib/opencv/

 

測試OpenCV庫

 

1、首先確認一下庫是否已編譯正確及其安裝位置

 

查看頭文件:

 

  1. [root@localhost opencv-arm]# ls /usr/local/arm/lib/opencv/include/opencv/  
  2. cvaux.h    cvcompat.h  cv.hpp        cvtypes.h  cvvidsurv.hpp  cxcore.h    cxerror.h  cxmat.hpp  cxoperations.hpp  highgui.h    ml.h  
  3. cvaux.hpp  cv.h        cvinternal.h  cvver.h    cvwimage.h     cxcore.hpp  cxflann.h  cxmisc.h   cxtypes.h         highgui.hpp  

 

查看庫文件:

  1. [root@localhost opencv-arm]# ls /usr/local/arm/lib/opencv/lib  
  2. libcv.a  libcvaux.a  libcvaux.so  libcv.so  libcxcore.a  libcxcore.so  libhighgui.a  libhighgui.so  libml.a  libml.so  

 

2、寫個簡單的測試程序,打開攝像頭並創建一個窗口顯示

 

  1. // test.cpp  
  2.   
  3. #include <cv.h>  
  4. #include <cxcore.h>  
  5. #include <highgui.h>  
  6.   
  7.   
  8. int main()  
  9. {  
  10.         CvCapture* capture = NULL;  
  11.         IplImage* frame = NULL;  
  12.   
  13.         if( !(capture = cvCaptureFromCAM(-1)))  
  14.         {  
  15.                 fprintf(stderr, "Can not open camera./n");  
  16.                 return -1;  
  17.         }  
  18.   
  19.         cvNamedWindow("video", 1);  
  20.   
  21.         while(frame = cvQueryFrame( capture ) )  
  22.         {  
  23.                 cvShowImage("video", frame);  
  24.         }  
  25.   
  26.         cvDestroyWindow("video");  
  27.         cvReleaseCapture(&capture);  
  28.         return 0;  
  29. }  

 

3、編譯鏈接測試程序

 

arm-linux-g++ -I/usr/local/arm/lib/opencv/include/opencv/ -L/usr/local/arm/lib/opencv/lib/ -lcv -lcxcore -lhighgui -lpthread -lrt -o test test.cpp

 

4、復制程序到嵌入式系統中運行

 

首先復制主機/usr/local/arm/lib/opencv/lib/下面的幾個.so文件到嵌入式Linux系統的/lib/目錄下,再復 制我們編譯的test到嵌入式系統/opt/myworks/目錄下(並確保文件test屬性為可執行),如果test可正常運行沒有報告缺少庫文件,說 明我們編譯的arm-linux版OpenCV庫已經可以正常使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM