ubuntu16.04交叉編譯opencv 移植到rk1808上

環境+工具:

 

編譯器 : aarch64-linux-gnu-g++ aarch64-linux-gnu-gcc

虛擬機 :ubuntu16.04

cmake-gui

 

cd /usr/local

sudo mkdir opencv

將源碼opencv3.4.3 拷貝到此目錄下,並新建兩個opencv_config, opencv-arm-install文件夾,

 

cmake-gui

 

 

 

點擊configure

Next 如下圖填寫,compilers,c ,c++選項填寫自己要用的交叉編譯工具鏈。Target Root爲檢查編譯工具鏈所在的路徑,根據你的填寫,Finish

 

選擇你要安裝的路徑;我這裏是安裝在剛剛新建的opencv-arm-install下。以防止將之前在ubuntu下的opencv沖掉,這裏我只改了這一個選項,網上有人將動態鏈接庫的選項也去掉了,但是我生成靜態鏈接庫執行demo出現問題,所以又選回來了,生成動態鏈接庫,反正這裏我只改了這一個地方。

然後點擊configure,Generate。

進入opencv_config文件夾下,

執行

make

make install

完成。

 

中間make的時候我遇到過兩個問題:

1.在進度到40%多的時候 opencv-3.4.3/3rdparty/libpng/pngstruct.h:30:18: fatal error: zlib.h: No such file or directory

解決方法

在 opencv-3.4.3/CMakeLists.txt,在514行增加以上代碼: ocv_include_directories(./3rdparty/zlib/)下面一行添加,其它類似錯誤一樣的解決方法

......

ocv_include_directories(${OPENCV_CONFIG_FILE_INCLUDE_DIR})

ocv_include_directories(./3rdparty/zlib/)

......

重新cmake一遍,然後在進行make

 

2.

[ 43%] Building CXX object apps/visualisation/CMakeFiles/opencv_visualisation.dir/opencv_visualisation.cpp.obj

[ 43%] Linking CXX executable ../../bin/opencv_annotation

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

../../lib/libopencv_imgcodecs.so: undefined reference to `pthread_create'

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

../..lib/libopencv_imgcodecs.so: undefined reference to `png_init_filter_functions_neon'

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

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

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

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

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

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

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

../../lib/libopencv_imgcodecs.so: undefined reference to `pthread_join'

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

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

collect2: error: ld returned 1 exit status

 

解決方法:

如下修改:~/opencv-3.4.3/3rdparty/libpng/pngpriv.h文件。

將128行註釋掉,添加129行內容。

128 /*# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \*/

129 # if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \

解決了這兩個問題之後就make通過了

 

之後將編譯完成的lib include文件夾拷貝到開發板上,網上說拷貝到開發板的/usr/local,但是我拷貝到這個文件夾下執行demo的時候會出現error while loading shared libraries: libopencv_highgui.so.3.4: cannot open shared object file: No such file or directory這個錯誤,後將lib文件裏的.so文件拷貝到lib64文件夾下demo可正常執行。

 

編譯一個調用攝像頭並且錄像的demo:

#include <opencv2/core.hpp>

#include <opencv2/imgcodecs.hpp>

#include <opencv2/highgui.hpp>

#include <opencv2/imgproc.hpp>

#include <iostream>

 

using namespace cv;

using namespace std;

 

int main()

{

VideoCapture capture(6);//如果是筆記本,0打開的是自帶的攝像頭,1 打開外接的相機

capture.set(3,640);

capture.set(4,480);

 

Mat img;

VideoWriter vw; //新建一個多媒體文件

int fps = capture.get(CAP_PROP_FPS); //獲取攝像頭的幀率

 

if (fps <= 0)fps = 16;

 

//設置視頻的格式

// vw.open("Video.avi", VideoWriter::fourcc('h', '2', '6', '4'), fps, Size(640, 480));

vw.open("1.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, Size(640, 480));

if (!capture.isOpened()) //判斷攝像頭是否打開

{

cout << "open video faild";

getchar();

}

 

cout << "open video success" << endl;

 

if (!vw.isOpened()) //判斷視頻文件是否創建

 

{

 

cout << "open vw faild" << endl;

 

}

 

cout << "open vw success" << endl;

 

while (1)

 

{

 

capture.read(img); //讀取視頻幀

 

if (img.empty())

break;

vw.write(img); //將視頻幀寫入文件

 

}

return 0;

 

}

 

 

將lib和include文件拷貝到交叉編譯的lib和include的文件夾下。並執行以下命令。

aarch64-linux-gnu-g++ camera.cpp -o camera -I/usr/local/opencv/opencv-arm/include -L/usr/local/opencv/opencv-arm/lib -lopencv_highgui -lopencv_core -lopencv_imgproc -lpthread -lrt -ldl -lopencv_imgcodecs -lopencv_videoio

 

會出現以下警告:

/usr/local/linaro-aarch64-2017.11-gcc7.2/bin/…/lib/gcc/aarch64-linux-gnu/7.2.1/…/…/…/…/aarch64-linux-gnu/bin/ld: warning: …/…/lib/libopencv_imgproc.so, needed by /home/zy/cv22_1.0_rc/cv22_auto_linux_sdk/ambarella/prebuild/third-party/armv8-a/opencv24/usr/lib/libopencv_highgui.so, not found (try using -rpath or -rpath-link)

/usr/local/linaro-aarch64-2017.11-gcc7.2/bin/…/lib/gcc/aarch64-linux-gnu/7.2.1/…/…/…/…/aarch64-linux-gnu/bin/ld: warning: …/…/lib/libopencv_core.so, needed by /home/zy/cv22_1.0_rc/cv22_auto_linux_sdk/ambarella/prebuild/third-party/armv8-a/opencv24/usr/lib/libopencv_highgui.so, not found (try using -rpath or -rpath-link)

這個警告不影響目標代碼的生成,但想去掉的話,其實只需要把找不到的庫放到路徑爲/usr/local/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib/目錄下即可。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章