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等の表色系で表されるカラー画像である