Opencv(3.1)移植到Microzed(7020)(Ubuntu16.04系統 )

July 25, 2016
作者:dengshuai_super
出處:http://blog.csdn.net/dengshuai_super/article/details/52025855
聲明:轉載請註明作者及出處。


(1)第一步肯定是下載opencv的源碼包了,在opencv的官網上下載http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/,我選擇的是3.1.0版本。

(2)第二步已經做好的交叉編譯環境。

(3)第三步下載安裝cmake root權限下apt-get install cmake cmake-curses-gui

(4)第四步解壓源碼包 tar -xvjf Opencv-3.1.0.tar.bz2 -C /home/ds/build
(我是直接手動解壓縮在了這個目錄下)

(5)在/home/ds/build下就有opencv-3.1.0這個文件夾,cd進去,新建一個build(存放編譯出的文件)和一個install文件夾,並且新建一個toolchain.cmake文件,並且輸入
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-none-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-linux-gnueabi-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

(注意:我的交叉編譯器是 arm-none-linux-gnueabi- 如果你的是別的,這裏要改成你自己對應的。)

(6)cd進到build文件夾 輸入
cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake -D CMAKE_INSTALL_PREFIX=/home/ds/build/opencv-3.1.0/install ../
上邊目錄一定要正確,開始我把opencv大小寫寫錯了,安裝到另一個目錄了。

(7)接着再ccmake ./進行配置,配置的內容是所有的以WITH開頭的選項全部選成OFF,(除了WITH_V4L 選爲ON這裏一定特別注意,開始帶with的全改爲off了,結果出現了錯誤,ccmake ./改過來就好了,V4L是在linux內核中關於視頻設備的API接口,因爲我以後需要調用usb攝像頭取圖像)因爲這些需要第三方庫支持的,要是選擇這些的話就需要安裝第三方庫了。

(8)按c配置,按g生成並保存

(9)配置完成後就輸入make開始編譯(可以忽略以下內容,這是給我自己看得。下面是我之前安裝2.4.9時,編譯過程中遇到的一個錯誤/home/ds/build/opencv-2.4.9/modules/video/test/test_tvl1optflow.cpp 這個文件有錯誤)刪了以後還有錯誤,就把WITH_V4L 選爲ON,纔可以的。發現重新安裝還是同樣的錯誤,查網上opencv的組件結構全解析(筆記32.)發現libopencv_ts.so是opencv測試相關代碼,我就ccmake ./ 把ts的build關了。(猜測錯誤的原因是test例子和當前庫的版本不支持)

(10)編譯完成後就是make install安裝啦。安裝完成後在install的文件夾裏就是運行庫啦。

(11)接下來的一大步驟就是製作opencv鏡像(因爲當把opencv鏈接庫文件拷貝到ramdisk.image文件系統時,提示空間不足,仔細發現,發現這個ramdisk鏡像最大只能有16.6M,而整個lib就有十幾M,肯定會提示空間不足了,於是把opencv庫單獨做成鏡像)
1)Xilinx已經提供了製作鏡像的方法(安裝需要在root權限下進行):(製作之前先把libstdc++.so.6和libz.so.6放到install文件夾,如果板子文件系統裏面lib裏有這兩個庫就不用了)
2)cd ${opencv的lib}
3)dd if=/dev/zero of=opencv_lib.img bs=1M count=80
4)mkfs.ext2 -F opencv_lib.img
5)tune2fs opencv_lib.img -i 0 #取消磁盤自檢
6)chmod go+w opencv_lib.img
7)mount opencv_lib.img -o loop /mnt #得到的空鏡像掛載到/mnt(先確定/mnt下沒有別的文件!!)
8)cp -rf ${opencv的lib} /mnt
9) 如cp -rf /home/ds/build/opencv-3.1.0/install/lib /mnt
10)chmod go-w opencv_lib.img
11)umount /mnt(此時lib文件夾下就多了一個opencv.img文件了)

12)

