opencv+libjpeg-turbo交叉编译

目录

      • libjpeg-turbo简介
      • 交叉编译opencv
      • 遇到的坑

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.csdn.net/zymill/article/details/81664233
https://stackoverflow.com/questions/10465209/how-to-compile-opencv-with-libjpeg-turbo

你可能感兴趣的:(opencv,图像处理,工具)