OpenCV - JPEGエンコード・デコード

JPEGファイルのメモリ上でのエンコード・デコード

概要

IJG(Independent JPEG Group)のlibjpegやIPP(Intel Integrated Performance Primitives)を用いて,JPEGファイルをメモリ上で読み書きする. 出力データはOpenCVで使用されるIplImage.

対象者

JPEG IO ライブラリ

ソースコードおよびプロジェクトファイル

Visual Studio2005プロジェクトファイルとソースコード.条件はOpenCVがインストールされていること.
ダウンロード

関数説明

デコード関数
int cvexJPEGDecode(unsigned char* src, IplImage* dest, int mode=CVEX_JPEG_INTEL, bool isSwapBGR=false)
戻り値は,成功時が0.それ以外は失敗.

エンコード関数
int cvexJPEGEncode(IplImage* src, unsigned char* dest, int quality=90, int mode=CVEX_JPEG_INTEL, bool isSwapBGR=false)
戻り値は,圧縮されたデータのファイルサイズ.出力されたバッファをファイルサイズ分だけfwriteすればjpegファイルを保存可能.

引数説明

qyality(0-100)で画質を設定する.

modeでコールするライブラリを切り替える.種類は以下の通り.

isSwapBGRでBGR配列をRGB配列に入れ替える. 各ライブラリは画素がRGBの順に並んでいると思って書き出しているが,OpenCVのデフォルトはBGRでならんでいるため,必要ならBGRに入れ替えること.

コンパイル方法

IJGはOpenCVがインストール済みなら,Visual Studioに下記のパスを通せば使用可能.
Include
C:\Program Files\OpenCV\otherlibs\_graphics\include
Lib
C:\Program Files\OpenCV\otherlibs\_graphics\lib
ない場合は以下からダウンロード
Independent JPEG Group (IJG)

IJGのSIMDによる高速化版(Intel用)はここからダウンロード可能. 高速化版のライブラリ及びincludeファイルをijg_simdディレクトリへコピー.更に,jpeg62.dllをパスの通ったディレクトリに配置もしくは,.cpp等があるディレクトリにコピー もしくは,jpegmem.cpp内に相対パスで指定してある各ディレクトリを書きかえる.

Intel JPEG library(IJL)はIntel Integrated Performance Primitives(IPP)の一部として公開されてる(有料). IJLは,IPPのサンプルコード内に含まれており,そのサンプルをコンパイルする事で得られる. ただし一ヶ月の試用期間があるので試すだけなら無料. http://www.xlsoft.com/jp/products/intel/perflib/ipp/
コンパイル方法は,ダインロードしたサンプルファイル内の以下のファイルを実行するだけでよい.
w_ipp-samples_p_6.0.0.127\ipp-samples\image-codecs\ijg\build32.bat
コンパイル後は,ijlディレクトリへ,作成したijl.libやijl.h,ipp.hなどのヘッダファイルを全てコピー ijl20.dllをパスの通ったディレクトリに配置もしくは,.cpp等があるディレクトリにコピー


IJGだけを使うのなら,"cvexJPEGIO.h"ファイル内の先頭付近にある2つのdefineをコメントアウトすればコンパイル可能.
#define IJG_SIMD
#define INTEL_JPEG_LIB

実験

ライブラリの実行速度の比較

試行回数10000回平均の実行速度や,圧縮率,品質を比較.
IJGのライブラリ,そのSIMD版,Intel IJLの3つのライブラリを比較. IJGの各ライブラリは,DCTの実行モードが整数高速,整数低速,浮動小数点の3つがあるので各モードで実行. 品質は,INTELとIJG(SIMD)のみ評価.IJGのライブラリはどちらも精度はほぼ同じ.

実行環境

結果

Intelのライブラリが圧縮率,実行速度,共に最大であった. IJGのライブラリでは,DCTのモードを変えたところで,計算精度,実行速度に大きな差がない.オープンソースのライブラリを使うのであれば,IJGのSIMD化されたもので十分に速い. 圧縮率の違いは,Intelのライブラリのハフマンテーブルが画像に合っていたためだろう. より速い速度が必要なら,CUDAなどのGPUを用いた計算必須. より高い圧縮のためには,JPEGではなくてMPEGを使う.

実行速度 画質

Todo

Link

参考文献

topへ戻る