IplImageの構造について基本的に理解しておくべきこと

OpenCV(1系)では,画像を IplImage という構造体で管理しています。

プログラムの流れとしては、画像をメモリに読み込み、その後、各画素値を参照しながら加工を行っていくことが多いようです。

そのため、画素の構造をきちんと理解しておいたほうがよいと思い、下にまとめてみました。

使用する関数

IplImage* cvCreateImage(CvSize size, int depth, int channels); ・・・ ヘッダの作成とデータ領域の確保を行う

引数

size・・・画像の幅と高さ
depth・・・画像要素のビット深度
IPL_DEPTH_8U – 符号無し 8 ビット整数
IPL_DEPTH_8S – 符号有り 8 ビット整数
IPL_DEPTH_16U – 符号無し 16 ビット整数
IPL_DEPTH_16S – 符号有り 16 ビット整数
IPL_DEPTH_32S – 符号有り 32 ビット整数
IPL_DEPTH_32F – 単精度浮動小数点数
IPL_DEPTH_64F – 倍精度浮動小数点数
channels・・・要素(ピクセル)毎のチャンネル数

この関数を使用してIplImageを生成すると、画像用のメモリの先頭のアドレスは,IplImage構造体のメンバ変数の imageData に保存されることになります。

通常、 (x,y) のアドレスは

imageData + (widthStep*y) + (x*bpp)

で表現できます。

ここで,bpp とは一画素あたりに必要なメモリの量で、IplImageのメンバ変数depthとnChannelから

bpp = (depth/8)*nChannel

となります。

今回はRGBがそれぞれ16bit(IPL_DEPTH_16U)なので depthが16,、RGBAの4つのチャネルがあるので、nChannels=4 になります。

つまり,16/8*4 で一画素あたり 8byte 必要になります。