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