Linux如何交叉编译opencv(开发板RK)

只是简单的记录一下整个编译的过程,怕以后忘记或者再去其他地方寻找比较麻烦,作为一个还没有入门的硬件选手,不知道有没有像我一样不懂交叉编译是什么意思的,

交叉编译:应该是大家如果在window使用虚拟机(Vmware)下载的Ubuntu系统,该系统的架构是intel的,但是也有ARM架构的,通俗一点的说的话:就是CPU不同(不知道说的对不对),大家也可以查一下自己linux系统是什么架构的:直接在终端输入:arch

arch

我的虚拟机显示的是:intel的64位

但是在rk1808开发板的是:aarch,也就是ARM的64位

但是这里再多说一句:大家可能会偶尔发现有armel和armhf的软件包,

一.linux命令行编译opencv

大家看到这里可能是遇到一些问题,所以大家先删除之前的opencv要不然会影响后面的编译,可以运行下面的命令查看一下:

#到自己的根目录
cd /
#输入以下查找命令
find ./ -name "opencv*"
#输入下面的命令看一看是否有安装过
pkg-config opencv --libs
pkg-config opencv --modversion

如下:

Linux如何交叉编译opencv(开发板RK)_第1张图片

 说明我之前下载过,大家进入自己之前安装的opencv目录下面进入build目录执行如下:

sudo make uninstall
cd ..
sudo rm -r build

如果大家实在想不起来,直接去手动删除关于libopencv*,include/opencv等文件,主要是usr/local/lib文件夹下面的和usr/local/bin文件夹关于opencv的文件,再次运行:

#这两个命令是大家在编译过程中生成的,在usr/local/lib/pkgconfig文件夹,
#下面有一个opencv.pc文件

pkg-config opencv --libs

pkg-config opencv --modversion

#打开之后如下:
# Package Information for pkg-config

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.4.1
Libs: -L${exec_prefix}/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}

prefix就是下载的东西到什么位置,

下载官方源码:Releases - OpenCV,我这里下载的是3.4.1版本;点击source下载。

Linux如何交叉编译opencv(开发板RK)_第2张图片

 解压文件:

#安装UNZIP
sudo apt install unzip
#使用命令进行解压
unzip file.zip
#或者使用双击解压包进行提取

解压进入目录:

Linux如何交叉编译opencv(开发板RK)_第3张图片

 安装依赖库:

sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

如果是在PC机上可能比较顺利,libjasper-dev这个库可能会出现无法定位,解决如下:

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev

OK,现在应该是可以编译了:

#创建目录
mkdir build
cd build

#进入build目录启动终端
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
将opencv下载到、usr/local里面,编译器应该是使用默认的编译器g++;

sudo make -j16  #启用多线程

#完成之后进行
sudo make install

环境配置:

修改 opencv.conf 文件

sudo gedit /etc/ld.so.conf.d/opencv.conf

添加 opencv 库的安装路径:/usr/local/lib,保存并退出。

保存后执行如下命令使得配置路径生效。

sudo ldconfig

配置 bash ,修改 bash.bashrc 文件:

sudo gedit /etc/bash.bashrc

打开文件后在文末加入以下两行代码

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

保存后退出,然后执行以下命令使配置生效。

source /etc/bash.bashrc

到目前为止可以运行下面代码看输出:

pkg-config opencv --libs

pkg-config opencv --modversion

大家可以自行创建显示图片代码进行测试:并且编译;

g++ te.cpp -o te `pkg-config --cflags --libs opencv`
#选择编译器 源文件 -o 输出文件名 

让后./文件名运行;

二.如何交叉编译移植到开发板

 开发板中的CPU往往跟PC端的不同,大家可以在开发板中的SDK包中找到自己的编译器,不知道为什么使用PC端下载的编译器无法编译通过,只能通过SDK包的编译器,

Linux如何交叉编译opencv(开发板RK)_第4张图片

 上面是开发板的SDK包中的编译器,

OK,进入opencv的源码目录,

Linux如何交叉编译opencv(开发板RK)_第5张图片

 cd platforms/linux/,打开aarch64-gnu文件,

Linux如何交叉编译opencv(开发板RK)_第6张图片

 大家可以看到我的编译器目录是写的我的SDK包中的编译器,需要的是下面的文件:

Linux如何交叉编译opencv(开发板RK)_第7张图片

 大家在这里也可以使用通过PC端下载的交叉编译器文件,在。usr/bin/目录里面;

保存退出即可。新建build进入build目录;

cmake .. \
-D CMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake \
-D CMAKE_INSTALL_PREFIX=../install\
-D CMAKE_SYSTEM_NAME=Linux \
-D CMAKE_SYSTEM_VERSION=1 \
-D CMAKE_SYSTEM_PROCESSOR=aarch64 \
-D CMAKE_C_COMPILER=$cross_compile_toolchain/bin/aarch64-linux-gnu-gcc \
-D CMAKE_CXX_COMPILER=$cross_compile_toolchain/bin/aarch64-linux-gnu-g++

make -j16

sudo make install 

Linux如何交叉编译opencv(开发板RK)_第8张图片

最终生成的文件会保存在install里面。

大家如果使用自己交叉编译的opencv在PC端进行编译,需要替换原来SDK包中的lib文件夹下面的opencv,进行编译最后推送到板子中,在开发板中,将上面的四个目录替换原来opencv对应的位置,但是要先确保开发板中的已卸载干净。并且要修改对应的pkgconfig里面的内容。

你可能感兴趣的:(深度学习,linux,运维,服务器)