通過近一周的時候終於成功交叉編譯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板上打開攝像頭並顯示出來。