Ubuntu平台使用aarch64-Linux交叉编译opencv库并移植RK3588S边缘端

英伟达的嵌入式板作为边缘端设备为算法模型的部署提供了便利,目前很多分类或好检测模型针对边缘端做了优化或量化,使得在边缘端也能达到实时稳定的识别和检测效果,常用的嵌入式设备有Nvidia系列的TX2,Xavier NX,Xavier AGX等。
但嵌入式设备普遍的flash emmc不大,一般在32G左右,如果在嵌入式设备进行大量的编译操作很容易空间不足,最近由于部署需要,在Xavier AGX上编译opencv的时候提示No space on the device,从而导致编译失败,因此通过查阅官方文档大小可以通过交叉编译的方式避免文件包在嵌入式上编译,可以通过在x86 pc端进行交叉编译,然后将编译好的文件夹拷贝到ARM设备即可,

安装交叉编译器

以gcc-aarch64-linux-gnu为例 (aarch64-linux-musleabi-gcc也可以 下载地址)

1.Linux x86下安装ARM架构下的编译器

apt-cache search aarch64

sudo apt-get install build-essential
sudo apt-get install g++-aarch64-linux-gnu
sudo apt-get install gcc-aarch64-linux-gnu

下载后在终端输入以下指令查看编译器版本 确认 aarch64-linux-gnu 交叉编译工具链生效

aarch64-linux-gnu-g++ -v
aarch64-linux-gnu-gcc -v

内容记录:

(RKNN_Toolkit2_py3.10) ubuntu20@WIN11DC:~/opencv-4.5.5/build$ aarch64-linux-gnu-g++ -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)

(RKNN_Toolkit2_py3.10) ubuntu20@WIN11DC:~/opencv-4.5.5/build$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)


安装OpenCV

安装opencv依赖的库

sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev

OpenCV包
编译版本注意:编译安装地址不是默认的/usr/local,而是自行指定的文件夹,这样不会产生任何冲突 (最好选择默认路径)

修改aarch64-gnu.toolchain.cmake

在opencv-4.9.0下
修改~/opencv-4.9.0/platforms/linux/aarch64-gnu.toolchain.cmake
修改为:

set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
set(GNU_MACHINE "aarch64-linux-gnu" CACHE STRING "GNU compiler triple")
include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")
#set(WITH_CAROTENE OFF)
#set(WITH_ITT OFF)
#set(WITH_OPENCL OFF)
#set(WITH_ADE OFF)

编译OpenCV库

下载源代码并解压 opencv-4.9.0.tar.gz

tar -xzvf  opencv-4.9.0.tar.gz

在源代码的文件夹 opencv-4.9.0下开始编译

mkdir build && cd build       # 创建一个build文件夹并进入
# mkdir aarch_64_install
# 生成静态库(.a) 不过使用静态库,静态连接,这样应用程序体积会比较大
cmake \
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu20/opencv-4.9.0/platforms/linux/aarch64-gnu.toolchain.cmake \
-D CMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="aarch64-linux-gnu -a --static" 
-DCMAKE_C_FLAGS="aarch64-linux-gnu -a --static" 
-DBUILD_SHARED_LIBS=OFF
-DCMAKE_INSTALL_PREFIX=/usr/local ..

# 生成动态库(.so)
cmake \
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu20/opencv-4.9.0/platforms/linux/aarch64-gnu.toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="aarch64-linux-gnu" 
-DCMAKE_C_FLAGS="aarch64-linux-gnu" 
-DBUILD_SHARED_LIBS=ON 
-DWITH_ADE=OFF
-DCMAKE_INSTALL_PREFIX=/usr/local ..

# 生成(.a  .so) 注意路径,修改路径
cmake \
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu20/opencv-4.9.0/platforms/linux/aarch64-gnu.toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=/home/ubuntu20/opencv-4.9.0/build/install \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_BUILD_TYPE=Release ..
make -j8
sudo make install

在嵌入式设备上,可能需要更新LD_LIBRARY_PATH等环境变量,确保系统能找到新安装的库。

编译版本环境配置(默认环境不需要此步骤):

这是命令

echo "export OpenCV_DIR=/home/ubuntu20/opencv-4.9.0/build/install/lib/cmake/opencv4" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/home/ubuntu20/opencv-4.9.0/build/install/lib" >> ~/.bashrc

这是用gedit打开.bashrc

#打开~/.bashrc
gedit ~/.bashrc
#在文件末尾增加以下内容
export OpenCV_DIR=/home/ubuntu20/opencv-4.9.0/build/install/lib/cmake/opencv4
LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/home/ubuntu20/opencv-4.9.0/build/install/lib
#更新~/.bashrc
source ~/.bashrc 
创建CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(opencv_test)
set(OpenCV_DIR "/home/wlj/opencv-4.9.0/build")
find_package(OpenCV 4.9.0 REQUIRED)
add_executable(cv cv.cpp)
target_link_libraries(cv ${OpenCV_LIBRARIES})
---非内部编译库需要添加此步---
#这些install()指令用于在构建过程的最后阶段将目标文件、库和其他资源安装到指定的目录
# install target and libraries
#set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install/rknn_yolov5_demo_${CMAKE_SYSTEM_NAME})
#install(TARGETS rknn_yolov5_demo DESTINATION ./)
#install(PROGRAMS ${OpenCV_LIBS} DESTINATION lib)
#install(DIRECTORY model DESTINATION ./)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有余地 EliasJie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值