当前位置: 首页 > news >正文

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

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

  • 安装交叉编译器
  • 安装OpenCV
    • 安装opencv依赖的库
    • 修改aarch64-gnu.toolchain.cmake
    • 编译OpenCV库
    • 编译版本环境配置(默认环境不需要此步骤):
        • 创建CMakeLists.txt

英伟达的嵌入式板作为边缘端设备为算法模型的部署提供了便利,目前很多分类或好检测模型针对边缘端做了优化或量化,使得在边缘端也能达到实时稳定的识别和检测效果,常用的嵌入式设备有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 aarch64sudo 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 ./)

相关文章:

  • 新手小白如何查找科研论文?
  • Nginx匹配规则详细解析
  • 快充诱骗协议芯片的工作原理及应用场景
  • Python3(19)数据结构
  • [SystemVerilog] Enum
  • UDP/TCP协议知识及相关机制
  • 【使用小皮面板 + WordPress 搭建本地网站教程】
  • 私有知识库 Coco AI 实战(五):打造 ES 新特性查询助手
  • 线上婚恋相亲小程序源码介绍
  • ES基本使用方式
  • 基于策略模式实现灵活可扩展的短信服务架构
  • 美团优选小程序 mtgsig 分析 mtgsig1.2
  • Vue3源码学习-提交限制
  • pytorch中的原地与非原地操作
  • 软件系统验收报告:功能、性能稳定性如何?数据导出卡顿咋回事?
  • GPU集群中的超节点
  • 【Hot 100】 148. 排序链表
  • AI Engine Kernel and GraphProgramming--知识分享1
  • 从有线到无线:冶炼工厂的高效转型
  • 视觉问答论文解析:《Skywork R1V2: Multimodal Hybrid Reinforcement Learning for Reasoning》
  • 解放日报:硬科企业由此迈出“市场第一步”
  • 航海王亚洲巡展、工厂店直销……上海多区推出“五五购物节”活动
  • 浪尖计划再出发:万亿之城2030课题组赴九城调研万亿产业
  • 2025年“投资新余•上海行”钢铁产业“双招双引”推介会成功举行
  • 解放日报:中国大模型企业的发展机遇已经到来
  • 澎湃读报丨解放日报9个版聚焦:上海,加快建成具有全球影响力的科技创新高地