opencv+libjpeg-turbo交叉编译

本文介绍如何使用libjpeg-turbo替代libjpeg,显著提升ARM平台下OpenCV图像处理速度。通过SIMD技术,实现2-6倍性能提升。详细步骤包括交叉编译配置与常见问题解决。

opencv库中自带了 对JPEG的编解码,其内部实质上是基于第三方库libjpeg进行解码的。但是libjpeg本身的性能并不是很快,特别是在ARM平台下。

libjpeg-turbo简介

libjpeg-turbo是一个使用SIMD技术(MMX、SSE2、AVX2、NEON)进行加速的JPEG编码解码器,能够在基于x86、x86_64、arm的系统上使用。相对于标准版libjpeg能够提供2-6x的性能提升。
地址:https://github.com/libjpeg-turbo/libjpeg-turbo
在ARM平台可以提前编译好libjpeg-turbo。
编译时可以显式指定安装的路径

cmake -D CMAKE_INSTALL_PREFIX=./install ..

注意: 建议使用libjpeg-turbo-2.0.1这个版本,2.0.2我编译完成链接opencv时有问题。

交叉编译opencv

参考:https://docs.opencv.org/master/d0/d76/tutorial_arm_crosscompile_with_cmake.html
注意:硬件加速选项-DENABLE_VFPV3=ON开启时我cmake不通过,所以遇到同样问题的记得不加这个选项。

cd opencv-3.4.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
            -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake \
           -D CMAKE_INSTALL_PREFIX=./install \
           -D INSTALL_C_EXAMPLES=OFF \
           -D INSTALL_PYTHON_EXAMPLES=OFF \
            -DENABLE_NEON=ON  \
           -D WITH_TBB=ON \
           -DBUILD_TBB=ON  \
           -D WITH_V4L=ON \
           -D WITH_QT=OFF \
            -D WITH_CUDA=OFF \
           -D WITH_OPENGL=ON \
           -D BUILD_opencv_python2=OFF \
            -D BUILD_opencv_python3=OFF \
           -D BUILD_EXAMPLES=OFF ..

用以上的cmake选项就能交叉编译opencv了,但是上面的cmake还是用的libjpeg编译链接的opencv。我们需要在编译中要用libjpeg-turbo替换libjpeg,所以还需要添加额外的选项。
主要选项为

cmake -DWITH_JPEG=ON -DBUILD_JPEG=OFF -DJPEG_INCLUDE_DIR=/path/to/libjepeg-turbo/include/ -DJPEG_LIBRARY=/path/to/libjpeg-turbo/lib/libjpeg.a 

这里贴上添加后的完成cmake

cmake -D CMAKE_BUILD_TYPE=RELEASE \
           -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake \
           -D CMAKE_INSTALL_PREFIX=./install \
           -D INSTALL_C_EXAMPLES=OFF \
           -D INSTALL_PYTHON_EXAMPLES=OFF \
           -DENABLE_NEON=ON  \
           -D WITH_TBB=ON \
           -DBUILD_TBB=ON  \
           -D WITH_V4L=ON \
           -D WITH_QT=OFF \
            -D WITH_CUDA=OFF \
           -D WITH_OPENGL=ON \
           -D BUILD_opencv_python2=OFF \
            -D BUILD_opencv_python3=OFF \
           -D BUILD_EXAMPLES=OFF \
           -DWITH_JPEG=ON  \
          -DBUILD_JPEG=OFF   \
           -DJPEG_INCLUDE_DIR=.../turbo-2.0.1/include  \
          -DJPEG_LIBRARY=.../turbo-2.0.1/lib/libjpeg.a  ..

遇到的坑

按理用上面的方法就能work了,但是编译中遇到错误记录如下

