OpenCV

【OpenCV】IplImage構造体

OpenCVの画像データの大きさやビット深度、画像データのポインタなどを管理しているのがIplImage構造体になります。
(OpenCV2.0からはcv:Matクラスというのも登場してきますが、ここではIplImageについて解説したいと思います。)
C言語のBITMAPINFO、.NETのBitmapクラスのようなものです。

 

OpenCVではこのIplImage構造体をOpenCVの各種関数の引数として渡します。

 

そこで、IplImage構造体の定義のヘッダファイル【cxtypes.h(OpenCV2.2ではtypes_c.h)】をのぞいてみると、

typedef struct _IplImage
{
    int  nSize;             /* sizeof(IplImage) */
    int  ID;                /* version (=0)*/
    int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */
    int  alphaChannel;      /* Ignored by OpenCV */
    int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
                               IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
    char colorModel[4];     /* Ignored by OpenCV */
    char channelSeq[4];     /* ditto */
    int  dataOrder;         /* 0 - interleaved color channels, 1 - separate color channels.
                               cvCreateImage can only create interleaved images */
    int  origin;            /* 0 - top-left origin,
                               1 - bottom-left origin (Windows bitmaps style).  */
    int  align;             /* Alignment of image rows (4 or 8).
                               OpenCV ignores it and uses widthStep instead.    */
    int  width;             /* Image width in pixels.                           */
    int  height;            /* Image height in pixels.                          */
    struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */
    struct _IplImage *maskROI;      /* Must be NULL. */
    void  *imageId;                 /* "           " */
    struct _IplTileInfo *tileInfo;  /* "           " */
    int  imageSize;         /* Image data size in bytes
                               (==image->height*image->widthStep
                               in case of interleaved data)*/
    char *imageData;        /* Pointer to aligned image data.         */
    int  widthStep;         /* Size of aligned image row in bytes.    */
    int  BorderMode[4];     /* Ignored by OpenCV.                     */
    int  BorderConst[4];    /* Ditto.                                 */
    char *imageDataOrigin;  /* Pointer to very origin of image data
                               (not necessarily aligned) -
                               needed for correct deallocation */
}
IplImage;

となっています。

 

基本的にcvCreateImageもしくはcvLoadImage関数でIplImage構造体のデータを確保するので、IplImageの全てを知らなくても、なんとかなるのですが、主なメンバ変数は以下のとおりです。

 

nSize IplImage構造体のサイズ
nChannels チャンネル数 1,2,3,4のどれか
depth 1画素あたりのビット数
実質使えるのはIPL_DEPTH_8U(符号なし8ビット)と一部でIPL_DEPTH_16S(符号付き16ビット)ぐらい。
24ビットカラー(R,G,B各8ビット)の場合、8ビット、3チャンネル
nChannels = 3、depth = IPL_DEPTH_8U
とする。
origin 画像データの原点(基準)
0:左上原点(デフォルト)
1:左下原点
originはcvShowImageやcvSobelなどの画像の上下の向きが必要な場合に用いられます。
注)originの値を変えても画像データの並びは変わりません。
width 画像の幅(画素数)
height 画像の高さ(画素数)
imageSize 画像データのサイズ(バイト数) (= widthStep * height
imageData 画像データへのポインタ
widthStep 画像データの幅のバイト数(画素数ではありません。
ビットマップ(*.bmp)データと同様に4バイト単位に調整されています。

 

【補足説明】

  • nChannels
    OpenCVではチャンネルという概念が登場しますが、これは1画素をいくつの色で表現するか?
    を示します。
    例えば、一般にRGBカラーの画像は24Bitカラーなどと表現しますが、OpenCV的には
    8Bit×3チャンネルと表現します。

 

  • imageData
    画像データ(輝度値、画素値)は、このimageDataのポインタを参照する事で輝度値を参照する事が出来ます。
    ただし、構造体の宣言を見ても分かるように、imageDataは符号付き8Bitのポインタ(char*)で宣言されているので、符号無し8Bitの256階調で輝度値を参照したい場合は、imageDataのポインタをキャストして参照して下さい。
    (例)
    IplImage* Src;
    ・・・
    byte* pBuf = (byte*)Src->imageData;また、OpenCVで確保されるimageDataのメモリのアドレスは16バイト境界になるように調整されています。つまり、アドレスが0x09BE0050などのように最下位の値が0となります。
    この事からもSSEなどと非常に相性がいいのです。

 

【IplImageの確保例】

  • ファイルから確保する場合
    IplImage* src_img = cvLoadImage(“TestImage.bmp”,
    CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);

 

  • 新規に画像データを確保する場合
    IplImage* src_img = cvCreateImage(
    cvSize(640, 480), IPL_DEPTH_8U, 3);※depthの値は、符号のある/なしを区別するため、数値(8など)を指定せず、下記定数の中から指定すること。
    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 – 倍精度浮動小数点数

ただし、使い終わったら解放するのもお忘れなく。
cvReleaseImage(&src_img);

 

OpenCVへ戻る

 

コメント

タイトルとURLをコピーしました