天天看點

海思移植opencv+車輛檢測

1.確定ubuntu能上網

2.安裝cmake

代碼: 全選

sudo apt-get install cmake-gui

3.下載下傳opencv2.4.9 Linux版源碼,不要用最新的3.0.0

http://opencv.org/downloads.html

4.解壓opencv源碼

代碼: 全選

unzip opencv-2.4.9.zip

5.建立一個build目錄用于編譯和一個output目錄用于存放編譯完成後的海思平台的opencv:

代碼: 全選

[email protected]:~/zhouhua/opencv/opencv-2.4.9$ ls

3rdparty        LICENSE    apps   data  include    modules    samples

CMakeLists.txt  README.md  cmake  doc   index.rst  platforms

[email protected]:~/zhouhua/opencv/opencv-2.4.9$ cd ..    

[email protected]:~/zhouhua/opencv$ ls

build  opencv-2.4.9  opencv-2.4.9.zip  output

[email protected]:~/zhouhua/opencv$ mkdir build

[email protected]:~/zhouhua/opencv$ mkdir output

6.執行cmake-gui

代碼: 全選

[email protected]:~/zhouhua/opencv/opencv-2.4.9$ cmake-gui

點選Browse Source選擇~/zhouhua/opencv/opencv-2.4.9

點選Browse Build選擇~/zhouhua/opencv/build

然後點選Configure

此時出現的對話框選擇最後一項:Specify options for cross-compiling

下一步

Operating System填寫arm-hisiv100nptl-linux

C填寫arm-hisiv100nptl-linux-gcc

C++填寫arm-hisiv100nptl-linux-g++

下一步,然後等待Configuration done

然後在出現的清單中修改CMAKE_INSTALL_PREFIX為~/zhouhua/opencv/output

然後點選Generate

等待Generation done

即可關閉cmake軟體。

7.進入build目錄執行make

代碼: 全選

[email protected]:~/zhouhua/opencv/build$ make

提示出錯:

代碼: 全選

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

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

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

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

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

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

修改CMakeCache.txt大約200行處

//Flags used by the linker.

CMAKE_EXE_LINKER_FLAGS:STRING= -lpthread -lrt

繼續make

可能出現如下錯誤

代碼: 全選

CMake Error at /home/xlab/zhouhua/opencv/opencv-2.4.9/cmake/cl2cpp.cmake:50 (string):

  string does not recognize sub-command MD5

make[2]: *** [modules/ocl/opencl_kernels.cpp] Error 1

make[1]: *** [modules/ocl/CMakeFiles/opencv_ocl.dir/all] Error 2

make: *** [all] Error 2

删除/home/xlab/zhouhua/opencv/opencv-2.4.9/cmake/cl2cpp.cmake的第50行的内容即可。

繼續make

完成後執行make install

代碼: 全選

[email protected]:~/zhouhua/opencv/output$ ls

LICENSE  bin  include  lib  share

8.得到了include和lib目錄就可以編寫程式了,來試試最常用的車輛檢測吧

編寫如下代碼

代碼: 全選

[cpp] view plain copy

海思移植opencv+車輛檢測
海思移植opencv+車輛檢測
  1. #include"cv.h"  
  2. #include"highgui.h"  
  3. #include"stdio.h"  
  4. #include<sys/time.h>  
  5. structtimeval tpstart,tpend;  
  6. unsigned longtimeuses;  
  7. voidtimeRec()  
  8. {  
  9.     gettimeofday(&tpstart,0);  
  10. }  
  11. int timeRep()  
  12. {  
  13.     gettimeofday(&tpend,0);  
  14.    timeuses=(tpend.tv_sec-tpstart.tv_sec)*1000000+tpend.tv_usec-tpstart.tv_usec;  
  15.     printf("use time:%uus\n",timeuses);  
  16.     return timeuses;  
  17. }  
  18. int main(intargc, char* argv[])  
  19. {  
  20.    IplImage* img= NULL;  
  21.    CvMemStorage* storage =cvCreateMemStorage(0);  
  22.    CvHaarClassifierCascade*cascade = cvLoadHaarClassifierCascade("./model.xml",cvSize(24,24));  
  23.    //CvHaarClassifierCascade* cascade =(CvHaarClassifierCascade*)cvLoad("./lbpcascade_frontalface.xml", 0,0, 0);  
  24.    CvSeq* faces;  
  25.     //加載圖像  
  26.    img = cvLoadImage(argv[1], 0);  
  27.    printf("img w=%d h=%d\n",img->width, img->height);  
  28.    //檢測并計時  
  29.    timeRec();  
  30.    faces = cvHaarDetectObjects(img,cascade,  storage, 1.1, 3, 0,cvSize(24,24) );  
  31.    timeRep();  
  32.    if (faces->total == 0){  
  33.         printf("no face!\n");  
  34.    }  
  35.    printf("car= %d\n", faces->total);  
  36.    //釋放記憶體  
  37.    cvReleaseImage(&img);  
  38.    printf("car detected! car.jpg!\n");  
  39. }  

為了友善,直接将庫和頭檔案拷貝到編譯器的目錄下去

代碼: 全選

[email protected]:~/zhouhua/opencv/mytest$ sudo cp ../output/lib/* /opt/hisi-linux-nptl/arm-hisiv100-linux/arm-hisiv100-linux-uclibcgnueabi/lib/

[email protected]:~/zhouhua/opencv/mytest$sudo cp ../output/include/* /opt/hisi-linux-nptl/arm-hisiv100-linux/arm-hisiv100-linux-uclibcgnueabi/include/ -r

然後編譯:(由于版本比較高,用了opencv2的頭檔案,是以需要額外增加一個-I參數指定頭檔案目錄)

代碼: 全選

arm-hisiv100nptl-linux-g++ face.cpp -I/home/xlab/zhouhua/opencv/output/include/opencv -lopencv_highgui -lopencv_core -lopencv_imgproc -lpthread -lrt -lopencv_objdetect -o face

會提示一些warning,不用管。

編譯成功,然後拷貝車輛分類器檔案過來。

再找個圖檔過來,我這裡就用car.jpg了。

海思移植opencv+車輛檢測

将/root/jiang/OpenCV/output/lib下的libopencv_imgproc.so、libopencv_objdetect.so、libopencv_highgui.so和libopencv_core.so複制到u盤,将u盤中這4個動态庫做軟連接配接庫到/lib目錄下。

代碼: 全選

ln -s /mnt/udisk/libopencv_imgproc.so /lib/libopencv_imgproc.so

ln -s /mnt/udisk/libopencv_objdetect.so /lib/libopencv_objdetect.so

ln -s /mnt/udisk/libopencv_highgui.so /lib/libopencv_highgui.so

ln -s /mnt/udisk/libopencv_core.so /lib/libopencv_core.so

備注:

删除軟連結:

   rm -rf  /lib/libopencv_core.so 注意不是rm -rf  /lib/libopencv_core.so/

然後到car所在的/mnt/udisk目錄去執行即可:

# ./car car.jpg

img w=686h=398

use time:18323188us

car = 5

cardetected! in car.jpg!