OpenCVの構成

OpenCVは主に5種類のライブラリから成り立っており,以下にその構成を示す.

  • CV→画像処理
  • MLL→統計的要素
  • HighGUI→GUI,画像/ビデオの入出力
  • CXCORE→基本構造体,描画関数
  • CVAUX→実験的な関数

基本的にCXCOREに含まれる画像用構造体である「IplImage」をCVに含まれる関数で処理を行う

  • IplImage

OpenCVで用いられている構造体は基本的にオブジェクト指向により設計されており,IplImageは以下の構成になる
CvArr→CvMat→IplImage
画像構造体は行列を継承して作られ,行列は配列を継承して作られる
以下,OpenCVリファレンスより引用

typedef struct _IplImage
    {
        int  nSize;         /* sizeof(IplImage) */
        int  ID;            /* バージョン (=0)*/
        int  nChannels;     /* OpenCV のほとんどの関数が,1,2,3および4チャンネルをサポートする */
        int  alphaChannel;  /* OpenCV では無視される */
        int  depth;         /* ピクセルの色深度のビット数:
                               IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
                               IPL_DEPTH_16S, IPL_DEPTH_32S, 
                               IPL_DEPTH_32F, IPL_DEPTH_64F がサポートされる */
        char colorModel[4]; /* OpenCV では無視される */
        char channelSeq[4]; /* 同上 */
        int  dataOrder;     /* 0 - インタリーブカラーチャンネル.1 - 分離カラーチャンネル,
                               cvCreateImage が作成できるのは,インタリーブ画像のみ.*/
        int  origin;        /* 0 - 左上原点,
                               1 - 左下原点(Windowsのビットマップ形式) */
        int  align;         /* 画像の行のアライメント(4 あるいは 8).
                               OpenCV はこれを無視して,代わりに widthStep を使用する. */
        int  width;         /* 画像のピクセル幅 */
        int  height;        /* 画像のピクセル高さ */
        struct _IplROI *roi;/* 画像 ROI.これが NULL でない場合,この特定の領域が処理の対象となる */
        struct _IplImage *maskROI; /* OpenCV では必ずNULL */
        void  *imageId;     /* 同上 */
        struct _IplTileInfo *tileInfo; /* 同上 */
        int  imageSize;     /* 画像データのバイトサイズ
                               (インタリーブデータの場合は,=image->height*image->widthStep) */
        char *imageData;    /* アライメントが調整された画像データへのポインタ */
        int  widthStep;     /* アライメントが調整された画像の行のバイトサイズ */
        int  BorderMode[4]; /* 画像境界の設定.OpenCV では無視される */
        int  BorderConst[4]; /* 同上 */
        char *imageDataOrigin; /* オリジナル画像データへのポインタ
                                  (アライメントが調整されているとは限らない)
                                  - これは画像を正しく解放するために必要. */
    }
    IplImage;

このステータスのうち,特に重要なのは

  • nChannels
  • depth

であり,扱うチャンネル数によって適応できる関数が限られる
基本的にチャンネル数が1である画像は白黒のグレースケール画像であり
チャンネル数が3の画像はRGBおよびHSV等の表色系で表されるカラー画像である