为海思Hi3516CV610编译静态链接OPENCV库指南

1. 环境准备

1.1 开发环境搭建

请参考海思官方文档:

  • 《使用docker容器搭建开发环境用户指南》
  • 《Hi35XXVXXX开发环境用户指南》

在这里插入图片描述

1.2 编译器安装

确保已安装海思Hi3516CV610平台的交叉编译工具链:

# 验证编译器是否安装
arm-v01c02-linux-musleabi-gcc --version

1.3 依赖库准备

OpenCV依赖多个库,需要先安装这些依赖:

# 安装必要的依赖
apt-get update
apt-get install -y build-essential cmake git libjpeg-dev libpng-dev libtiff-dev libjasper-dev

2. 源代码获取

2.1 下载OpenCV源码

# 创建源码目录
mkdir -p opencv-4.5.5

# 进入目录
cd opencv-4.5.5

# 下载源码(可从GitHub获取)
wget https://github.com/opencv/opencv/archive/refs/tags/4.5.5.tar.gz

# 解压源码
tar -xzf 4.5.5.tar.gz
mv opencv-4.5.5/* .
rm -rf opencv-4.5.5 4.5.5.tar.gz

2.2 下载OpenCV contrib模块(可选)

如果需要额外的功能模块,可以下载OpenCV contrib:

# 下载contrib模块
wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.5.tar.gz

# 解压
mkdir -p contrib
tar -xzf 4.5.5.tar.gz -C contrib
mv contrib/opencv_contrib-4.5.5/* contrib/
rm -rf contrib/opencv_contrib-4.5.5 4.5.5.tar.gz

3. 编译配置

3.1 创建交叉编译配置文件

创建一个交叉编译工具链文件 arm-v01c02-linux-musleabi.toolchain.cmake

# 交叉编译工具链配置文件
# 设置目标系统名称和处理器架构
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

# 指定交叉编译工具链
# TOOLCHAIN_PREFIX:交叉编译工具链前缀
# CMAKE_C_COMPILER/CMAKE_CXX_COMPILER:C/C++编译器
# CMAKE_AR/CMAKE_RANLIB:归档工具和符号表生成工具
set(TOOLCHAIN_PREFIX arm-v01c02-linux-musleabi-)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++)
set(CMAKE_AR ${TOOLCHAIN_PREFIX}ar)
set(CMAKE_RANLIB ${TOOLCHAIN_PREFIX}ranlib)

# 指定目标系统根目录
set(CMAKE_SYSROOT /)

# 搜索路径设置
# NEVER:不在目标系统中查找程序
# ONLY:只在目标系统中查找库和头文件
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

# 编译选项
# -mcpu=cortex-a7:针对Cortex-A7架构优化
# -mfloat-abi=softfp:使用软浮点ABI
# -mfpu=neon-vfpv4:使用NEON和VFPv4浮点单元
# -O2 -DNDEBUG:优化级别和禁用调试信息
set(CMAKE_CXX_FLAGS "-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -O2 -DNDEBUG" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS "-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -O2 -DNDEBUG" CACHE STRING "" FORCE)

# 链接选项
# -static:静态链接
set(CMAKE_EXE_LINKER_FLAGS "-static" CACHE STRING "" FORCE)
set(CMAKE_SHARED_LINKER_FLAGS "-static" CACHE STRING "" FORCE)

3.2 OpenCV库裁剪策略

OpenCV库默认包含很多功能模块,为了减小静态库大小,需要根据实际需求进行裁剪。以下是常用的裁剪策略:

3.2.1 按功能模块裁剪

OpenCV的核心功能模块包括:

  • core:核心功能,包含基础数据结构和算法
  • imgproc:图像处理功能
  • imgcodecs:图像编解码功能
  • highgui:图形界面功能(通常可以禁用)
  • videoio:视频输入输出功能(通常可以禁用)
  • dnn:深度学习功能(通常可以禁用)
  • calib3d:相机标定和3D重建功能(通常可以禁用)
  • features2d:特征检测和描述功能(通常可以禁用)
  • ml:机器学习功能(通常可以禁用)
  • objdetect:目标检测功能(通常可以禁用)
  • photo:计算摄影功能(通常可以禁用)
  • stitching:图像拼接功能(通常可以禁用)
  • video:视频分析功能(通常可以禁用)
  • gapi:图形API功能(通常可以禁用)
3.2.2 按依赖库裁剪

OpenCV依赖很多第三方库,可以通过禁用不必要的依赖来减小库大小:

  • WITH_OPENCL:OpenCL加速(禁用)
  • WITH_CUDA:CUDA加速(禁用)
  • WITH_IPP:Intel IPP加速(禁用)
  • WITH_TBB:Intel TBB并行库(禁用)
  • WITH_EIGEN:Eigen数学库(禁用)
  • WITH_V4L:视频4 Linux(禁用)
  • WITH_GSTREAMER:GStreamer多媒体框架(禁用)
  • WITH_FFMPEG:FFmpeg视频库(禁用)
  • WITH_GTK:GTK图形界面(禁用)
  • WITH_QT:Qt图形界面(禁用)
  • WITH_OPENEXR:OpenEXR高动态范围图像格式(禁用)
  • WITH_JASPER:JPEG-2000格式(禁用)
  • WITH_WEBP:WebP图像格式(可选禁用)
  • WITH_PNG:PNG图像格式(根据需求选择)
  • WITH_JPEG:JPEG图像格式(根据需求选择)
  • WITH_TIFF:TIFF图像格式(根据需求选择)

3.3 运行CMake配置

# 创建构建目录
mkdir -p build
cd build

# 运行CMake配置
# -DCMAKE_TOOLCHAIN_FILE:指定交叉编译工具链配置文件
# -DCMAKE_INSTALL_PREFIX:指定安装目录
# -DBUILD_SHARED_LIBS=OFF:设置为OFF以禁用动态库编译
# -DBUILD_STATIC_LIBS=ON:设置为ON以编译静态库
# -DBUILD_*:禁用不必要的功能以减少编译时间和库大小
# -DWITH_*:禁用不必要的依赖以减少库大小
# -DBUILD_opencv_*:只编译必要的模块,减少库大小
# 裁剪策略:只保留核心图像处理功能,禁用所有可选模块和依赖
cmake .. \
    -DCMAKE_TOOLCHAIN_FILE=../arm-v01c02-linux-musleabi.toolchain.cmake \
    -DCMAKE_INSTALL_PREFIX=../install \
    -DBUILD_SHARED_LIBS=OFF \
    -DBUILD_STATIC_LIBS=ON \
    -DBUILD_EXAMPLES=OFF \
    -DBUILD_TESTS=OFF \
    -DBUILD_PERF_TESTS=OFF \
    -DBUILD_opencv_apps=OFF \
    -DWITH_OPENCL=OFF \
    -DWITH_CUDA=OFF \
    -DWITH_IPP=OFF \
    -DWITH_TBB=OFF \
    -DWITH_EIGEN=OFF \
    -DWITH_V4L=OFF \
    -DWITH_GSTREAMER=OFF \
    -DWITH_FFMPEG=OFF \
    -DWITH_GTK=OFF \
    -DWITH_QT=OFF \
    -DWITH_OPENEXR=OFF \
    -DWITH_JASPER=OFF \
    -DWITH_WEBP=OFF \
    -DWITH_PNG=ON \
    -DWITH_JPEG=ON \
    -DWITH_TIFF=OFF \
    -DBUILD_opencv_core=ON \
    -DBUILD_opencv_imgproc=ON \
    -DBUILD_opencv_imgcodecs=ON \
    -DBUILD_opencv_highgui=OFF \
    -DBUILD_opencv_features2d=OFF \
    -DBUILD_opencv_calib3d=OFF \
    -DBUILD_opencv_flann=OFF \
    -DBUILD_opencv_ml=OFF \
    -DBUILD_opencv_objdetect=OFF \
    -DBUILD_opencv_photo=OFF \
    -DBUILD_opencv_stitching=OFF \
    -DBUILD_opencv_video=OFF \
    -DBUILD_opencv_videoio=OFF \
    -DBUILD_opencv_dnn=OFF \
    -DBUILD_opencv_gapi=OFF \
    -DOPENCV_ENABLE_NONFREE=OFF \
    -DOPENCV_GENERATE_PKGCONFIG=ON \
    # 额外的裁剪选项
    -DCV_ENABLE_INTRINSICS=OFF \
    -DOPENCV_ENABLE_POPCNT=OFF \
    -DOPENCV_DISABLE_FILESYSTEM_SUPPORT=ON \
    -DOPENCV_EXTRA_MODULES_PATH= \
    -DOPENCV_ENABLE_NONFREE=OFF \
    -DOPENCV_FORCE_3RDPARTY_BUILD=OFF

3.4 高级裁剪技巧

3.4.1 最小化配置示例

如果只需要最基本的图像处理功能,可以使用以下最小化配置:

# 最小化配置:只保留核心功能
cmake .. \
    -DCMAKE_TOOLCHAIN_FILE=../arm-v01c02-linux-musleabi.toolchain.cmake \
    -DCMAKE_INSTALL_PREFIX=../install \
    -DBUILD_SHARED_LIBS=OFF \
    -DBUILD_STATIC_LIBS=ON \
    -DBUILD_EXAMPLES=OFF \
    -DBUILD_TESTS=OFF \
    -DBUILD_PERF_TESTS=OFF \
    -DBUILD_opencv_apps=OFF \
    # 禁用所有可选模块
    -DBUILD_opencv_highgui=OFF \
    -DBUILD_opencv_videoio=OFF \
    -DBUILD_opencv_dnn=OFF \
    -DBUILD_opencv_calib3d=OFF \
    -DBUILD_opencv_features2d=OFF \
    -DBUILD_opencv_ml=OFF \
    -DBUILD_opencv_objdetect=OFF \
    -DBUILD_opencv_photo=OFF \
    -DBUILD_opencv_stitching=OFF \
    -DBUILD_opencv_video=OFF \
    -DBUILD_opencv_gapi=OFF \
    # 禁用所有可选依赖
    -DWITH_OPENCL=OFF \
    -DWITH_CUDA=OFF \
    -DWITH_IPP=OFF \
    -DWITH_TBB=OFF \
    -DWITH_EIGEN=OFF \
    -DWITH_V4L=OFF \
    -DWITH_GSTREAMER=OFF \
    -DWITH_FFMPEG=OFF \
    -DWITH_GTK=OFF \
    -DWITH_QT=OFF \
    -DWITH_OPENEXR=OFF \
    -DWITH_JASPER=OFF \
    -DWITH_WEBP=OFF \
    -DWITH_PNG=ON \
    -DWITH_JPEG=ON \
    -DWITH_TIFF=OFF \
    # 额外裁剪选项
    -DCV_ENABLE_INTRINSICS=OFF \
    -DOPENCV_ENABLE_POPCNT=OFF \
    -DOPENCV_DISABLE_FILESYSTEM_SUPPORT=ON \
    -DOPENCV_FORCE_3RDPARTY_BUILD=OFF
3.4.2 按具体需求裁剪

根据具体项目需求,可以选择性地启用或禁用特定功能:

  1. 仅需要基础图像处理:启用 core、imgproc
  2. 需要图像读写:额外启用 imgcodecs 和相应的图像格式(如 WITH_PNG、WITH_JPEG)
  3. 需要视频处理:额外启用 videoio 和相应的视频库(如 WITH_FFMPEG)
  4. 需要目标检测:额外启用 objdetect、features2d
  5. 需要相机标定:额外启用 calib3d、features2d
3.4.3 裁剪效果评估

裁剪后的库大小可以通过以下命令评估:

# 查看静态库大小
ls -lh ../install/lib/libopencv_*.a

# 查看总大小
du -sh ../install/lib/

通过合理的裁剪,OpenCV静态库大小可以从几百MB减小到几十MB甚至更小,具体取决于启用的功能模块。

4. 编译过程

4.1 执行编译

# 进入构建目录
cd opencv-4.5.5/build

# 执行编译(使用多线程加速)
# 编译过程:
# 1. 配置阶段:CMake根据指定的交叉编译工具链和配置选项生成Makefile
# 2. 编译阶段:使用交叉编译器编译源码,生成目标文件
# 3. 链接阶段:将目标文件打包成静态库
# 4. 安装阶段:将静态库和头文件复制到指定的安装目录
make -j$(nproc)

# 执行安装
make install

# 验证编译结果
ls -la ../install/lib/

5. Makefile编写与优化

5.1 项目集成示例

在项目的Makefile中集成OpenCV库:

# ------------------- OpenCV 配置 -------------------
# OPENCV_INCLUDE:OpenCV头文件路径(相对路径)
# OPENCV_LIB:OpenCV库文件路径(相对路径)
# 优化建议:
# 1. 变量化路径:使用变量定义路径,便于维护
# 2. 添加依赖检查:确保OpenCV库存在后再编译
OPENCV_INCLUDE := ../../opencv-4.5.5/install/include/opencv4
OPENCV_LIB := ../../opencv-4.5.5/install/lib

# ------------------- 编译选项 -------------------
# CFLAGS:编译选项
# -Wall -Wextra:启用警告
# -Iinclude:包含本地头文件目录
# -I../process_manager/include:包含process_manager头文件目录
# -I$(OPENCV_INCLUDE):包含OpenCV头文件目录
# -g -O2:调试信息和优化级别
# -mcpu=cortex-a7:针对Cortex-A7架构优化
# -DOPENCV_DISABLE_ITT等:禁用不必要的功能
# 优化建议:
# 3. 优化编译选项:根据目标平台调整优化级别
CFLAGS = \
  -Wall -Wextra \
  -Iinclude \
  -I../process_manager/include \
  -I$(OPENCV_INCLUDE) \
  -g -O2 \
  -mcpu=cortex-a7 \
  -DOPENCV_DISABLE_ITT=1 \
  -DOPENCV_NO_ITT=1 \
  -DOPENCV_NO_GSTREAMER=1

# ------------------- 链接选项 -------------------
# LDFLAGS:链接选项
# -static:静态链接
# -L$(OPENCV_LIB):指定OpenCV库文件目录
# -lopencv_core等:链接OpenCV核心模块
# -lpthread -lm -lz:链接系统库
# 优化建议:
# 4. 添加清理规则:包含OpenCV相关文件的清理
# 5. 选择性链接:只链接项目需要的OpenCV模块,减少可执行文件大小
LDFLAGS = \
  -static \
  -L$(OPENCV_LIB) \
  -lopencv_core \
  -lopencv_imgproc \
  -lopencv_imgcodecs \
  -lpthread \
  -lm \
  -lz

6. 常见问题与解决方案

6.1 编译错误

错误信息原因解决方案
找不到依赖库依赖未安装安装必要的依赖库
交叉编译工具链错误编译器未安装或路径错误确保交叉编译工具链已正确安装并添加到PATH
CMake配置错误配置选项错误检查CMake配置选项是否正确
内存不足编译过程需要大量内存增加交换空间或减少并行编译线程数

7. 验证步骤

7.1 库文件验证

# 检查静态库文件
ls -la opencv-4.5.5/install/lib/libopencv_*.a

# 检查头文件
ls -la opencv-4.5.5/install/include/opencv4/opencv2/
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