OpenCV交叉编译环境搭建

前言

初学OpenCV,在Ubuntu上可以用apt-get方便的解决编译依赖,OpenCV的编译过程较为顺利。但想在嵌入式arm板子上进行测试,编译则不这么顺利,特别是在解决依赖的问题上比较繁琐,如ffmpeg,网上也有很多案例和解决方法可供参考。
我个人追求极简主义(其实是懒……),既然目的仅仅是编译OpenCV,就尽量不要花太多时间去编译其他依赖库,以免本末倒置。在这描述一种借助buildroot构建解决所有编译依赖的方法。

编译buildroot

我个人比较习惯用buildroot去构建文件系统,因为buildroot上的package更新比较及时,在上面我几乎能找到所有我需要的package。同样的,OpenCV在buildroot中也有支持。其实,如果您对OpenCV的版本不敏感的话,那么直接用buildroot就完事了,全剧终……
不过,如果buildroot里的OpenCV的版本不是您想要的,或者您需要编译opencv_contrib(截稿前本人发现buildroot貌似默认不支持编译contrib,可能是由于专利原因吧……),那么就可以先在buildroot里将opencv选上,先整体编译一遍buildroot,这样buildroot就可以自动帮您解决所有编译依赖。
buildroot的编译不是本文重点,无非就是通过menuconfig选好target options、toolchain等,同时把opencv选上(在menuconfig中建议把所有的opencv相关选项都打开,这样可以更完整的编译依赖库),在此就不展开了。

编译OpenCV

完成buildroot编译后,就可以尽情享用它的成果了。编译OpenCV的流程在此也不展开,直接贴cmake配置(具体的cmake配置请按需添减):

cmake -D CMAKE_BUILD_TYPE=RELEASE
-D CMAKE_TOOLCHAIN_FILE=<your path>/toolchainfile.cmake
-D BUILD_SHARED_LIBS=ON
-D CMAKE_INSTALL_PREFIX=<your path>/install
-D OPENCV_ENABLE_PKG_CONFIG=ON
-D BUILD_EXAMPLES=ON
-D BUILD_TESTS=ON
-D BUILD_PERF_TESTS=ON
-D BUILD_opencv_apps=ON
-D BUILD_WITH_DYNAMIC_IPP=OFF
-D BUILD_ITT=OFF
-D WITH_INTELPERC=OFF
-D WITH_IPP=OFF
-D WITH_IPP_A=OFF
-D WITH_TBB=OFF
-D OPENCV_EXTRA_MODULES_PATH=<your path>/opencv_contrib/modules
..

toolchainfile.cmake

在cmake配置中,指定了CMAKE_TOOLCHAIN_FILE,也是直接贴配置(具体的路径、arch、flags请按需修改):

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(TOOLCHAIN_HOST_DIR “<your path>/buildroot/output/host”)

# Root path
set(CMAKE_PROGRAM_PATH “${TOOLCHAIN_HOST_DIR}/bin”)
set(CMAKE_SYSROOT “${TOOLCHAIN_HOST_DIR}/arm-buildroot-linux-gnueabihf/sysroot”)
set(CMAKE_FIND_ROOT_PATH “${TOOLCHAIN_HOST_DIR}/arm-buildroot-linux-gnueabihf/sysroot”)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(ENV{PKG_CONFIG_SYSROOT_DIR} “${TOOLCHAIN_HOST_DIR}/arm-buildroot-linux-gnueabihf/sysroot”)

# Compiler and flags
set(CMAKE_C_COMPILER “${TOOLCHAIN_HOST_DIR}/bin/arm-linux-gcc”)
set(CMAKE_CXX_COMPILER “${TOOLCHAIN_HOST_DIR}/bin/arm-linux-g++”)
set(CMAKE_C_FLAGS “-mfloat-abi=hard”)
set(CMAKE_CXX_FLAGS “-mfloat-abi=hard -Wno-psabi”)

buildroot/output/host

此路径就是buildroot帮我们解决所有依赖库所在的路径,用于指定CMAKE_PROGRAM_PATH、CMAKE_SYSROOT、CMAKE_FIND_ROOT_PATH、CMAKE_C_COMPILER、CMAKE_CXX_COMPILER、PKG_CONFIG_SYSROOT_DIR。

-Wno-psabi

在编译过程中如果出现大量如下warnings:

note: parameter passing for argument of type ‘__gnu_cxx::__normal_iterator<std::pair<int, double>*, std::vector<std::pair<int, double> > >’ changed in GCC 7.1

