1. 程式人生 > >DM8168 OpenCV嘗試與評估(編譯ARM版OpenCV)

DM8168 OpenCV嘗試與評估(編譯ARM版OpenCV)

gnu ner arm sdn ack all finish tools 再次



交叉編譯opencv2.3.1,並在DM8168 cortex A8中執行圖像處理。

開發環境:

PC:ubuntu12.04LTS。Intel Core 2 Duo CPU [email protected];

目標平臺:SEED DVS DM8168 DVRRDK 02.00.XXXX

第一篇:OpenCV交叉編譯

參考了http://blog.csdn.net/embeddedman/article/details/7416934

1.安裝交叉編譯鏈

使用DVRRDK中的ti_tools/cgt_a8/arm-2009q1/bin/arm-none-linux-xxx

需將其增加環境變量:能夠加到用戶文件夾下的.bashrc或/etc/profile

格式例如以下:

export PATH=/...../bin:$PATH

2.獲得OpenCV源代碼,本文基於2.3.1

3.安裝cmake cmake-gui

4.建立編譯文件夾如/opencv231/build_arm

5.進入文件夾運行cmake-gui

技術分享

選擇源碼文件夾:/opt/OpenCV-2.31
選擇Build文件夾:/opt/opencv2.3.1_forArm,大家依據自己的喜好設置編譯文件夾吧。

點擊Configure,保持generator為Unix Makefiles。選擇Specify options for cross-compiling,點擊Next
Operating System填寫arm-inux
C Compilers選擇DVRRDK_02.00.00.23/ti_tools/cgt_a8/arm-2009q1/bin/arm-none-linux-gnueabi-gcc
C++ Compilers填寫.......-g++
程序庫的Target Root填寫OpenCV安裝文件夾,然後點擊Finish


上面標註的表示opencv將要安裝的文件夾,默覺得/usr/local,為了便於管理,大家能夠安裝在自己設定的文件夾下,能夠改動,同一時候。網上資料說:另外,我沒有安裝tiff圖像的支持,因此去掉WITH_TIFF(出自:http://blog.csdn.net/eagelangel/article/details/7232364)。在此點擊Configure,然後點擊Gennerate就會生成Makefile。

技術分享

進入/opt/opencv2.3.1_forArm文件夾。運行make命令,就會編譯opencv,編譯過程中遇到例如以下錯誤:

In file included from /opt/OpenCV-2.3.1/modules/flann/src/precomp.hpp:9,
from /opt/opencv2.3.1_forArm/modules/flann/opencv_flann_pch_dephelp.cxx:1:
/opt/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h: In function ‘T cvflann::abs(T) [with T = long double]‘:
/opt/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h:63: error: ‘fabsl‘ was not declared in this scope
make[2]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/opencv_flann_pch_dephelp.obj] Error 1
make[1]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/all] Error 2
make: *** [all] Error 2

解決方法:改動OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h文件第63行的源代碼:將absl()改動為abs()

假設編譯過程遇到例如以下錯誤:

Linking CXX executable ../../bin/opencv_test_calib3d
../../lib/libopencv_core.so: undefined reference to `pthread_key_create‘
../../lib/libopencv_core.so: undefined reference to `pthread_getspecific‘
../../lib/libopencv_ts.so: undefined reference to `pthread_key_delete‘
../../lib/libopencv_core.so: undefined reference to `pthread_once‘
../../lib/libopencv_core.so: undefined reference to `clock_gettime‘
../../lib/libopencv_core.so: undefined reference to `pthread_setspecific‘
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_test_calib3d] Error 1
make[1]: *** [modules/calib3d/CMakeFiles/opencv_test_calib3d.dir/all] Error 2
make: *** [all] Error 2

解決方式:改動/opt/opencv2.3.1文件夾下的CMakeCache.txt。CMAKE_EXE_LINKER_FLAGS原來為空。加上-lpthread -lrt,假設沒有自己加上。


註意:每次錯誤產生。經改動後。僅僅要再次運行make命令就接著編譯,編譯成功後,運行make intall命令就會安裝opencv。

因為本人的安裝文件夾為:/opt/opencv2.3.1_arm,大家能夠看到生成了bin、lib、include等文件夾,例如以下:


技術分享

第二篇

執行

1.將以上文件夾lib include是必須的拷貝的板子上。文件夾能夠隨意,也能夠放到系統動態庫文件夾。關於這兩點能夠參考:

http://blog.chinaunix.net/uid-23215128-id-2521319.html

一個演示樣例代碼:

#include "cv.h"   
    #include "highgui.h"   

      
    int main( int argc, char** argv )  

    {  
      IplImage* pImg; //聲明IplImage指針   

      
      //加載圖像。強制轉化為Gray   

      if( argc == 3 &&  

          (pImg = cvLoadImage( argv[1], 0)) != 0 )  
        {  
      
          IplImage* pImg2 = cvCreateImage(cvGetSize(pImg),  
                          pImg->depth,  
                          pImg->nChannels);  
          cvCopy(pImg, pImg2, NULL);  
      
          cvSaveImage(argv[2], pImg2);//把圖像寫入文件   

      
      
          cvReleaseImage( &pImg ); //釋放圖像   

          cvReleaseImage( &pImg2 ); //釋放圖像   

          return 0;  
        }  
      
      return -1;  
    } 

採用下面命令方式在pc上進行編譯,當然編譯時所連接的庫是arm版的:

arm-none-linux-gnueabi-g++ test.cpp -o main1 -I/usr/local/arm/opencv/include/opencv -I/usr/local/arm/opencv/include -L/usr/local/arm/opencv/lib -lpthread -ldl -lrt -lopencv_core -lopencv_highgui

(文件夾可能有所不同)

假設PC中 arm的庫的路徑與lib在板子上的路徑不一致的話,運行程序會提示找不到庫,這時能夠通過板卡設置export LD_LIBRARY_PATH= 使程序能夠搜索到庫。

另外最好將板子上opencvlib的文件夾見一個軟連接到/usr/lib.

2.運行

./


結論:

終於執行結果:cvSplit cvMin cvCreateImage等等的操作,大概是臺式機PC的1/40的速度。

計劃:與DSP聯合運算。


DM8168 OpenCV嘗試與評估(編譯ARM版OpenCV)