はじめに
Windows でビルドした OpenCV を使って Jpeg デコード・エンコードすると、
いつもより時間がかかっていることに気づきました。
OpenCV v4.7.0 から、libjpeg-turbo が標準で組み込まれ、
SIMD(SSEなどの拡張命令)を使って高速に Jpeg デコード・エンコードしてくれるはずだった。
本記事は、OpenCV をビルドする際に SIMD を有効化する方法を記載します。

ビルド環境
「OpenCV + OpenCV Contribをビルド 【Windows編】」を参考に、Windows環境でビルドしました。
OS | Windows10 |
IDE | Visual Studio 2022 Community |
OpenCV | v4.7.0 |
OpenCV-ContLib | v4.7.0 |
CMake | v3.27.0 |
NASM | v2.16.01 |
libjpeg-turbo の SIMD が有効になっているか調べる
まずは、SIMD が有効になっているかどうかを確認するところからです。
GitHub で公開されている OpenCV のリリースも、SIMD は有効化されていません。
おそらく、Windows も ARM 上で動かすケースがあるため、
CPU アーキテクチャ依存のコードを入れていないのだと思われます。
方法①:CMakeVars.txt を確認
CMake でビルドオプションを設定した後、インストール先のルートディレクトリに
CMakeVars.txt というものが生成されます。その中の以下を確認します。
CMakeVars.txt
★有効の場合
HAVE_LIBJPEG_TURBO_SIMD=1
★無効の場合
HAVE_LIBJPEG_TURBO_SIMD=0
方法②:getBuildInformation を確認
CMake を実行した際の結果を文字列として OpenCV 内部に埋め込まれます。
getBuildInformation を呼び出すことでその文字列を取得できます。
1 2 3 4 5 6 7 |
#include <opencv2/opencv.hpp> int main(void) { std::cout << cv::getBuildInformation() << std::endl; } |
実行結果
★有効の場合
Media I/O:
JPEG: build-libjpeg-turbo (ver 2.1.3-62)
SIMD Support Request: YES
SIMD Support: YES
★無効の場合
Media I/O:
JPEG: build-libjpeg-turbo (ver 2.1.3-62)
SIMD Support Request: YES
SIMD Support: NO

SIMD を有効化する方法
CMake オプションでは ENABLE_LIBJPEG_TURBO_SIMD を有効にしているのに、
HAVE_LIBJPEG_TURBO_SIMD が 1 にならない場合、以下が対策になります。
- NASM コンパイラをインストール
- NASM 実行バイナリの場所を環境変数 PATH に追加
step
1インストーラをダウンロード
NASM 公式ページからダウンロードします。

step
2環境変数 PATH を通す
標準の設定でインストールすると、「C:\Users\<ユーザ名>\AppData\Local\bin\NASM」に実行バイナリが格納されるため、このパスを環境変数 PATH に追加します。