turbo-2.0.1/lib/libjpeg.a(jdmarker.c.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against external symbol `__stack_chk_guard@@GLIBC_2.17' can not be used when making a shared object; recompile with -fPIC

解决方法:在编译libjpeg-turbo库时添加-fPIC选项,具体为在CMakeLists.txt中添加add_compile_options(-fPIC)选项。这样就能编译通过了。

编译成功后在ARM平台下我测试的imencode的耗时由79ms降到了17ms。

Reference:
https://blog.youkuaiyun.com/zymill/article/details/81664233
https://stackoverflow.com/questions/10465209/how-to-compile-opencv-with-libjpeg-turbo

ocv_init_download: OpenCV source tree is not fetched as git repository. 3rdparty resources will be downloaded from github.com by default. Detected processor: aarch64 Looking for ccache - not found libjpeg-turbo: VERSION = 2.1.3, BUILD = opencv-4.7.0-libjpeg-turbo Use full Neon SIMD intrinsics implementation (NEON_INTRINSICS = ON) SIMD extensions: arm64 (WITH_SIMD = 1) Could NOT find OpenJPEG (minimal suitable version: 2.0, recommended version >= 2.3.1). OpenJPEG will be built from sources OpenJPEG: VERSION = 2.4.0, BUILD = opencv-4.7.0-openjp2-2.4.0 OpenJPEG libraries will be built from sources: libopenjp2 (version "2.4.0") CMake Warning (dev) at /usr/share/cmake-3.25/Modules/FindOpenGL.cmake:315 (message): Policy CMP0072 is not set: FindOpenGL prefers GLVND by default when available. Run "cmake --help-policy CMP0072" for policy details. Use the cmake_policy command to set the policy and suppress this warning. FindOpenGL found both a legacy GL library: OPENGL_gl_LIBRARY: /usr/lib/aarch64-linux-gnu/libGL.so and GLVND libraries for OpenGL and GLX: OPENGL_opengl_LIBRARY: /usr/lib/aarch64-linux-gnu/libOpenGL.so OPENGL_glx_LIBRARY: /usr/lib/aarch64-linux-gnu/libGLX.so OpenGL_GL_PREFERENCE has not been set to "GLVND" or "LEGACY", so for compatibility with CMake 3.10 and below the legacy GL library will be used. Call Stack (most recent call first): cmake/OpenCVFindLibsGUI.cmake:66 (find_package) CMakeLists.txt:748 (include) This warning is for project developers. Use -Wno-dev to suppress it. Could not find OpenBLAS include. Turning OpenBLAS_FOUND off Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off Could NOT find Atlas (missing: Atlas_CLAPACK_INCLUDE_DIR) Found apache ant: /bin/ant (1.10.13) Could NOT find JNI (missing: JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 AWT) VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file > /home/pi/opencv-4.7.0/modules/calib3d > /home/pi/opencv-4.7.0/modules/core > /home/pi/opencv-4.7.0/modules/dnn > /home/pi/opencv-4.7.0/modules/features2d > /home/pi/opencv-4.7.0/modules/flann > /home/pi/opencv-4.7.0/modules/gapi > /home/pi/opencv-4.7.0/modules/highgui > /home/pi/opencv-4.7.0/modules/imgcodecs > /home/pi/opencv-4.7.0/modules/imgproc > /home/pi/opencv-4.7.0/modules/java > /home/pi/opencv-4.7.0/modules/js > /home/pi/opencv-4.7.0/modules/ml > /home/pi/opencv-4.7.0/modules/objc > /home/pi/opencv-4.7.0/modules/objdetect > /home/pi/opencv-4.7.0/modules/photo > /home/pi/opencv-4.7.0/modules/python > /home/pi/opencv-4.7.0/modules/stitching > /home/pi/opencv-4.7.0/modules/ts > /home/pi/opencv-4.7.0/modules/video > /home/pi/opencv-4.7.0/modules/videoio > /home/pi/opencv-4.7.0/modules/world > /home/pi/opencv-4.7.0/modules/calib3d > /home/pi/opencv-4.7.0/modules/core > /home/pi/opencv-4.7.0/modules/dnn > /home/pi/opencv-4.7.0/modules/features2d > /home/pi/opencv-4.7.0/modules/flann > /home/pi/opencv-4.7.0/modules/gapi > /home/pi/opencv-4.7.0/modules/highgui > /home/pi/opencv-4.7.0/modules/imgcodecs > /home/pi/opencv-4.7.0/modules/imgproc > /home/pi/opencv-4.7.0/modules/java > /home/pi/opencv-4.7.0/modules/js > /home/pi/opencv-4.7.0/modules/ml > /home/pi/opencv-4.7.0/modules/objc > /home/pi/opencv-4.7.0/modules/objdetect > /home/pi/opencv-4.7.0/modules/photo > /home/pi/opencv-4.7.0/modules/python > /home/pi/opencv-4.7.0/modules/stitching > /home/pi/opencv-4.7.0/modules/ts > /home/pi/opencv-4.7.0/modules/video > /home/pi/opencv-4.7.0/modules/videoio > /home/pi/opencv-4.7.0/modules/world CMake Error at cmake/OpenCVModule.cmake:340 (message): Duplicated modules LOCATIONS has been found Call Stack (most recent call first): cmake/OpenCVModule.cmake:357 (_assert_uniqueness) cmake/OpenCVModule.cmake:385 (ocv_glob_modules) CMakeLists.txt:951 (ocv_register_modules) Configuring incomplete, errors occurred!
最新发布
10-31
<think>我们正在解决OpenCV 4.7.0在aarch64处理器上编译时遇到的一系列问题。根据引用[1]和引用[2]的信息,并结合常见的OpenCV编译问题,我们将逐步解决这些问题。 问题包括: 1. 找不到OpenJPEG 2. 找不到OpenBLAS 3. 找不到JNI 4. 找不到VTK 5. CMake警告(CMP0072) 6. Duplicated modules LOCATIONS错误 7. 引用[1]中提到的libGL.so缺失问题 我们将逐一分析并提供解决方案。 步骤1:安装必要的依赖库 在aarch64架构上(如RK3399pro),我们需要确保系统已安装所需的开发包。使用以下命令安装: ```bash sudo apt-get update sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev sudo apt-get install libopenblas-dev libatlas-base-dev liblapack-dev gfortran # 解决OpenBLAS问题 sudo apt-get install libopenjp2-7-dev # 解决OpenJPEG问题 sudo apt-get install openjdk-8-jdk # 解决JNI问题,注意版本,可能需要配置JAVA_HOME sudo apt-get install libvtk7-dev # 解决VTK问题,注意版本号(可能是6或7,根据系统) sudo apt-get install libgl1-mesa-dev # 解决libGL.so问题,引用[1]的问题 ``` 步骤2:处理CMake警告CMP0072 这个警告通常是因为OpenCV使用了旧版本的VTK策略。我们可以通过设置CMake变量来避免: 在CMake配置时添加:`-DVTK_DIR=<path_to_vtk>` 或者使用新版本的VTK。但如果不想使用VTK,可以禁用viz模块(viz模块依赖VTK): 在CMake命令中添加:`-DBUILD_opencv_viz=OFF` 另外,也可以忽略这个警告(但建议解决依赖): 在CMake命令中添加:`-DCMAKE_POLICY_DEFAULT_CMP0072=NEW` 步骤3:处理Duplicated modules LOCATIONS错误 这个错误通常发生在同一模块被多次定义。可能是由于多次包含相同的文件或模块。我们需要检查CMake配置,确保没有重复的模块路径设置。 一种解决方法是在CMake配置时显式指定模块路径,避免自动搜索导致冲突。另外,确保没有重复定义模块的`CMakeLists.txt`被包含多次。 由于这个错误比较少见,可能需要根据具体错误信息调整。但我们可以尝试清理构建目录并重新配置。 步骤4:配置OpenCV编译选项 为了避免上述问题,我们可以通过CMake选项禁用一些模块(如果不需要)或显式指定路径。 以下是一个示例CMake配置命令(在OpenCV源码的build目录中执行): ```bash cmake \ -DCMAKE_BUILD_TYPE=RELEASE \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DBUILD_TESTS=OFF \ -DBUILD_PERF_TESTS=OFF \ -DBUILD_EXAMPLES=OFF \ -DBUILD_JAVA=ON \ -DBUILD_opencv_python2=OFF \ -DBUILD_opencv_python3=ON \ -DPYTHON3_EXECUTABLE=$(which python3) \ -DOPENCV_ENABLE_NONFREE=ON \ -DWITH_OPENJPEG=ON \ -DOPENJPEG_INCLUDE_DIR=/usr/include/openjpeg-2.5/ \ # 根据实际安装路径调整 -DOPENJPEG_LIBRARY=/usr/lib/aarch64-linux-gnu/libopenjp2.so \ -DWITH_OPENBLAS=ON \ -DOPENBLAS_INCLUDE_PATH=/usr/include/openblas/ \ -DOPENBLAS_LIB=/usr/lib/aarch64-linux-gnu/libopenblas.so \ -DWITH_VTK=ON \ -DVTK_DIR=/usr/lib/cmake/vtk-7.1 \ # 根据实际安装的VTK版本调整 -DBUILD_opencv_viz=ON \ # 如果需要viz模块,确保VTK正确配置;否则设置为OFF -DJAVA_INCLUDE_PATH=$JAVA_HOME/include \ -DJAVA_AWT_LIBRARY=$JAVA_HOME/lib/aarch64/libjawt.so \ -DJAVA_JVM_LIBRARY=$JAVA_HOME/lib/aarch64/server/libjvm.so \ .. ``` 注意:如果仍然遇到找不到libGL.so的问题(如引用[1]),请确保已安装`libgl1-mesa-dev`,并且`/usr/lib/aarch64-linux-gnu/libGL.so`存在。如果不存在,可以尝试创建符号链接: ```bash sudo ln -s /usr/lib/aarch64-linux-gnu/mesa/libGL.so.1 /usr/lib/aarch64-linux-gnu/libGL.so ``` 步骤5:编译和安装 配置成功后,进行编译和安装: ```bash make -j$(nproc) sudo make install ``` 如果在编译过程中仍然出现错误,请根据错误信息进一步调整。 如果遇到其他问题,比如交叉编译(引用[2]中提到了交叉编译),那么需要设置交叉编译工具链。但用户的问题是在aarch64处理器上编译(应该是本地编译),所以不需要交叉编译。 注意:引用[2]中提到的“不能将变量‘g_numpyAllocator’声明为具有抽象类型‘NumpyAllocator’”错误,通常是由于numpy版本问题,但在OpenCV编译中并不常见。如果遇到,可以尝试更新numpy或者降低版本。 由于问题较多,可能需要多次尝试。建议先确保所有依赖库安装正确,然后逐步配置和编译。 §§相关问题§§ 1. 如何在Ubuntu aarch64上安装OpenCV的特定版本? 2. 如何配置JAVA_HOME环境变量? 3. 如何解决OpenCV编译中的其他常见错误? 4. 如何验证OpenCV在aarch64平台上的安装是否成功? </think>### OpenCV 4.7.0在aarch64上的编译问题解决方案 #### 1. **依赖库缺失问题** - **OpenJPEG/OpenBLAS/JNI/VTK缺失** 安装所需依赖: ```bash sudo apt-get install libopenjp2-7-dev libopenblas-dev openjdk-8-jdk libvtk7-dev ``` - 确认JNI路径:设置`JAVA_HOME`环境变量指向JDK路径 - 手动指定路径(若CMake未自动检测): ```bash cmake -DOPENJPEG_INCLUDE_DIR=/usr/include/openjpeg-2.5 \ -DOPENBLAS_INCLUDE_DIR=/usr/include/openblas \ -DVTK_DIR=/usr/lib/cmake/vtk-7.1 \ .. ``` #### 2. **libGL.so缺失问题** [^1] ```bash sudo apt-get install libgl1-mesa-dev # 安装Mesa OpenGL库 sudo ln -s /usr/lib/aarch64-linux-gnu/mesa/libGL.so.1 /usr/lib/aarch64-linux-gnu/libGL.so # 创建符号链接 ``` #### 3. **CMake警告CMP0072** ```bash cmake -DCMAKE_POLICY_DEFAULT_CMP0072=NEW .. # 显式启用新策略 ``` 或在CMakeLists.txt中添加: ```cmake if(POLICY CMP0072) cmake_policy(SET CMP0072 NEW) endif() ``` #### 4. **Duplicated modules LOCATIONS错误** ```bash rm -rf build && mkdir build # 清除旧构建 cd build cmake -DBUILD_LIST="core,imgproc,video" .. # 显式指定模块避免冲突 ``` #### 5. **完整编译建议流程** ```bash # 1. 安装依赖 sudo apt-get update sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config \ libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev \ libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libopenblas-dev \ openjdk-8-jdk libvtk7-dev libgl1-mesa-dev # 2. 配置环境变量 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64 # 3. 编译OpenCV cd opencv-4.7.0 mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=RELEASE \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DBUILD_TESTS=OFF \ -DBUILD_PERF_TESTS=OFF \ -DBUILD_JAVA=ON \ -DWITH_OPENJPEG=ON \ -DWITH_OPENBLAS=ON \ -DWITH_VTK=ON \ -DOPENJPEG_INCLUDE_DIR=/usr/include/openjpeg-2.5 \ -DCMAKE_POLICY_DEFAULT_CMP0072=NEW \ .. # 4. 编译安装 make -j$(nproc) sudo make install ``` #### 关键注意事项: 1. **aarch64特定路径**:所有库路径需指向`/usr/lib/aarch64-linux-gnu` 2. **VTK版本兼容**:OpenCV 4.7.0建议VTK≥7.1 3. **内存管理**:编译时建议使用交换空间防止OOM ```bash sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile sudo mkswap /swapfile && sudo swapon /swapfile ``` ### 引用说明 [^1]: 符号链接修复源自RK3399编译经验 [^2]: 交叉编译问题参考知乎专栏方案
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值