Zedboard學習(八):zedboard移植opencv

準備工做

  1. opencv源碼包下載:http://pan.baidu.com/s/1qXTKIdQ(opencv-2.4.9),後面咱們要在虛擬機中編譯;
  2. 搭建好zedboard在Linux下的交叉編譯環境,之前的博客有介紹(Zedboard學習(二):zedboard的Linux下交叉編譯環境搭建)。
  3. zedboard官方SD卡啓動文件,把這些文件放到sd卡中便可。

因爲zedboard上運行的是嵌入式linux,處理器是arm9,與pc的不一樣,代碼必需要通過交叉編譯工具編譯後才能夠執行。
注意:官方給出的這個版本是不帶圖形界面的,桌面版本的Linux咱們能夠本身使用虛擬機制做。(Zedboard學習(一):移植Ubuntu桌面操做系統linux

移植

首先要說明的是,往zedboard上移植opencv跟咱們平時在pc上安裝opencv的過程不一樣。畢竟zedboard是嵌入式平臺不少東西都要刪減,並且zedboard官方移植的linux不帶圖形界面,咱們要本身在命令行下配置環境。
爲了防止權限衝突,建議在root權限下操做,不在root權限下可能會報錯。web

一、先新建一個文件夾,存放全部文件:windows

mkdir opencv_zed
cd opencv_zed

二、下載的源碼是opencv2.4.9.tar.gz,將其從windows下拷貝到虛擬機中(Ubuntu14.04下FTP服務器的搭建配置):
這裏寫圖片描述
拷貝到以前創建的opencv_zed目錄中,輸入指令:ruby

tar -zxvf opencv-2.4.9.tar.gz

三、在opencv-2.4.9中新建installbuild文件夾,並建立toolchain.cmake文件。bash

cd opencv-2.4.9/
mkdir build
mkdir install
touch toolchain.cmake
gedit toolchain.cmake

複製以下內容到toolchain.cmake中:服務器

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-xilinx-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER arm-xilinx-linux-gnueabi-g++)

這類指定了cmake的處理器信息還有交叉編譯工具等。ide

四、進入build文件夾,關聯toolchain.cmake 並配置OpenCV的安裝目錄:svg

cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake -D CMAKE_INSTALL_PREFIX=/home/xhb/Study/OpenCV/opencv_zed/opencv-2.4.9/install ../

CMAKE_INSTALL_PREFIX爲安裝目錄,這個要根據本身的目錄的路徑更改。工具

五、生成Makefile文件。
若是沒有安裝要先安裝cmake-curses-gui:oop

sudo apt-get install cmake-curses-gui

輸入指令,配置cmake:

ccmake ./

配置時咱們只須要把全部with開頭的都選爲OFF(除了WITH_V4L爲ON,這個指的是linux的v4l(video for linux)組件);
c鍵,是configure,保存配置;q鍵,退出;操做不作贅述,都有說明。

六、編譯安裝:

make -j4
make install

最後會在以前創建的install文件夾下生成zedboard上的opencv庫。
這裏寫圖片描述

七、製做opencv鏡像:
進入到最初創建的目錄下,咱們要在這個目錄下生成鏡像:

cd /home/xhb/Study/OpenCV/opencv_zed

鏡像的名字是opencv_lib.img,其大小爲80M:

dd if=/dev/zero of=opencv_lib.img bs=1M count=80

將鏡像格式化爲ext2格式:

mkfs.ext2 -F opencv_lib.img

增長寫權限:

chmod go+w opencv_lib.img

掛載這個鏡像,須要使用管理員權限:

sudo mount opencv_lib.img -o loop /mnt

拷貝編譯生成的opencv庫到掛載的鏡像中,路徑要根據本身的來修改:

sudo cp -rf /home/xhb/Study/OpenCV/opencv_zed/opencv-2.4.9/install/* /mnt

去掉寫權限:

sudo chmod go-w opencv_lib.img

取消掛載:

sudo umount /mnt

這個鏡像文件已經制做好了,後面直接使用。

八、編寫測試程序並編譯:
測試源碼爲edge_detection.cpp:

#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;
}

對它進行交叉編譯:

arm-xilinx-linux-gnueabi-g++ -I /home/xhb/Study/OpenCV/opencv_zed/opencv-2.4.9/install/include -I /home/xhb/Study/OpenCV/opencv_zed/opencv-2.4.9/install/include/opencv -L /home/xhb/Study/OpenCV/opencv_zed/opencv-2.4.9/install/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann ./edge_detection.cpp -o ./edge_detection.o

因爲沒有配置默認的opencv環境變量,因此咱們編譯時手動指定了用到的庫。
因爲只是測試,不作其餘配置,那些一大串的路徑根據本身的路徑更改。

編譯後會產生edge_detection.o文件。
如今咱們的目錄下應該有這幾個文件:
這裏寫圖片描述

九、把edge_detection.o、opencv_lib.img、以及lena.bmp(隨便下張圖片都行)拷貝到u盤中。
這裏寫圖片描述
爲了方便管理我新建了一個文件夾存放這些文件,只要找獲得就行。

十、將官方的sd卡啓動文件拷貝到sd卡中,zedboard從sd卡啓動。
u盤經過USB轉OTG線鏈接到zedboard上;
從設備管理器中找到串口端口號;
使用putty鏈接zedboard,串口波特率是115200;
這裏寫圖片描述

啓動zedboard,等待一下,命令行出現:
這裏寫圖片描述

輸入指令:

fdisk -l

這裏寫圖片描述
咱們從中能夠看到有兩個設備,3980MB的是咱們的sd卡,1967MB的就是U盤了。
下面能夠找到它的設備號爲/dev/sda4。

掛載u盤:

mount /dev/sda4 /mnt

先找到咱們存放鏡像的目錄:
這裏寫圖片描述

把生成的opencv鏡像文件掛載到/usr/lib文件夾中:

cd /usr
mkdir lib
mount /mnt/zed_opencv_test/opencv_lib.img /usr/lib

這裏寫圖片描述

運行可執行文件,讀入lena.bmp,進行邊緣檢測,輸出到out.bmp。

./edge_detection.o lena.bmp out.bmp

運行成功。
這裏寫圖片描述

因爲沒有圖形界面,咱們把u盤拔出,到電腦裏看下out.bmp。
這裏寫圖片描述

移植成功!