背景

opencv的imread+imwrite耗时过大
一张5M的图片读用了140ms,写一张1.7M的图片用149ms

  1. 平台:mingw64编译Windows程序
  2. 版本:opencv4.5.4

加速方案

  1. opencv启用openmp
  2. opencv启用jpeg_turbo
  3. 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

编译

  1. libjpeg-turbo的SIMD加速依赖NASM处理汇编代码
# 在MSYS2终端中执行
pacman -S nasm
  1. 配置CMake参数
mkdir build_mingw64
cd build_mingw64

cmake \
  -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 build

cmake \
-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

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