CXCORE リファレンス マニュアル
- 基本構造体(Basic Structures)
- 配列操作(Operations on Arrays)
- 動的構造体(Dynamic Structures)
- 描画関数(Drawing Functions)
- データ永続性と実行時型情報(Data Persistence and RTTI)
- その他の関数(Miscellaneous Functions)
- エラーハンドリングとシステム関数(Error Handling and System Functions)
配列操作(Operations on Arrays)
四則演算,論理演算,比較演算(Arithmetic, Logic and Comparison)
LUT
配列のルックアップテーブルによる変換
void cvLUT( const CvArr* src, CvArr* dst, const CvArr* lut );
- src
- 入力配列(各要素は8ビットデータ).
- dst
- 出力配列(任意のデプス,入力配列と同じチャンネル数).
- lut
- 要素数が256であるルックアップテーブル(出力配列と同じデプスでなければならない). マルチチャンネルの入力/出力配列の場合,テーブルはシングルチャンネル(この場合すべてのチャンネル対して,同じテーブルを使う)か,入力/出力配列と同じチャンネル数でなければならない.
関数 cvLUT は,出力配列の各要素値をルックアップテーブルを用いて決定する. 配列のインデックスは入力配列より求められる. src の各要素に対して以下のような処理を行う.
dst(I)=lut[src(I)+DELTA]ここで,srcのデプスが CV_8U の場合はDELTA=0,CV_8S の場合は DELTA=128.
ConvertScale
任意の線形変換によって配列の値を変換する
void cvConvertScale( const CvArr* src, CvArr* dst, double scale=1, double shift=0 );
#define cvCvtScale cvConvertScale
#define cvScale cvConvertScale
#define cvConvert( src, dst ) cvConvertScale( (src), (dst), 1, 0 )
- src
- 入力配列.
- dst
- 出力配列.
- scale
- スケーリング係数.
- shift
- スケーリングした入力配列の要素に加える値.
関数 cvConvertScale は,様々な目的を持つため,違う名前での関数(マクロ)としても定義されている. この関数は,入力配列をスケーリングしてコピーし,さらに以下のような変換を行う(あるいは変換のみを行う).
dst(I)=src(I)*scale + (shift,shift,...)
マルチチャンネル配列の全てのチャンネルは独立に処理される.
異なる型への変換では,丸めや飽和を伴う.すなわち,スケーリング+変換の結果が出力先のデータタイプで表現できない値になる場合には,表現できる最も近い実軸上の値で表現する.
scale=1, shift=0 の場合は,スケーリングは変更されない.これは特別なケースであり,cvConvert と同じ意味である. 入力配列と出力配列が同じタイプの場合,行列や画像のスケーリングと移動を行うことができ,cvScale に相当する.
ConvertScaleAbs
任意の線形変換によって,入力配列の要素を8ビット符号無し整数型の配列に変換する.
void cvConvertScaleAbs( const CvArr* src, CvArr* dst, double scale=1, double shift=0 );
#define cvCvtScaleAbs cvConvertScaleAbs
- src
- 入力配列.
- dst
- 出力配列(デプスは 8u).
- scale
- ScaleAbs 係数.
- shift
- スケーリングした入力配列の要素に加える値.
関数 cvConvertScaleAbs は前述の関数と類似しているが,以下に示すように,変換結果の絶対値を出力する.
dst(I)=abs(src(I)*scale + (shift,shift,...))
この関数は,出力配列のタイプとして 8u(8ビット符号無し整数)のみをサポートしている.その他の型の場合は,cvConvertScale と cvAbs を組み合わせることで同様の効果が得られる.
Add
二つの配列を要素ごとに加算する
void cvAdd( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 cvAdd は,以下のようにsrc1の各要素にsrc2の各要素を加える.
dst(I)=src1(I)+src2(I) (mask(I)!=0の場合)
すべての配列(マスクを除く)は同じタイプで<,配列のサイズ(またはROIのサイズ)も同じでなければならない.
AddS
スカラーと配列を加算する
void cvAddS( const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL );
- src
- 入力配列.
- value
- 加算するスカラー.
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 cvAddS は,入力配列 src1 のすべての要素にスカラー value を加え,結果を dst に保存する.
dst(I)=src(I)+value ( mask(I)!=0 の場合 )
すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
AddWeighted
二つの配列の重み付き和を計算する
void cvAddWeighted( const CvArr* src1, double alpha,
const CvArr* src2, double beta,
double gamma, CvArr* dst );
- src1
- 1番目の入力配列.
- alpha
- 1番目の配列要素への重み.
- src2
- 2番目の入力配列.
- beta
- 2番目の配列要素への重み.
- dst
- 出力配列.
- gamma
- 加算結果に,さらに加えられるスカラー値.
関数 cvAddWeighted は以下のように二つの配列の重み付き和を計算する.
dst(I)=src1(I)*alpha+src2(I)*beta+gamma
すべての配列は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
Sub
二つの配列の要素ごとの減算を行う
void cvSub( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 cvSub は,以下のようにsrc1の各要素からsrc2の各要素を引く.
dst(I)=src1(I)-src2(I) (mask(I)!=0 の場合 )
すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
SubS
配列要素からスカラーを減算する
void cvSubS( const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL );
- src
- 入力配列.
- value
- 減算するスカラー
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 cvSubS は,以下のように入力配列のすべての要素から指定されたスカラーを引く.
dst(I)=src(I)-value if mask(I)!=0
すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
SubRS
スカラーから配列要素を減算する
void cvSubRS( const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL );
- src
- 入力配列.
- value
- 減算されるスカラー.
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 cvSubRS は,以下のように指定されたスカラーから入力配列のすべての要素それぞれを引く.
dst(I)=value-src(I) ( mask(I)!=0 の場合 )
すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
Mul
二つの配列の要素同士を乗算する
void cvMul( const CvArr* src1, const CvArr* src2, CvArr* dst, double scale=1 );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.
- dst
- 出力配列.
- scale
- 任意のスケーリング係数.
関数 cvMul は,以下のように二つの配列の要素同士の乗算を行う.
dst(I)=scale•src1(I)•src2(I)
すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
Div
二つの配列の要素同士を除算する
void cvDiv( const CvArr* src1, const CvArr* src2, CvArr* dst, double scale=1 );
- src1
- 1番目の入力配列.ポインタが NULL の場合は,すべての要素が 1であると仮定する.
- src2
- 2番目の入力配列.
- dst
- 出力配列.
- scale
- オプションのスケーリング係数.
関数 cvDiv は,以下のように1番目の入力配列の各要素を2番目の入力配列の各要素で割る.
dst(I)=scale•src1(I)/src2(I), (src1!=NULLの場合) dst(I)=scale/src2(I), (src1=NULLの場合)
すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
And
ビット単位の論理積を計算する
void cvAnd( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 cvAnd は以下のように,二つの配列の要素ごとの論理積(AND)を計算する.
dst(I)=src1(I)&src2(I) (mask(I)!=0 の場合)
浮動小数点型配列の場合,それらのビット表現が処理に使われる.すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
AndS
配列の各要素とスカラーとのビット単位の論理積を計算する
void cvAndS( const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL );
- src
- 入力配列.
- value
- 処理に用いるスカラー.
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 AndS は以下のように,配列の各要素と指定されたスカラーのビットごとの論理積を計算する.
dst(I)=src(I)&value if mask(I)!=0
実際の計算の前に,スカラーは配列と同じタイプに変換される.浮動小数点型配列の場合,それらのビット表現が処理に使われる.すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
以下のサンプルコードは,最上位ビットをクリアすることで浮動小数点型配列の各要素の絶対値を求める方法を示している.
float a[] = { -1, 2, -3, 4, -5, 6, -7, 8, -9 }; CvMat A = cvMat( 3, 3, CV_32F, &a ); int i, abs_mask = 0x7fffffff; cvAndS( &A, cvRealScalar(*(float*)&abs_mask), &A, 0 ); for( i = 0; i < 9; i++ ) printf("%.1f ", a[i] );
出力は以下のとおりである.
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
Or
二つの配列要素のビット単位の論理和を計算する
void cvOr( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 cvOr は以下のように,二つの配列の要素ごとの論理和(OR)を計算する.
dst(I)=src1(I)|src2(I)
浮動小数点型配列の場合,それらのビット表現が処理に使われる.すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
OrS
配列の各要素とスカラーとのビット単位の論理和を計算する
void cvOrS( const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL );
- src1
- 入力配列.
- value
- 処理に用いるスカラー.
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 OrS は以下のように,配列の各要素とスカラーのビットごとの論理和を計算する.
dst(I)=src(I)|value (mask(I)!=0の場合)
実際の計算の前に,スカラーは配列と同じタイプに変換される.浮動小数点型配列の場合,それらのビット表現が処理に使われる.すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
Xor
二つの配列要素のビット単位の排他的論理和を計算する
void cvXor( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 cvXor は以下のように,二つの配列の要素ごとの排他的論理和(XOR)を計算する.
dst(I)=src1(I)^src2(I) (mask(I)!=0の場合)
浮動小数点型配列の場合,それらのビット表現が処理に使われる.すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
XorS
配列の各要素とスカラーとのビット単位の排他的論理和を計算する
void cvXorS( const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL );
- src
- 入力配列.
- value
- 処理に用いるスカラー.
- dst
- 出力配列.
- mask
- 処理マスク.8ビットシングルチャンネル配列(出力配列のどの要素が変更されるかを指定する).
関数 XorS は以下のように,配列の各要素とスカラーの,ビットごとの排他的論理和を計算する.
dst(I)=src(I)^value if mask(I)!=0
浮動小数点型配列の場合,それらのビット表現が処理に使われる.すべての配列(マスクを除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
以下は,虚部の最上位ビットのON-OFFを入れ替えることで共役複素ベクトルを求めるサンプルコードである.
float a[] = { 1, 0, 0, 1, -1, 0, 0, -1 }; /* 1, j, -1, -j */ CvMat A = cvMat( 4, 1, CV_32FC2, &a ); int i, neg_mask = 0x80000000; cvXorS( &A, cvScalar( 0, *(float*)&neg_mask, 0, 0 ), &A, 0 ); for( i = 0; i < 4; i++ ) printf("(%.1f, %.1f) ", a[i*2], a[i*2+1] );
出力は以下のとおり.
(1.0,0.0) (0.0,-1.0) (-1.0,0.0) (0.0,1.0)
Not
各配列要素のビット単位の反転を行う
void cvNot( const CvArr* src, CvArr* dst );
- src1
- 入力配列.
- dst
- 出力配列.
関数 Not は以下のように,配列の各要素のビットをすべて反転(NOT)する.
dst(I)=~src(I)
Cmp
二つの配列の各要素ごとの比較を行う
void cvCmp( const CvArr* src1, const CvArr* src2, CvArr* dst, int cmp_op );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.どちらの入力配列もシングルチャンネルでなければならない.
- dst
- 出力配列(タイプは 8u か 8s でないといけない).
- cmp_op
- 比較方法を示すフラグ.
CV_CMP_EQ - src1(I) と src2(I) は等しい
CV_CMP_GT - src1(I) は src2(I) より大きい
CV_CMP_GE - src1(I) は src2(I) より大きいか等しい
CV_CMP_LT - src1(I) は src2(I) より小さい
CV_CMP_LE - src1(I) は src2(I) より小さいか等しい
CV_CMP_NE - src1(I) と src2(I) は等しくない
関数 cvCmp は,以下のように二つの配列の対応する要素を比較し,出力配列の値にセットする.
dst(I)=src1(I) op src2(I),
ここで op は '=', '>', '>=', '<', '<=', '!=' のいずれか.
比較結果が真(TRUE)であれば dst(I) には 0xff(要素すべてのビットが 1 )をセットし,それ以外の場合(FALSE)であれば 0 をセットする.すべての配列(出力配列を除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
CmpS
配列要素とスカラーを比較する
void cvCmpS( const CvArr* src, double value, CvArr* dst, int cmp_op );
- src
- 入力配列(シングルチャンネル).
- value
- それぞれの配列要素と比較されるスカラー.
- dst
- 出力配列(タイプは8u または8s).
- cmp_op
- 比較方法を示すフラグ.
CV_CMP_EQ - src1(I) と value は等しい
CV_CMP_GT - src1(I) は value より大きい
CV_CMP_GE - src1(I) は value より大きいか等しい
CV_CMP_LT - src1(I) は value より小さい
CV_CMP_LE - src1(I) は value より小さいか等しい
CV_CMP_NE - src1(I) と value は等しくない
関数 cvCmpS は以下のように配列要素とスカラーとを比較し,出力配列の値をセットする.
dst(I)=src(I) op scalar,
ここで op は '=', '>', '>=', '<', '<=' or '!=' のいずれか.
比較結果が真(TRUE)であれば dst(I) には 0xff(要素すべてのビットが 1 ) をセットし,それ以外の場合(FALSE)であれば 0 をセットする.すべての配列のサイズ(またはROIのサイズ)は同じでなければならない.
InRange
配列の要素値が他の二つの配列要素で表される範囲内に位置するかをチェックする
void cvInRange( const CvArr* src, const CvArr* lower, const CvArr* upper, CvArr* dst );
- src
- 入力配列.
- lower
- 下限値(その値を含む)を表す配列.
- upper
- 上限値(その値は含まない)を表す配列.
- dst
- 出力配列(タイプは8u または 8s).
関数 cvInRange は以下のように,入力配列のすべての要素について範囲チェックを行う.
dst(I)=lower(I)0 <= src(I)0 < upper(I)0
(シングルチャンネル配列の場合),
dst(I)=lower(I)0 <= src(I)0 < upper(I)0 && lower(I)1 <= src(I)1 < upper(I)1
(2チャンネルなどの場合).
src(I) が範囲内であれば dst(I) には 0xff(要素すべてのビットが '1')をセットし,それ以外の場合は 0 をセットする.すべての配列(出力配列を除く)は同じタイプで,配列のサイズ(またはROIのサイズ)も同じでなければならない.
InRangeS
配列の要素値が二つのスカラーの間に位置するかをチェックする
void cvInRangeS( const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst );
- src
- 入力配列.
- lower
- 下限値(その値を含む).
- upper
- 上限値(その値は含まない).
- dst
- 出力配列(タイプは8u または 8s).
関数 cvInRangeS は以下のように,入力配列のすべての要素のについて範囲チェックを行う.
dst(I)=lower0 <= src(I)0 < upper0
(シングルチャンネル配列の場合),
dst(I)=lower0 <= src(I)0 < upper0 && lower1 <= src(I)1 < upper1
(2チャンネルなどの場合).
src(I) が範囲内であれば dst(I) には 0xff(要素すべてのビットが '1')をセットし,それ以外の場合は 0 をセットする. すべての配列のサイズ(またはROIのサイズ)は同じでなければならない.
Max
二つの配列の各要素についての最大値を求める
void cvMax( const CvArr* src1, const CvArr* src2, CvArr* dst );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.
- dst
- 出力配列.
関数 cvMax は以下のように,二つの配列の要素ごとの最大値を計算する.
dst(I)=max(src1(I), src2(I))
すべての配列はシングルチャンネルで,タイプ,配列のサイズ(またはROIのサイズ)は同じでなければならない.
MaxS
配列の各要素とスカラーについての最大値を求める
void cvMaxS( const CvArr* src, double value, CvArr* dst );
- src
- 入力配列.
- value
- スカラー.
- dst
- 出力配列.
関数 cvMaxS は以下のように,配列の各要素とスカラーとの最大値を計算する.
dst(I)=max(src(I), value)
すべての配列はシングルチャンネルで,タイプ,配列のサイズ(またはROIのサイズ)は同じでなければならない.
Min
二つの配列の各要素についての最小値を求める
void cvMin( const CvArr* src1, const CvArr* src2, CvArr* dst );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.
- dst
- 出力配列.
関数 cvMin は以下のように,二つの配列の要素ごとの最小値を計算する.
dst(I)=min(src1(I),src2(I))
すべての配列はシングルチャンネルで,タイプ,配列のサイズ(またはROIのサイズ)は同じでなければならない.
MinS
配列の各要素とスカラーについての最小値を求める
void cvMinS( const CvArr* src, double value, CvArr* dst );
- src
- 入力配列.
- value
- スカラー.
- dst
- 出力配列.
関数 cvMinS は以下のように,配列の各要素とスカラーとの最小値を計算する.
dst(I)=min(src(I), value)
すべての配列はシングルチャンネルで,タイプ,配列のサイズ(またはROIのサイズ)は同じでなければならない.
AbsDiff
二つの配列の要素ごとの差の絶対値を計算する
void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.
- dst
- 出力配列.
関数 cvAbsDiff は以下のように,src1 の各要素と src2 の差の絶対値を計算する.
dst(I)c = abs(src1(I)c - src2(I)c).
すべての配列は同じタイプ,同じサイズ(または同じROIサイズ)でなければならない.
AbsDiffS
配列の要素と定数との差の絶対値を計算する
void cvAbsDiffS( const CvArr* src, CvArr* dst, CvScalar value );
#define cvAbs(src, dst) cvAbsDiffS(src, dst, cvScalarAll(0))
- src
- 入力配列.
- dst
- 出力配列.
- value
- スカラー.
関数 cvAbsDiffS は以下のように,配列の各要素とスカラーとの差の絶対値を計算する.
dst(I)c = abs(src(I)c - valuec).
すべての配列は同じタイプ,同じサイズ(または同じROIサイズ)でなければならない.