CXCORE リファレンス マニュアル
- 基本構造体(Basic Structures)
- 配列操作(Operations on Arrays)
- 動的構造体(Dynamic Structures)
- 描画関数(Drawing Functions)
- データ永続性と実行時型情報(Data Persistence and RTTI)
- その他の関数(Miscellaneous Functions)
- エラーハンドリングとシステム関数(Error Handling and System Functions)
配列操作(Operations on Arrays)
変形と置換(Transforms and Permutations)
Reshape
データのコピーなしに行列/画像の形状を変える
CvMat* cvReshape( const CvArr* arr, CvMat* header, int new_cn, int new_rows=0 );
- arr
- 入力配列.
- header
- 書き込まれる出力ヘッダ.
- new_cn
- 新しいチャンネル数 .new_cn = 0はチャンネル数が変更されていないことを意味する.
- new_rows
- 新しい行数. new_rows = 0は,行数がnew_cnの値に応じて変更する必要があるのにも関わらず,変更されないままであることを意味する.
関数cvReshapeは,オリジナルの配列と同じデータだが, 異なる形状(異なるチャンネル数,異なる行数,またその両方)を持つCvMatのヘッダを初期化する.
例えば,以下は一つの画像バッファと二つの画像のヘッダ(1番目は 320×240×3の画像,2番目は960×240x1の画像)を作成するためのコードである.
IplImage* color_img = cvCreateImage( cvSize(320,240), IPL_DEPTH_8U, 3 ); CvMat gray_mat_hdr; IplImage gray_img_hdr, *gray_img; cvReshape( color_img, &gray_mat_hdr, 1 ); gray_img = cvGetImage( &gray_mat_hdr, &gray_img_hdr );
そして,次の例は3×3の行列から1×9のベクトルへの変換である.
CvMat* mat = cvCreateMat( 3, 3, CV_32F ); CvMat row_header, *row; row = cvReshape( mat, &row_header, 0, 1 );
ReshapeMatND
データのコピーなしに多次元配列の形状を変える
CvArr* cvReshapeMatND( const CvArr* arr,
int sizeof_header, CvArr* header,
int new_cn, int new_dims, int* new_sizes );
#define cvReshapeND( arr, header, new_cn, new_dims, new_sizes ) ¥
cvReshapeMatND( (arr), sizeof(*(header)), (header), ¥
(new_cn), (new_dims), (new_sizes))
- arr
- 入力配列.
- sizeof_header
- IplImageとCvMat,CvMatNDそれぞれの出力ヘッダを区別するための出力ヘッダのサイズ.
- header
- 書き込まれる出力ヘッダ.
- new_cn
- 新しいチャンネル数. new_cn = 0は,チャンネル数が変更されていないことを意味する.
- new_dims
- 新しい次元数. new_dims = 0は,次元数が同じままであることを意味する.
- new_sizes
- 新しい次元サイズの配列.要素の総数は変化してはいけないので,new_dims-1の値のみ使用される.従って,new_dims = 1であればnew_sizesは使用されない.
関数cvReshapeMatNDは,cvReshape の拡張バージョンである.これは多次元配列を扱うことが可能(普通の画像と行列に対しても使用することが可能)で,さらに次元の変更も可能である.以下の2つのサンプルはcvReshapeでの記述を,cvReshapeMatNDを用いて書き直したものである.
IplImage* color_img = cvCreateImage( cvSize(320,240), IPL_DEPTH_8U, 3 ); IplImage gray_img_hdr, *gray_img; gray_img = (IplImage*)cvReshapeND( color_img, &gray_img_hdr, 1, 0, 0 ); ... /* 2番目は2x2x2の配列を8x1のベクトルに変換する例である */ int size[] = { 2, 2, 2 }; CvMatND* mat = cvCreateMatND( 3, size, CV_32F ); CvMat row_header, *row; row = cvReshapeND( mat, &row_header, 0, 1, 0 );
Repeat
出力配列を入力配列でタイル状に埋める
void cvRepeat( const CvArr* src, CvArr* dst );
- src
- 入力配列, 画像または行列.
- dst
- 出力配列, 画像または行列.
関数cvRepeatは,入力配列をタイル状に配置して出力配列を埋める.
dst(i,j)=src(i mod rows(src), j mod cols(src))
出力配列は入力配列より大きいこともあれば,小さいこともある.
Flip
2次元配列を垂直,水平,または両軸で反転する
void cvFlip( const CvArr* src, CvArr* dst=NULL, int flip_mode=0);
#define cvMirror cvFlip
- src
- 入力配列.
- dst
- 出力配列.もしdst = NULLであれば,反転はインプレースモードで行われる.
- flip_mode
- 配列の反転方法の指定.
flip_mode = 0 は,x軸周りでの反転, flip_mode > 0(例えば,1)は,y軸周りでの反転, flip_mode < 0(例えば,-1)は,両軸周りでの反転. 以下の式も参照.
関数cvFlipは,3種類の異なる方法のうち1つを指定して配列を反転させる(行と列のインデックスは0が基準である).
dst(i,j)=src(rows(src)-i-1,j) (flip_mode = 0 の場合)
dst(i,j)=src(i,cols(src1)-j-1) (flip_mode > 0 の場合)
dst(i,j)=src(rows(src)-i-1,cols(src)-j-1) (flip_mode < 0 の場合)
関数の使用例は以下のとおり:
- 画像原点を左上から左下に,あるいはその逆方向に入れ替えるため(Win32システムの動画像処理では典型的な処理)に,垂直反転(flip_mode > 0)を用いる.
- 垂直軸対称性をチェックするために,画像の水平反転と水平方向シフトを行い,絶対誤差を計算する(flip_mode > 0).
- 点対称性をチェックするために,画像の水平垂直の同時反転をとシフトを行い,絶対誤差を計算する(flip_mode < 0).
- 1次元の配列の並びを逆転する(flip_mode > 0).
Split
マルチチャンネルの配列を,複数のシングルチャンネルの配列に分割する.または,配列から一つのチャンネルを取り出す.
void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,
CvArr* dst2, CvArr* dst3 );
#define cvCvtPixToPlane cvSplit
- src
- 入力配列.
- dst0...dst3
- 出力チャンネル.
関数cvSplitは,マルチチャンネルの配列をシングルチャンネルの配列に分割する.この操作には二つのモードがある. 入力配列がNチャンネルの場合,先頭からN番目までの出力チャンネルが NULL でなければ,それらはすべて入力配列から取り出される. そうでなく,N個の出力チャンネルのうち一つだけが NULL でない場合は,この特定のチャンネルのみを抽出する.このいずれでもない場合はエラーとなる. N番目以降の出力チャンネルは常に NULL でなくてはならない. IplImageでは,画像から一つのシングルチャンネルを抽出するために,COIを伴うcvCopyも利用される.
Merge
複数のシングルチャンネルの配列からマルチチャンネル配列を構成する.または,配列に一つのシングルチャンネルを挿入する
void cvMerge( const CvArr* src0, const CvArr* src1,
const CvArr* src2, const CvArr* src3, CvArr* dst );
#define cvCvtPlaneToPix cvMerge
- src0... src3
- 入力配列.
- dst
- 出力配列.
関数cvMergeは,前述の関数と反対の操作である.もし出力配列がNチャンネルで,N個の入力チャンネルが NULL でないとき,これらのすべては出力配列にコピーされる.そうでなく,一つの入力配列のみが NULL でなければ,この特定のチャンネルが出力配列にコピーされ,このいずれもでない場合はエラーとなる.N番目以降の入力チャンネルは常に NULL でなくてはならない. IplImageでは,画像に一つのシングルチャンネルを挿入するために,COIを伴うcvCopyも利用される.
MixChannels
入力配列のチャンネルを出力配列の指定されたチャンネルにコピーする
void cvMixChannels( const CvArr** src, int src_count,
CvArr** dst, int dst_count,
const int* from_to, int pair_count );
- src
- 入力配列の配列.
- src_count
- 入力配列の数.
- dst
- 出力配列の配列.
- dst_count
- 出力配列の数.
- from_to
- コピーされる平面(チャンネル)のインデックスのペア配列. from_to[k*2]は入力平面の0を基準としたインデックスで,from_to[k*2+1]は出力平面のインデックス.ここで,入力及び出力配列すべてについて,各平面への連続的な番号付けが行われる.from_to[k*2]が負のとき,対応する出力平面は0で埋められる.
- pair_count
- from_toのペア数,またはコピーされた平面の数.
関数cvMixChannelsは,cvSplit,cvMerge,およびcvCvtColorのいくつかの書式の汎用形である.これは,平面の順番の変更,アルファチャンネルの追加や削除,1枚の平面や複数平面の抽出や挿入などに用いられる.以下に,どのように4チャンネルのRGBA画像を,3チャンネルのBGR画像(つまり,RとBの入れ替え) にするか,そしてアルファチャンネルを分離するかを示す.
CvMat* rgba = cvCreateMat( 100, 100, CV_8UC4 ); CvMat* bgr = cvCreateMat( rgba->rows, rgba->cols, CV_8UC3 ); CvMat* alpha = cvCreateMat( rgba->rows, rgba->cols, CV_8UC1 ); CvArr* out[] = { bgr, alpha }; int from_to[] = { 0, 2, 1, 1, 2, 0, 3, 3 }; cvSet( rgba, cvScalar(1,2,3,4) ); cvMixChannels( (const CvArr**)&rgba, 1, out, 2, from_to, 4 );
RandShuffle
配列の要素をランダムにシャッフルする
void cvRandShuffle( CvArr* mat, CvRNG* rng, double iter_factor=1. );
- mat
- 入力/出力行列.インプレースモードでシャッフルされる.
- rng
- 要素のシャッフルで用いられる Random Number Generator.ポインタがNULLの場合,一時的なRNGが生成され,利用される.
- iter_factor
- シャッフルの強さを指定するパラメータ.以下を参照.
関数cvRandShuffleは,ランダムに選ばれた配列要素ペアの入れ替えを反復することにより行列をシャッフルする(マルチチャンネル配列の場合,それぞれの要素は複数の成分を含む). 反復回数(つまり,ペアの入れ替え)は round(iter_factor*rows(mat)*cols(mat))であり, iter_factor=0はシャッフルを行わないことを, iter_factor=1はこの関数がrows(mat)*cols(mat)回ランダムなペアを入れ替えることを意味する.