Introduction
掲題そのまま。
結構、このネタはそこら辺に転がっているんだけど、
- 計測していない
- エンコードだけ計測
みたいなネタでげんなりしたので自分で実施してみました。
実験ソースは下記になります
Condition
条件は下記になります。
- Intel Cire i7-8700 (3.20GHz)
- 32.0GB
- Visual Studio 2017 Update 7 (15.7)
- OpenCV 3.2.0 (動的リンク、world形式でビルド。IPP、CUDAは除外)
- libjpeg-turbo 1.5.3
- libjpeg-turbo.libをリンク
になります。
また、libjpeg.libとlibjpeg-turbo.libのどちらをリンクするかで意見が割れていますが、ここではlibjpeg-turbo.libをリンクしました。
OpenCVのビルドのためのCMakeのコマンドは下記のようになります。
libjpeg-turbo 有効
1 | $ cmake -G "Visual Studio 15 2017 Win64" ^ |
libjpeg-turbo 無効
1 | $ cmake -G "Visual Studio 15 2017 Win64" ^ |
Test
実験は、
- libjpeg-turbo有効の自家製ビルドOpenCV
- libjpeg-turbo無効の自家製ビルドOpenCV
- 公式のOpenCVバイナリ
に対して比較します。
また、画像は、
- 640x360
- 1280x720
- 2560x1440
の3種類を用意し、それぞれのデータのデコードとエンコードを1000回繰り返します。
実験ソースは下記です。
ベースとして、下記のページを参考にさせていただきました。
1 | // libjpeg-turbo-decode.cpp : アプリケーションのエントリ ポイントを定義します。 |
Result
実験結果は下記になります。
速度はいずれも平均速度です。
Decode
640x360 | 1280x720 | 2560x1440 | |
---|---|---|---|
Enable libjpeg-turbo | 1.16508 ms | 5.11916 ms | 28.0259 ms |
Disable libjpeg-turbo | 2.15667 ms | 9.02238 ms | 40.7576 ms |
original binary | 2.44517 ms | 10.1288 ms | 46.2685 ms |
Encode
640x360 | 1280x720 | 2560x1440 | |
---|---|---|---|
Enable libjpeg-turbo | 1.37863 ms | 5.03018 ms | 20.6569 ms |
Disable libjpeg-turbo | 5.18752 ms | 19.4827 ms | 83.4678 ms |
original binary | 5.69063 ms | 21.4501 ms | 91.6039 ms |
Conclusion
エンコード性能は著しい改善を見せており、3.5-4.0倍の速度をたたき出しています。
デコードも、1.6-2.2倍の速度と良い感じです。
高々数十msの違いかもしれませんが、OpenCVのVideoCapture等でWebカメラをキャプチャした際、MotionJPEG形式ならデコード処理がそのままfpsに跳ね返ってきます。
1280X720で従来20ms要していたということは、30fpsのカメラでも事実上、1フレームに33ms+20msの53ms、つまり20fps程度しか性能が出なかったことになります。
これが5msになれば、33ms+5msの38msなら26fpsと改善できます。
Source Code
https://github.com/takuya-takeuchi/Demo/tree/master/Misc/02_libjpeg-turbo-decode