为海思Hi3516CV610编译静态链接OPENCV库
·
为海思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 按具体需求裁剪
根据具体项目需求,可以选择性地启用或禁用特定功能:
- 仅需要基础图像处理:启用 core、imgproc
- 需要图像读写:额外启用 imgcodecs 和相应的图像格式(如 WITH_PNG、WITH_JPEG)
- 需要视频处理:额外启用 videoio 和相应的视频库(如 WITH_FFMPEG)
- 需要目标检测:额外启用 objdetect、features2d
- 需要相机标定:额外启用 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/
更多推荐
所有评论(0)