arm-none-linux-gnueabi-g++ -I/home/ds/build/opencv-3.1.0/install/include/opencv -I/home/ds/build/opencv-3.1.0/install/include -L/home/ds/build/opencv-3.1.0/install/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core -ldl -lm -lpthread -lrt edge_detection.cpp -o edge_detection.o

測試程序代碼:

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

IplImage* doCanny(  
    IplImage* in,  
    double    lowThresh,  
    double    highThresh,  
    double    aperture)  
{  
    if (in->nChannels != 1)  
        return(0); // Canny only handles gray scale images  
    IplImage* out = cvCreateImage(   
        cvGetSize( in ),  
        in->depth, //IPL_DEPTH_8U,      
        1);  
    cvCanny( in, out, lowThresh, highThresh, aperture );  
    return( out );  
};  

int main( int argc, char** argv )  
{  
  if(argc!= 3)printf("arguments error! format origin_image.bmp target_image.bmp\n");  
  IplImage* img_rgb = cvLoadImage( argv[1] );  
  IplImage* img_gry = cvCreateImage( cvSize( img_rgb->width,img_rgb->height ), img_rgb->depth, 1);   
  cvCvtColor(img_rgb, img_gry ,CV_BGR2GRAY);  
 // cvNamedWindow("Example Gray", CV_WINDOW_AUTOSIZE );  
 // cvNamedWindow("Example Canny", CV_WINDOW_AUTOSIZE );  
 // cvShowImage("Example Gray", img_gry );  
  IplImage* img_cny = doCanny( img_gry, 10, 100, 3 );  
  if(cvSaveImage(argv[2],img_cny,0)!=0)  
        printf("Save Image Successful\n");  
 // cvShowImage("Example Canny", img_cny );  
 // cvWaitKey(0);  
  cvReleaseImage( &img_rgb);  
  cvReleaseImage( &img_gry);  
  cvReleaseImage( &img_cny);  
 // cvDestroyWindow("Example Gray");  
 // cvDestroyWindow("Example Canny");  
 return 0;  
}

可能有因缺少庫而產生的錯誤,缺什麼庫安裝好;有時候會需要加上-L/lib64。

(12)將(11)步驟生成的opencv.img和編譯生成的可執行文件edge_detection.o還有lena.bmp圖片,一起拷貝進SD卡。

(13)22)在windows下(或者ubuntu)打開串口工具,設置好後,Microzed插電和UART線(跳線冒JP1:1-2,JP2 : 2-3,JP3 : 2-3。從SD卡啓動)。啓動後

如果是zedboard開發板用下列方式:

          ls
          cd /usr
          mkdir cvlib (在usr目錄下創建cvlib文件夾,爲了掛載opencv_lib.img)
          mount /mnt/opencv_lib.img  /usr/cvlib    (不直接掛載到usr/lib,是因爲會覆蓋它,之前步驟18出現錯誤的根本原因是在這裏)
          export LD_LIBRARY_PATH=/usr/cvlib/lib  (/usr/cvlib  ls後發現還有一個lib,那寫.o文件都在這個lib下)
          cd 到/mnt 目錄下
          ./edge_detection.o lena.bmp lena_edge.bmp
          打印出Save Image Successful

如果是Microzed開發板:

用戶名:root  密碼:root 登錄
cd /
ls
mount /mmcblk0p1 /mnt         //-r -o loop 這個選項可以加可以不加(板子上你是直接插在mmc/sd/sdio插槽上的,直接就是走的mmc總線,所以是mmcblk0p1)
cd /mnt
ls                            //可以看到我們放到SD卡里面的東西了
mkdir  /usr/lib/opencvlib     //在/usr/lib下新建opencvlib文件夾
export LD_LIBRARY_PATH=/usr/lib/opencvlib/lib  //設置動態鏈接庫路徑,爲了能找到opencv的庫
cd /mnt
./edge_detection.o lena.bmp lena_edge.bmp       //打印出Save Image Successful
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章