CXCORE リファレンス マニュアル
- 基本構造体(Basic Structures)
- 配列操作(Operations on Arrays)
- 動的構造体(Dynamic Structures)
- 描画関数(Drawing Functions)
- データ永続性と実行時型情報(Data Persistence and RTTI)
- その他の関数(Miscellaneous Functions)
- エラーハンドリングとシステム関数(Error Handling and System Functions)
動的構造体(Dynamic Structures)
セット(Sets)
CvSet
ノードの集合
typedef struct CvSetElem { int flags; /* 空きノードなら負,他の場合0か正の値 */ struct CvSetElem* next_free; /* 空きノードの場合,次の空きノードへのポインタ */ } CvSetElem; #define CV_SET_FIELDS() ¥ CV_SEQUENCE_FIELDS() /* CvSeqから継承する */ ¥ struct CvSetElem* free_elems; /* 空きノードのリスト */ typedef struct CvSet { CV_SET_FIELDS() } CvSet;
構造体CvSet は,OpenCVの疎なデータ構造の基本である.
上述の宣言のとおり,CvSetはCvSeqを継承し, それにfree_elems(空きノードリスト)を加えたものである. 空きかそうでないかが記述されたセットの各ノードは,内部的なシーケンスの要素である. 密なシーケンスの要素に対するような制限はないが,セット(と,ここから派生する構造体)の要素は整数型のフィールドで始める必要があり, 構造体CvSetElemに合致させる事ができなければならない. なぜなら,これら二つのフィールド(整数とそれに続くポインタ)は,空きノードリストを持つノードセットの構成に必要だからである. 空きノードの場合,flags フィールドは負の値となる(フィールドの最上位ビット(MSB)がセットされている). そしてnext_freeは,次の空きノードを指す(先頭の空きノードは,CvSetのfree_elemsフィールドから参照される).ノードが使用されている場合,flags フィールドは0以上の値で,(set_elem->flags & CV_SET_ELEM_IDX_MASK) の式を用いて取り出されるようなノードインデックスを持つ.ノードの残り部分(next_free)はユーザによって決められる. 特に,使用されているノードは空きノードのようにリンクされていないので,2番目のフィールド(next_free)は, このようなリンクや他の目的のために用いることができる. マクロCV_IS_SET_ELEM(set_elem_ptr)は,指定したノードが使用されているかどうかを判断するために利用することができる.
最初,セットとリストは空である.セットから新しいノード要求があった場合,空きノードリストからノードが取り出され,その後リストは更新される. 空きノードリストが空の場合は,新しいシーケンスブロックが確保され,ブロック内のすべてのノードが空きノードリストに追加される. 従って,セットの total フィールドには,使用されているノード数と空きノードの数の合計が入る. 使用されていたノードが解放されたときには,空きノードリストに加えられる.最後に解放されるノードは,最初に使用されたものである.
OpenCVにおいて CvSet は,グラフ(CvGraph), 疎な多次元配列(CvSparseMat), 平面の細分割(CvSubdiv2D)などを表現するために使用される.
CreateSet
空のセットを生成する
CvSet* cvCreateSet( int set_flags, int header_size,
int elem_size, CvMemStorage* storage );
- set_flags
- 生成するセットのタイプ.
- header_size
- セットのヘッダのサイズ(sizeof(CvSet)以上).
- elem_size
- セットの要素のサイズ(CvSetElem 以上).
- storage
- セットのためのコンテナ.
関数cvCreateSetは指定されたヘッダのサイズと要素のサイズを持つ空のセットを生成し,そのセットへのポインタを返す. この関数は cvCreateSeq に多少の処理を追加したものに過ぎない.
SetAdd
セットに新しいノード(要素)を追加する
int cvSetAdd( CvSet* set_header, CvSetElem* elem=NULL, CvSetElem** inserted_elem=NULL );
- set_header
- セット.
- elem
- オプションの入力引数.挿入する要素. NULLでない場合,新たに確保したノードにデータをコピーする (コピーした後,先頭の整数フィールドの最上位ビットはクリアされる).
- inserted_elem
- オプションの出力引数.割り当てられた要素へのポインタ.
関数cvSetAddは,新しいノードを割り当てる. オプションとして入力要素データをノードにコピーし,ノードへのポインタとインデックスを返す. インデックス値は,ノードのflagsフィールドの下位のビットから得る.この関数はO(1)の計算量を持つが, セットのノードを確保するためのより高速な関数が存在する(cvSetNewを参照).
SetRemove
セットから要素を削除する
void cvSetRemove( CvSet* set_header, int index );
- set_header
- セット.
- index
- 削除する要素のインデックス.
関数cvSetRemoveは,セットから指定されたインデックスの要素を取り除く. もし指定された場所のノードがない場合,この関数は何もしない.この関数はO(1)の計算量を持つ, しかし,既に取り除く要素の場所が既知である場合は,cvSetRemoveByPtr の方が高速である.
SetNew
セットに要素を加える(高速版)
CvSetElem* cvSetNew( CvSet* set_header );
- set_header
- セット.
関数cvSetNewは,cvSetAdd の高速インライン処理バージョンである. この関数は新しいノードを確保し,インデックスではなくノードへのポインタを返す.
SetRemoveByPtr
ポインタで指定したセットの要素を削除する
void cvSetRemoveByPtr( CvSet* set_header, void* elem );
- set_header
- セット.
- elem
- 削除される要素.
関数cvSetRemoveByPtrは,要素のポインタを用いる cvSetRemove の高速インライン処理バージョンである. この関数はノードが使用されているかそうでないかを確認しない.そのため,ユーザは注意して使用しなければならない.
GetSetElem
インデックスによってセットの要素を検索する
CvSetElem* cvGetSetElem( const CvSet* set_header, int index );
- set_header
- セット.
- index
- シーケンスの中のセットの要素のインデックス.
関数cvGetSetElemは,インデックスによってセットの要素を検索する. この関数は見つけた要素へのポインタを返す,インデックスが無効であるか,対応するノードが空きの場合は0を返す. この関数は負のインデックスをサポートし,これはノードの場所を得るために cvGetSeqElem を用いる際に使われる.
ClearSet
セットをクリアする
void cvClearSet( CvSet* set_header );
- set_header
- クリアされるセット.
関数cvClearSetは,セットからすべての要素を取り除く.これはO(1)の計算量を持つ.