并且您的gcc版本大于7.1的话,则可在CMAKE_CXX_FLAGS中指定:

-Wno-psabi

我个人追求极简主义(其实是洁癖……),容不得半点warning。
(参考:what-does-the-gcc-warning-project-parameter-passing-for-x-changed-in-gcc-7-1

make && make install

cmake配置成功后,查看log,您会发现之前常见的 ffmpeg 等的依赖根本不需要花时间去解决:

– Video I/O:
– DC1394: NO
– FFMPEG: YES
– avcodec: YES (ver 58.91.100)
– avformat: YES (ver 58.45.100)
– avutil: YES (ver 56.51.100)
– swscale: YES (ver 5.7.100)
– avresample: YES (ver 4.0.0)
– GStreamer: NO
– libv4l/libv4l2: NO
– v4l/v4l2: linux/videodev2.h

最后就是常规的 make 和 make install,感谢buildroot……

后记

本人菜鸟,此文仅提供了一种思路,大神请莫见笑……

### 关于RV1106芯片上的OpenCV交叉编译方法 对于RV1106芯片的OpenCV交叉编译过程,虽然具体的硬件型号可能略有不同,但其基本原理与RV1126/RV1109相似。以下是针对该任务的关键步骤和技术细节: #### 1. 开发环境准备 为了成功完成交叉编译工作,需要搭建合适的开发环境。通常情况下,Linux操作系统(如Ubuntu 18.x 或更高版本)是最常用的选择[^1]。 - **操作系统**: Ubuntu 18 (x64) - **工具链**: 需要适配RV1106架构的GCC交叉编译器工具链。具体路径和名称取决于供应商文档中的说明。 - **CMake版本**: 推荐使用至少v3.10及以上版本来支持复杂的构建选项。 #### 2. 下载并解压OpenCV源码包 选择适合项目需求的稳定版OpenCV源代码。如果倾向于较新特性,则可以选择`opencv4.x`系列;而对于长期维护的需求来说,`opencv3.4.x LTS`分支是一个不错的选择[^2]。 ```bash wget https://github.com/opencv/opencv/archive/refs/tags/4.7.zip -O opencv-4.7.zip unzip opencv-4.7.zip cd opencv-4.7/ mkdir build && cd build ``` 上述脚本展示了获取最新发布的OpenCV压缩包以及初始化子目录结构的过程。 #### 3. 安装必要的依赖项 确保主机系统已安装所有必需的支持软件包,这些组件有助于顺利完成整个编译流程: ```bash sudo apt update sudo apt install -y build-essential cmake git pkg-config libgtk-3-dev \ libavcodec-dev libavformat-dev libswscale-dev python3-dev python3-numpy \ libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev gfortran openexr \ libatlas-base-dev qtbase5-dev libdc1394-22-dev ``` 此列表包含了图像处理、视频编码以及其他多媒体功能所需的头文件和支持库。 #### 4. 使用CMake配置目标平台参数 通过图形界面或者命令行方式运行`cmake-gui`程序,并指定如下重要变量以匹配嵌入式设备的实际状况: | 参数名 | 描述 | |-----------------------|----------------------------------------------------------------------------------------| | `CMAKE_TOOLCHAIN_FILE` | 设置指向预定义好的toolchain.cmake文件位置,用于告知CMake如何调用特定体系结构下的编译器 | | `ENABLE_NEON` | 启用ARM NEON SIMD指令集优化 | | `BUILD_EXAMPLES` | 是否包含示例应用程序 | 例如,在终端执行以下语句可快速启动自动化设置向导模式: ```bash cmake -DCMAKE_BUILD_TYPE=Release \ -DWITH_TBB=ON \ -DBUILD_TESTS=OFF \ -DBUILD_PERF_TESTS=OFF .. ``` 这里关闭了一些不必要的测试模块从而减少最终产物大小的同时加快整体进度。 #### 5. 执行实际编译操作 一旦前期准备工作完毕之后就可以正式开始制造阶段啦! ```bash make -j$(nproc) sudo make install ``` 利用多核CPU加速生成速度并通过最后一步部署到本地/usr/local路径下供后续链接引用。 --- ### 注意事项 由于RV1106属于低功耗SoC类别之一,因此务必确认所选算法模型不会超出内存容量限制范围之外。另外考虑到实时性能表现因素的影响,建议优先考虑轻量化框架替代方案比如TensorFlow Lite For Microcontrollers等作为补充扩展方向。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值