CXCORE リファレンス マニュアル
- 基本構造体(Basic Structures)
- 配列操作(Operations on Arrays)
- 動的構造体(Dynamic Structures)
- 描画関数(Drawing Functions)
- データ永続性と実行時型情報(Data Persistence and RTTI)
- その他の関数(Miscellaneous Functions)
- エラーハンドリングとシステム関数(Error Handling and System Functions)
配列操作(Operations on Arrays)
要素へのアクセスと部分配列(Accessing Elements and sub-Arrays)
GetSubRect
入力画像または行列の矩形部分配列に相当するヘッダを返す
CvMat* cvGetSubRect( const CvArr* arr, CvMat* submat, CvRect rect );
- arr
- 入力配列.
- submat
- 結果として得られる部分配列のヘッダへのポインタ.
- rect
- 着目する矩形領域の,0 を基準とした座標.
関数 cvGetSubRectは,入力配列中の指定した矩形領域に相当するヘッダを返す. つまり,入力配列の一部の矩形領域を,独立した配列として扱えるようにする. この関数では ROI を考慮し,実際には ROI の部分配列が取り出される.
GetRow, GetRows
配列中の1行または,指定された範囲の行(複数行)を返す
CvMat* cvGetRow( const CvArr* arr, CvMat* submat, int row ); CvMat* cvGetRows( const CvArr* arr, CvMat* submat, int start_row, int end_row, int delta_row=1 );
- arr
- 入力配列.
- submat
- 結果として得られる部分配列のヘッダへのポインタ.
- row
- 選択した行の,0を基準としたインデックス.
- start_row
- 範囲の最初の(この値を含む)行の,0を基準としたインデックス.
- end_row
- 範囲の最後の(この値を含まない)行の,0を基準としたインデックス.
- delta_row
- 行の範囲のインデックス間隔. この関数は,start_rowからend_row(は含まない)まで,delta_row毎に行を抽出する.
関数GetRowとGetRowsは,入力配列中の指定した1行,あるいは範囲の複数行に相当するヘッダを返す.注釈:GetRowはcvGetRowsのショートカットである.
cvGetRow( arr, submat, row ); // ~ cvGetRows( arr, submat, row, row + 1, 1 );
GetCol, GetCols
配列中の1列または,指定された範囲の列(複数列)を返す
CvMat* cvGetCol( const CvArr* arr, CvMat* submat, int col ); CvMat* cvGetCols( const CvArr* arr, CvMat* submat, int start_col, int end_col );
- arr
- 入力配列.
- submat
- 結果として得られる部分配列のヘッダへのポインタ.
- col
- 選択した列の,0を基準としたインデックス.
- start_col
- 範囲の最初の(この値を含む)列の,0を基準としたインデックス
- end_col
- 範囲の最後の(この値を含まない)列の,0を基準としたインデックス.
関数GetColとGetColsは入力配列中の指定した1列,あるいは範囲の複数列に相当するヘッダを返す.注釈:GetColはcvGetColsのショートカットである.
cvGetCol( arr, submat, col ); // ~ cvGetCols( arr, submat, col, col + 1 );
GetDiag
配列の対角列の一つを返す
CvMat* cvGetDiag( const CvArr* arr, CvMat* submat, int diag=0 );
- arr
- 入力配列.
- submat
- 結果として得られる部分配列のヘッダへのポインタ.
- diag
- 対角配列.0はメインの対角列に対応し,-1はメイン対角列の一つ上の斜め列,1はメイン対角列の一つ下の斜め列,という様に対応する.
関数cvGetDiagは,入力配列中の指定された対角列に相当するヘッダを返す.
GetSize
行列または画像の ROI のサイズを返す
CvSize cvGetSize( const CvArr* arr );
- arr
- 配列のヘッダ.
関数cvGetSizeは,入力行列または画像の行数(CvSize::height)と列数(CvSize::width)を返す.画像の場合は ROI のサイズが返される.
InitSparseMatIterator
疎な配列要素のイテレータを初期化する
CvSparseNode* cvInitSparseMatIterator( const CvSparseMat* mat,
CvSparseMatIterator* mat_iterator );
- mat
- 入力配列.
- mat_iterator
- 初期化されるイテレータ.
関数cvInitSparseMatIteratorは,疎な配列要素のイテレータを初期化し,先頭要素へのポインタを返す.配列が空の時はNULLを返す.
GetNextSparseNode
疎な配列において次の要素のポインタを返す
CvSparseNode* cvGetNextSparseNode( CvSparseMatIterator* mat_iterator );
- mat_iterator
- 疎な配列のイテレータ.
関数cvGetNextSparseNodeは,イテレータを次の疎な行列要素へ動かし,そこへのポインタを返す. 現在のバージョンでは,個々の要素はハッシュテーブルに保存されているので,それらに特別な順番はない. 疎な行列内をどのように繰り返し処理していくかを,以下のサンプルに示す.
cvInitSparseMatIterator と cvGetNextSparseNode を用いた疎な浮動小数点型配列の総和計算.
double sum; int i, dims = cvGetDims( array ); CvSparseMatIterator mat_iterator; CvSparseNode* node = cvInitSparseMatIterator( array, &mat_iterator ); for( ; node != 0; node = cvGetNextSparseNode( &mat_iterator )) { /* 要素インデックスへのポインタを取得 */ const int* idx = CV_NODE_IDX( array, node ); /* 要素値の取得(タイプがCV_32FC1であると仮定) */ float val = *(float*)CV_NODE_VAL( array, node ); printf( "(" ); for( i = 0; i < dims; i++ ) printf( "%4d%s", idx[i], i < dims - 1 "," : "): " ); printf( "%g¥n", val ); sum += val; } printf( "¥nTotal sum = %g¥n", sum );
GetElemType
配列要素のタイプを返す
int cvGetElemType( const CvArr* arr );
- arr
- 入力配列.
関数GetElemTypeは,cvCreateMatの説明に述べられている以下のような配列要素のタイプを返す.
CV_8UC1 ... CV_64FC4
GetDims, GetDimSize
配列の次元数とそれらのサイズ,または特定の次元のサイズを返す
int cvGetDims( const CvArr* arr, int* sizes=NULL ); int cvGetDimSize( const CvArr* arr, int index );
- arr
- 入力配列.
- sizes
- 配列の次元の大きさを示すオプションの出力ベクトル.2次元配列の場合は1番目に行数(高さ),次は列数(幅)を示す.
- index
- 0を基準にした次元のインデックス(行列では0は行数,1は列数を示す.画像では0は高さ, 1は幅を示す).
関数cvGetDimsは配列の次元とそれらのサイズを返す. IplImageまたは CvMatの場合には,画像や行列の行数に関係なく常に 2 を返す. 関数cvGetDimSizeは特定の次元のサイズ(指定された次元の要素数)を返す.例えば,次のコードは配列要素の数を計算する2つの方法である.
// cvGetDims()を用いる方法 int sizes[CV_MAX_DIM]; int i, total = 1; int dims = cvGetDims( arr, size ); for( i = 0; i < dims; i++ ) total *= sizes[i]; // cvGetDims() と cvGetDimSize() を用いる方法 int i, total = 1; int dims = cvGetDims( arr ); for( i = 0; i < dims; i++ ) total *= cvGetDimsSize( arr, i );
Ptr*D
特定の配列要素へのポインタを返す
uchar* cvPtr1D( const CvArr* arr, int idx0, int* type=NULL ); uchar* cvPtr2D( const CvArr* arr, int idx0, int idx1, int* type=NULL ); uchar* cvPtr3D( const CvArr* arr, int idx0, int idx1, int idx2, int* type=NULL ); uchar* cvPtrND( const CvArr* arr, const int* idx, int* type=NULL, int create_node=1, unsigned* precalc_hashval=NULL );
- arr
- 入力配列.
- idx0
- 要素インデックスの,0を基準とした第1成分.
- idx1
- 要素インデックスの,0を基準とした第2成分.
- idx2
- 要素インデックスの,0を基準とした第3成分.
- idx
- 要素インデックスの配列.
- type
- オプションの出力パラメータ.行列要素のタイプ.
- create_node
- 疎な行列に対するオプションの入力パラメータ.非0の場合,指定された要素が存在しないときは要素を生成する.
- precalc_hashval
- 疎な行列に対するオプションの入力パラメータ.ポインタがNULLでないとき,関数はノードのハッシュ値を再計算せず,指定された場所から取ってくる. これにより,ペアワイズ操作の速度が向上する.
関数cvPtr*Dは,特定の配列要素へのポインタを返す.1次元からN次元までの密な配列への連続的なアクセスに用いられる関数cvPtr1Dの場合を除いて,配列の次元数は関数の引き数として渡されるインデックスの数と一致しなければならない.
同様に,この関数は,疎な配列に対しても用いられる.指定したノードが存在しない場合,関数はそれを生成し,0をセットする.
配列要素にアクセスするその他の関数(cvGet*D, cvGetReal*D, cvSet*D, cvSetReal*D)も同様であるが,要素のインデックスが範囲外であれば,エラーが起こる.
Get*D
特定の配列要素を返す
CvScalar cvGet1D( const CvArr* arr, int idx0 ); CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 ); CvScalar cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 ); CvScalar cvGetND( const CvArr* arr, const int* idx );
- arr
- 入力配列.
- idx0
- 要素インデックスの0を基準とした第1成分.
- idx1
- 要素インデックスの0を基準とした第2成分.
- idx2
- 要素インデックスの0を基準とした第3成分.
- idx
- 要素インデックスの配列.
関数cvGet*Dは,特定の配列要素を返す.疎な配列で,指定したノードが存在しない場合,この関数は0を返す(この関数によって新しいノードは生成されない).
GetReal*D
シングルチャンネルの配列の特定の要素を返す
double cvGetReal1D( const CvArr* arr, int idx0 ); double cvGetReal2D( const CvArr* arr, int idx0, int idx1 ); double cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 ); double cvGetRealND( const CvArr* arr, const int* idx );
- arr
- 入力配列. シングルチャンネルでなくてはならない.
- idx0
- 要素インデックスの,0を基準とした第1成分.
- idx1
- 要素インデックスの,0を基準とした第2成分.
- idx2
- 要素インデックスの,0を基準とした第3成分.
- idx
- 要素インデックスの配列.
関数cvGetReal*Dは,シングルチャンネルの配列の特定の要素を返す.配列がマルチチャンネルの場合は,ランタイムエラーが発生する. 注釈:関数cvGet*Dはシングルチャンネルとマルチチャンネルの配列に対して安全に使用することができるが,若干処理速度が遅い.
指定したノードが存在しなければ,この関数は0を返す(この関数によって新しいノードは生成されない).
mGet
シングルチャンネル浮動小数点型行列の特定の要素を返す
double cvmGet( const CvMat* mat, int row, int col );
- mat
- 入力行列.
- row
- 行の0を基準としたインデックス.
- col
- 列の0を基準としたインデックス.
関数cvmGetは,シングルチャンネル浮動小数点型行列の場合における,cvGetReal2Dの高速化版関数である. インライン処理され,配列のタイプや要素のタイプのチェックを行わず,また行と列の範囲のチェックもデバックモードのときしか行わないので高速である.
Set*D
特定の配列要素を変更する
void cvSet1D( CvArr* arr, int idx0, CvScalar value ); void cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value ); void cvSet3D( CvArr* arr, int idx0, int idx1, int idx2, CvScalar value ); void cvSetND( CvArr* arr, const int* idx, CvScalar value );
- arr
- 入力配列.
- idx0
- 要素インデックスの,0を基準とした第1成分.
- idx1
- 要素インデックスの,0を基準とした第2成分.
- idx2
- 要素インデックスの,0を基準とした第3成分.
- idx
- 要素インデックスの配列.
- value
- 割り当てる値.
関数cvSet*Dは,新しい値を指定した配列要素に割り当てる. 疎な配列の場合,ノードが存在しなければ,この関数はノードを生成する.
SetReal*D
特定の配列要素を変更する
void cvSetReal1D( CvArr* arr, int idx0, double value ); void cvSetReal2D( CvArr* arr, int idx0, int idx1, double value ); void cvSetReal3D( CvArr* arr, int idx0, int idx1, int idx2, double value ); void cvSetRealND( CvArr* arr, const int* idx, double value );
- arr
- 入力配列.
- idx0
- 要素インデックスの,0を基準とした第1成分.
- idx1
- 要素インデックスの,0を基準とした第2成分.
- idx2
- 要素インデックスの,0を基準とした第3成分.
- idx
- 要素インデックスの配列.
- value
- 割り当てる値.
関数cvSetReal*Dはシングルチャンネルの配列の指定した要素に新しい値を割り当てる. 配列がマルチチャンネルのときは,ランタイムエラーが起こる. 注釈:関数cvSet*Dはシングルチャンネルとマルチチャンネルの両方に安全に使用することができるが,若干処理速度が遅い.
疎な配列の場合に,ノードが存在しなれば,この関数はノードを生成する.
mSet
シングルチャンネルの浮動小数点型行列の特定の要素の値を変更する
void cvmSet( CvMat* mat, int row, int col, double value );
- mat
- 行列.
- row
- 行の,0を基準としたインデックス.
- col
- 列の,0を基準としたインデックス.
- value
- 行列の要素の新しい値.
関数cvmSetは,シングルチャンネル浮動小数点型行列の場合における,cvSetReal2Dの高速化版関数である. インライン処理され,配列のタイプや要素のタイプのチェックを行わず,また行と列の範囲のチェックもデバックモードのときしか行わないため高速である.
ClearND
特定の要素の値をクリアする
void cvClearND( CvArr* arr, const int* idx );
- arr
- 入力配列.
- idx
- 要素のインデックスの配列.
関数cvClearNDは,密な配列と疎な配列の指定した要素をクリア(0にセット)する.要素が存在しなければ,この関数は何もしない.