Ubuntu下移植OpenCv


 

 

通過近一周的時候終於成功交叉編譯opencv成功了,真心不容易。有一句話乃真理也,凡事貴在堅持。過程總是痛苦的,因為不懂得很多問題但是又需要面對很多問題,最大的收獲就是耐心解決所有問題后就懂得這些了。

 

         1.為什么要交叉編譯opencv?

         之前比較天真,以為在Ubuntu上安裝好opencv后,如果gcc通過編譯,那么就直接arm-linux-g++嘛,事實證明我真的很天真。

         之所以要交叉編譯opencv,是因為在編譯的時候,gcc和arm-linux-gcc所需要調用的庫是不一樣的,盡管名字是一樣的。至於為什么,我猜應該是編譯出來的可執行文件是在不同環境下運行的,所以編譯的時候要鏈接的庫當然不能是一樣的。

         2.為什么選擇opencv2.3.1

         說實話挺艱辛的,從opencv2.4.10到opencv2.4.9再到opencv1.0,這三個版本都未能成功交叉編譯,后來只好繼續嘗試,終於在第四個版本opencv2.3.1成功了。貴在堅持。

        

 

一、開發環境

 

宿主機Ubuntu12.04

交叉編譯器:arm-linux-gcc4.5.1(友善之臂)

cmake-2.8.7-Linux-i386.sh

 

二、編譯opencv

 

1.解壓

         解壓opencv2.3.1到任意目錄下,我的壓縮包本來放在/home/ljy-linux/下,直接解壓

         #tar jxvf OpenCV-2.3.1a.tar.bz

 

2.進入源目錄並修改

         為什么要修改,因為安裝的時候會出錯所以直接先修改了

         修改OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h文件第63行的源碼:將absl()修改為abs()

         #cd OpenCV-2.3.1/modules/flann/include/opencv2/flann/

         #vi dist.h

         修改完之后保存

 

3.運行cmake-gui

         運行之前先建兩個目錄

         #cd /usr/local

#mkdir arm

         #mkdir opencv-arm

         目錄arm用來安裝opencv,opencv-arm則作為交叉編譯的工作目錄

#cmake-gui

        

選擇源代碼目錄:/home/ljy-linux/OpenCV-2.3.1

選擇Build目錄:/usr/local/opencv-arm/

點擊Configure,保持generator為Unix Makefiles,選擇Specify options for cross-compiling,點擊Next
Operating System填寫arm-inux
C Compilers填寫/usr/local/arm/FriendlyARM/4.5.1/bin/arm-linux-gcc
C++ Compilers填寫/usr/local/arm/ FriendlyARM/4.5.1/bin/arm-linux-g++
程序庫的Target Root填寫/usr/local/arm/ FriendlyARM/4.5.1/,然后點擊Finish

修改默認配置,默認安裝目錄為/usr/local,把CMAKE_INSTALL_PREFIX變量改為/usr/local/arm/
去掉WITH_TIFF(如果不需要的話一定要勾選掉)

再次點擊Configure

然后點擊Generate生成Makefile

 

4.編譯和安裝

         編譯之前,修改一下CMakeCache.txt。

         #cd  /usr/local/opencv-arm

         #vi CMakeCache.txt

         CMAKE_EXE_LINKER_FLAGS原來為空,加上-lpthread -lrt

         開始編譯

         #make

         完全編譯完成后安裝

         #make install

        

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

         // test.cpp

 

#include <cv.h>

#include <cxcore.h>

#include <highgui.h>

 

 

int main()

{

        CvCapture* capture = NULL;

        IplImage* frame = NULL;

 

        if( !(capture = cvCaptureFromCAM(-1)))

        {

                fprintf(stderr, "Can not open camera./n");

                return -1;

        }

 

        cvNamedWindow("video", 1);

 

        while(frame = cvQueryFrame( capture ) )

        {

                cvShowImage("video", frame);

        }

 

        cvDestroyWindow("video");

        cvReleaseCapture(&capture);

        return 0;

}

 

6.編譯連接測試程序

 

         arm-linux-g++ -I /usr/local/arm/include/opencv/ -L /usr/local/arm/lib//libopencv_imgproc.so -L /usr/local/arm/lib//libopencv_core.so -L /usr/local/arm/lib//libopencv_flann.so  -L /usr/local/arm/lib//libopencv_highgui.so  -L /usr/local/arm/lib//libopencv_ml.so -lpthread -lrt -o test test.cpp

 

         似乎有些警告,先忽略了。

7.放到arm上運行

 

  放到板上運行之前要先把之前編譯好的庫文件放到板子上面。

  原本是在板子上面創建同樣的路徑,后來發現運行不了,提示找不到庫文件,后來想想直接把lib下的所有.so文件放到了根目錄的/lib下,再次運行,成功了。

  類似的,應該只要把編譯好的庫文件一起放在arm板上的系統庫文件中就可以了。

8.成功只是一半的

 

  運行是成功的,編譯好了的庫也被成功調用了,但是arm板提示說缺少界面的創建,大概就是這個意思,所以還需要一些界面來打開窗口等等,可以使用qt等。因為友善之臂arm板的界面是用qt寫的,所以接下來學習一下qt的編程然后加上OpenCv再在arm板上打開攝像頭並顯示出來。


免責聲明!

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



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