【OpenCV】IplImage構造体

シェアする

  • このエントリーをはてなブックマークに追加
最近の記事
  • 10/21 【C#】寸法線の描画
  • 10/21 【C#】GraphicsPathの領域取得
  • 10/20 【C#】GraphicsPathの描画
  • 10/18 【C#】GraphicsPath
  • 10/17 【C#】Bitmap画像データの拡大縮小
  • 10/15 【C#】画像の座標系
  • 10/14 【C#】画像の上下左右反転、90,180,270度回転
  • 10/3 【C#】SplitContainerのPanel固定方法
  • 9/7 【Neural Network Console】学習データの出力方法
  • 9/3 Deep Learning向け学習画像撮り込みソフト公開
  • 9/1 【Neural Network Console】新規画像のDataset作成方法
  • 8/28 【Neural Network Console】GUI表示スケールの変更
  • 8/22 【Neural Network Console】CPU/GPU処理の設定切替
  • 8/21 【Neural Network Console】Learning Rate(学習率)の設定
  • 8/20 ソニーの無償AIソフト Neural Network Consoleの入手ダウンロード、インストール
  • 8/20 Deep Learning
  • 8/20
  • 8/19 古いバージョンのVisual Studio Community/Expressの入手ダウンロード
  • 8/19 CUDAの入手、ダウンロード、インストール方法
  • 8/17 【C#.NET】マイクロソフト仕様のアフィン変換
  • 8/5 【C#】ファイルを開くダイアログボックスの表示
  • 8/2 キャノンプリンターのCDトレイはどこ?!
  • 7/6 【参考書籍】画像処理・機械学習プログラミング OpenCV 3対応
  • 6/20 【Python,matplotlib】動くグラフをAnimationGifに保存する方法
  • 6/17 シグモイド関数の微分
  • 6/15 シグモイド関数
  • 6/13 合成関数の微分
  • 6/12 WordPressで数式エディタ風に数式を入力したい
  • 6/11 PythonをVisual Studioでインストールする方法
  • 6/9 【Python】OpenCVをAnacondaでインストール(Windows編)
  • 6/6 【Python】Anacondaで複数バージョンの環境切り替え
  • 6/6 画像センシング展2017に出展します。
  • 6/1 【Office365】Web版Outlookのフォントサイズ変更
  • 6/1 【Anaconda】モジュールのアップデートでエラー発生
  • 6/1 【Anaconda】コマンドリストの表示
  • 5/29 Windows10パソコン購入
  • 5/24 Anacondaのアンインストール
  • 5/24 【Jupyter Notebook】新規プログラムの作成
  • 5/23 【Python】開発環境の構築
  • 5/23 Pythonはじめました
  • 4/6 【Office365】Web版Outlookのスレッド表示を解除する方法
  • 4/5 【Excel】フーリエ解析(FFT)
  • 3/20 Canny edge detection
  • 3/20 【Excel2016】分析ツールの表示
  • 3/5 【Visual Studio】黒い背景色を白に変更する方法
  • 2/8 【Windows10】拡張モニタに表示されたウィンドウを元に戻す
  • 2/7 複素数の計算
  • 1/18 【Excel】棒グラフの横軸の目盛を0始まりにする
  • 1/16 【Excel】フーリエ変換
  • 1/6 【OpenCV】疑似カラー(カラーマップ)

  • 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へ戻る