opencv + jpeg_turbo(启用SIMD加速)
背景
opencv的imread+imwrite耗时过大
一张5M的图片读用了140ms,写一张1.7M的图片用149ms
- 平台:mingw64编译Windows程序
- 版本:opencv4.5.4
加速方案
- opencv启用openmp
- opencv启用jpeg_turbo
- jpeg_turbo启动SIMD加速
下载jpeg_turbo源码
opencv源码自带的jpeg_turbo源码不支持SIMD配置的,需要自己重新下载源码
版本确定:
opencv-4.5.4\3rdparty\libjpeg-turbo\CMakeLists.txt
set(VERSION_MAJOR 2)
set(VERSION_MINOR 1)
set(VERSION_REVISION 0)
所以opnecv4.5.4使用的是libjpeg-turbo v2.1.0
下载源码
git clone https://github.com/libjpeg-turbo/libjpeg-turbo.git -b 2.1.0
编译
- libjpeg-turbo的SIMD加速依赖NASM处理汇编代码
# 在MSYS2终端中执行
pacman -S nasm
- 配置CMake参数
mkdir build_mingw64
cd build_mingw64cmake \-G "MSYS Makefiles" \-DCMAKE_INSTALL_PREFIX=$(pwd)/output_mingw64 \-DWITH_SIMD=ON \-DENABLE_SHARED=OFF \-DENABLE_STATIC=ON \-DCMAKE_BUILD_TYPE=Release \-DWITH_JPEG8=ON \-DCMAKE_ASM_NASM_COMPILER="D:/msys64/usr/bin/nasm.exe" \..make -j8
make install
导入到opencv编译
mkdir build
cd buildcmake \
-DBUILD_SHARED_LIBS=OFF \
-DWITH_OPENMP=ON \ # 启用openmp
#。。。。你的其它配置
-DWITH_JPEG=ON \ # 启用JPEG支持
-DBUILD_JPEG=OFF \ # 禁用OpenCV内置JPEG编译
-DJPEG_INCLUDE_DIR="D:/xxx/libjpeg-turbo/build_mingw64/output_mingw64/include" \ # 指定外部libjpeg-turbo的头文件路径
-DJPEG_LIBRARY="D:/xxx/libjpeg-turbo/build_mingw64/output_mingw64/lib/libjpeg.a" \ # 指定外部libjpeg-turbo的静态库路径
-DCPU_BASELINE=AVX2 \
-DBUILD_OPENJPEG=OFF \
-DWITH_OPENJPEG=OFF \
-G "MSYS Makefiles" ..make
make install
最终效果
读图片,5M jpg格式,原本140 ms,现在92 ms
写图片,1.7M jpg格式,原本149 ms,现在41 ms