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 必要になります。