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
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值