只是简单的记录一下整个编译的过程,怕以后忘记或者再去其他地方寻找比较麻烦,作为一个还没有入门的硬件选手,不知道有没有像我一样不懂交叉编译是什么意思的,
交叉编译:应该是大家如果在window使用虚拟机(Vmware)下载的Ubuntu系统,该系统的架构是intel的,但是也有ARM架构的,通俗一点的说的话:就是CPU不同(不知道说的对不对),大家也可以查一下自己linux系统是什么架构的:直接在终端输入:arch
arch
我的虚拟机显示的是:intel的64位
但是在rk1808开发板的是:aarch,也就是ARM的64位
但是这里再多说一句:大家可能会偶尔发现有armel和armhf的软件包,
大家看到这里可能是遇到一些问题,所以大家先删除之前的opencv要不然会影响后面的编译,可以运行下面的命令查看一下:
#到自己的根目录
cd /
#输入以下查找命令
find ./ -name "opencv*"
#输入下面的命令看一看是否有安装过
pkg-config opencv --libs
pkg-config opencv --modversion
如下:
说明我之前下载过,大家进入自己之前安装的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下载。
解压文件:
#安装UNZIP
sudo apt install unzip
#使用命令进行解压
unzip file.zip
#或者使用双击解压包进行提取
解压进入目录:
安装依赖库:
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包的编译器,
上面是开发板的SDK包中的编译器,
OK,进入opencv的源码目录,
cd platforms/linux/,打开aarch64-gnu文件,
大家可以看到我的编译器目录是写的我的SDK包中的编译器,需要的是下面的文件:
大家在这里也可以使用通过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
最终生成的文件会保存在install里面。
大家如果使用自己交叉编译的opencv在PC端进行编译,需要替换原来SDK包中的lib文件夹下面的opencv,进行编译最后推送到板子中,在开发板中,将上面的四个目录替换原来opencv对应的位置,但是要先确保开发板中的已卸载干净。并且要修改对应的pkgconfig里面的内容。