2 つの配列の要素毎に差の絶対値を求めます.
パラメタ: |
|
---|
この関数は,2 つの配列の要素毎に差の絶対値を求めます.
すべての入力配列は,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません.
#define cvAbs(src, dst) cvAbsDiffS(src, dst, cvScalarAll(0))
param src: 入力配列. param dst: 出力配列. param value: スカラ値.
この関数は,入力配列の要素とスカラ値の差の絶対値を求めます.
すべての入力配列は,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません.
2つの配列を要素毎に加算します.
パラメタ: |
|
---|
この関数は,以下のように1つの配列をもう1つの配列と足し合わせます:
dst(I)=src1(I)+src2(I) if mask(I)!=0
マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します.
配列とスカラ値を加算します.
パラメタ: |
|
---|
この関数は,スカラ value を入力配列 src1 の各要素に加え,その結果を dst に出力します. また,有限の範囲に値をとる型は,この処理により飽和します.
dst(I)=src(I)+value if mask(I)!=0
マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません.
2つの配列の重み付き和を求めます.
パラメタ: |
|
---|
この関数は,以下のように2つの配列の重み付き和を計算します:
dst(I)=src1(I)*alpha+src2(I)*beta+gamma
マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します.
2つの配列の要素毎に,ビット単位の論理積を求めます.
パラメタ: |
|
---|
この関数は,2つの配列の要素ごとに,ビット単位の論理積を計算します:
dst(I)=src1(I)&src2(I) if mask(I)!=0
浮動小数点型配列の場合,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけない.
スカラ値と配列の要素毎に,ビット単位の論理積を求めます.
パラメタ: |
|
---|
この関数は,スカラ値と配列要素毎に,ビット単位の論理積を計算します:
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, absMask = 0x7fffffff;
cvAndS(&A, cvRealScalar(*(float*)&absMask), &A, 0);
for(i = 0; i < 9; i++ )
printf("
このコードは,次のような結果を出力します:
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
配列の要素の平均値を求めます.
パラメタ: |
|
---|
この関数は,各チャンネル毎に配列要素値の平均 M を求めます:
配列が IplImage で COI が設定されている場合,この関数は指定されたチャンネルのみを処理し,その結果を戻り値の CvScalar の 1 番目の要素 に格納します.
配列の要素の平均値と標準偏差を求めます.
パラメタ: |
|
---|
この関数は,各チャンネル毎に配列要素の平均値と標準偏差を求めます:
配列が IplImage で COI が設定されている場合,この関数は指定されたチャンネルのみを処理し,その結果(平均,標準偏差)を出力変数の1番目の要素 , に格納します.
ベクトル集合の分散共分散行列を求めます.
パラメタ: |
|
---|
この関数は,分散共分散行列を求め,必要ならば入力ベクトル集合の平均ベクトルも計算します. これは,PCA や マハラノビス距離によるベクトル同士の比較などに用いられます.
2 次元ベクトルの大きさと角度を求めます.
パラメタ: |
|
---|
この関数は,2 次元ベクトル (x(I),y(I)) の大きさか角度のどちらか,あるいは両方を求めます:
magnitude(I)=sqrt(x(I)^2^+y(I)^2^ ),
angle(I)=atan(y(I)/x(I) )
この角度は,0.1 度の精度で計算されます.また,(0,0) の点では,角度は 0 にセットされます.
立方根を求めます.
パラメタ: |
|
---|
この関数は,引数で与えられた入力値の立方根を求めます.また通常, pow(value,1./3 よりも高速であり,負の入力値も適切に扱うことができます.しかし,特別な値( , NaN )は扱うことができません.
ヘッダ,データ,ROIを含む,画像の完全なコピーを作成します.
パラメタ: |
|
---|
戻り値の IplImage* は,コピーされた画像へのポインタです.
行列の完全なコピーを作成し,そのコピーへのポインタを返します.
疎な配列の完全なコピーを作成します.
パラメタ: |
|
---|
この関数は,入力配列のコピーを作成しそのポインタを返します.
2 つの配列の要素毎の比較を行います.
パラメタ: |
|
---|
この関数は,2 つの配列の対応する 2 つの要素同士を比較し,その結果に応じた値でマスク配列を埋めます:
dst(I)=src1(I) op src2(I),
比較結果が真であれば, dst(I) に 0xff(全てのビットが 1 )がセットされ,そうでなければ 0 がセットされます.出力配列を除くすべての入力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません.
スカラ値と配列の要素毎の比較を行います.
パラメタ: |
|
---|
この関数は,配列の要素とスカラ値を比較し,その結果に応じた値でマスク配列を埋めます:
dst(I)=src(I) op scalar
ここで op は , , , , , のいずれかです.
比較結果が真であれば, dst(I) に 0xff(全てのビットが 1 )がセットされ,そうでなければ 0 がセットされます.出力配列を除くすべての入力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません.
配列に対して任意の線形変換を行います.
#define cvCvtScale cvConvertScale
#define cvScale cvConvertScale
#define cvConvert(src, dst ) cvConvertScale((src), (dst), 1, 0 )
param src: 入力配列. param dst: 出力配列. param scale: スケール係数. param shift: スケーリングされた入力配列要素に加えられる値.
関数 cvConvertScale には,使用目的に応じた複数の別名があります.この関数は,入力配列に対して任意のスケーリングと任意の変換(あるいは任意の変換のみ)を行い,結果を出力配列にコピーします:
マルチチャンネル配列のチャンネルはすべて,個別に処理されます.
変換の種類によっては,丸めや飽和を伴う場合があります.つまり,スケーリング+変換の結果が,出力配列の要素の型で正確に表現できない場合,実軸上でもっとも近い表現可能な値が出力として用いられます.
scale=1, shift=0 の場合には,スケーリングは行われません.これは,特別に最適化されたケースであり,それに適した別名 Convert を持ちます.入出力配列が同じ種類である場合も,行列や画像のスケーリングや移動を行うことができる特別なケースであり, Scale と呼ばれます.
入力配列の要素を,任意の線形変換によって 8 ビット符号なし整数に変換します.
パラメタ: |
|
---|
この関数は, ConvertScale と似ていますが,変換結果の絶対値を保存します.
この関数は,8u(8 ビット,符号なし整数)型の出力配列のみをサポートします. その他の型の場合は, ConvertScale と Abs の組み合わせることで,この関数をエミュレートできます.
入力配列の要素を,別の 8 ビット,符号なし整数に変換します.オプションで,さらに線形変換を行うこともできます.
パラメタ: |
|
---|
この関数は, ConvertScale と似ていますが,変換結果の絶対値を出力します:
この関数は,出力配列として 8u(8ビット符号なし整数)型の配列のみをサポートします.その他の型の場合は, ConvertScale と Abs を組み合わせることで,この関数と同等の結果を得られます.
配列をコピーします.
パラメタ: |
|
---|
この関数は,入力配列の選択された要素を出力配列にコピーします:
引数配列に IplImage が含まれる場合,その ROI と COI が利用されます.コピー元配列とコピー先配列は,同じ型,同じ次元,同じサイズでなければいけません.また,この関数は疎な配列もコピーできます(が,その場合マスクはサポートされません).
配列中の 0 ではない要素を数えます.
パラメタ: |
|
---|
この関数は, arr 中の 0 ではない要素数を返します:
IplImage の場合は,ROI と COI がサポートされます.
この関数は,画像,行列あるいは多次元配列のデータの割り当てを行います.行列の場合は OpenCV の割り当て関数が用いられます.IplImage の場合も OpenCV の関数が用いられますが, CV_TURN_ON_IPL_COMPATIBILITY が呼ばれている場合は例外的に,IPL 関数によってデータ領域が割り当てられます.
この関数呼び出しは,以下の形式を短縮したものです.
header = cvCreateImageHeader(size, depth, channels);
cvCreateData(header);
画像ヘッダを作成しますが,データ領域の割り当ては行いません.
パラメタ: |
|
---|
この関数呼び出しは,以下の形式に似ています.
hdr=iplCreateImageHeader(channels, 0, depth,
channels == 1 ? "GRAY" : "RGB",
channels == 1 ? "GRAY" : channels == 3 ? "BGR" :
channels == 4 ? "BGRA" : "",
IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_TL, 4,
size.width, size.height,
0,0,0,0);
しかし,この関数はデフォルトでは IPL の関数を用いません(マクロ CV_TURN_ON_IPL_COMPATIBILITY を参照してください).
行列のヘッダを作成し,データ領域を割り当てます.
パラメタ: |
|
---|
これは,以下の形式の簡略形と言えます:
CvMat* mat = cvCreateMatHeader(rows, cols, type);
cvCreateData(mat);
行列のデータ領域を割り当てずに,行列のヘッダのみを作成します.
パラメタ: |
|
---|
この関数は,新しい行列のヘッダを作成し,そのポインタを返します.行列データは, CreateData を用いて割り当てを行うか,あるいは,ユーザが割り当てしたデータを SetData によって明示的にセットします.
多次元の密な配列のヘッダを作成し,データ領域を割り当てます.
パラメタ: |
|
---|
これは,以下の形式を短縮したものです:
CvMatND* mat = cvCreateMatNDHeader(dims, sizes, type);
cvCreateData(mat);
行列のデータ領域を割り当てずに,行列のヘッダのみを作成します.
パラメタ: |
|
---|
この関数は,多次元の密な配列のヘッダを確保します.配列データは, CreateData を用いて割り当てるか,あるいは,ユーザが割り当てたデータを SetData によって明示的にセットします.
疎な配列を作成します.
パラメタ: |
|
---|
この関数は,多次元の疎な配列を確保します.この配列は,初期状態では要素を持ちません.つまり, Get GetReal は,全インデックスに対して 0 を返します.
2 つの 3 次元ベクトルの外積を求めます.
パラメタ: |
|
---|
この関数は,2 つの 3 次元ベクトルの外積を求めます:
あるいは:
1 次元あるいは 2 次元浮動小数点型配列に対して,離散コサイン変換(DCT),逆離散コサイン変換(IDCT)を行います.
パラメタ: |
|
---|
この関数は,1 次元あるいは 2 次元浮動小数点型配列に対して,離散コサイン変換,逆離散コサイン変換を行います.
N 個の要素を持つ 1 次元ベクトルに対するコサイン変換:
ここで
および , for です.
N 個の要素を持つ 1 次元ベクトルに対する逆コサイン変換:
( は直行行列なので, )
の 2 次元行列に対するコサイン変換:
個の要素を持つ 2 次元ベクトルに対する逆コサイン変換:
1 次元あるいは 2 次元浮動小数点型配列に対して,離散フーリエ変換(DFT),逆離散フーリエ変換(IDFT)を行います.
パラメタ: |
|
---|
この関数は,1 次元あるいは 2 次元浮動小数点型配列に対して,離散フーリエ変換,逆離散フーリエ変換を行います:
N 個の要素を持つ 1 次元ベクトルに対するフーリエ変換:
,
N 個の要素を持つ 1 次元ベクトルに対する逆フーリエ変換:
M N 個の要素を持つ 2 次元ベクトルに対するフーリエ変換:
M N 個の要素を持つ 2 次元ベクトルに対する逆フーリエ変換:
実数データ(シングルチャンネル)の場合,フーリエ変換の出力や逆変換の入力を表現するために,IPL 形式の packed フォーマットが用いられます:
注意: N が偶数ならば最終列が存在し, M が偶数ならば最終行が存在します. また,1 次元実数データを変換する場合,その結果は上述の行列の 1 行目のようになります.
ここでは,DFT を用いた 2 次元畳み込演算の例を示します.
CvMat* A = cvCreateMat(M1, N1, CVg32F);
CvMat* B = cvCreateMat(M2, N2, A->type);
// 畳み込み結果の一部(abs(M2-M1)+1 * abs(N2-N1)+1)
// だけになる可能性もあります.
CvMat* conv = cvCreateMat(A->rows + B->rows - 1, A->cols + B->cols - 1,
A->type);
// 行列 A と行列 B を初期化します.
...
int dftgM = cvGetOptimalDFTSize(A->rows + B->rows - 1);
int dftgN = cvGetOptimalDFTSize(A->cols + B->cols - 1);
CvMat* dftgA = cvCreateMat(dft_M, dft_N, A->type);
CvMat* dftgB = cvCreateMat(dft_M, dft_N, B->type);
CvMat tmp;
// A を dft_A にコピーし,dft_A の残り部分を 0 で埋めます.
cvGetSubRect(dftgA, &tmp, cvRect(0,0,A->cols,A->rows));
cvCopy(A, &tmp);
cvGetSubRect(dftgA, &tmp, cvRect(A->cols,0,dft_A->cols - A->cols,A->rows));
cvZero(&tmp);
// 以下の cvDFT() では,パラメータ nonzero_rows を利用しているので,
// dft_A の下部を 0 で埋める必要はありません.
cvDFT(dftgA, dft_A, CV_DXT_FORWARD, A->rows);
// 2 番目の配列に対しても同様に繰り返します.
cvGetSubRect(dftgB, &tmp, cvRect(0,0,B->cols,B->rows));
cvCopy(B, &tmp);
cvGetSubRect(dftgB, &tmp, cvRect(B->cols,0,dft_B->cols - B->cols,B->rows));
cvZero(&tmp);
// 以下の cvDFT() では,パラメータ nonzero_rows を利用しているので,
// dft_B の下部を 0 で埋める必要はありません.
cvDFT(dftgB, dft_B, CV_DXT_FORWARD, B->rows);
cvMulSpectrums( dftgA, dft_B, dft_A, 0 /* 畳み込みではなく相関を得るためには
CV_DXT_MUL_CONJ を指定します */ );
cvDFT( dftgA, dft_A, CV_DXT_INV_SCALE, conv->rows ); // 上部のみを計算します.
cvGetSubRect(dftgA, &tmp, cvRect(0,0,conv->cols,conv->rows));
cvCopy(&tmp, conv);
この関数は, CvMat や CvMatND のデータの参照カウンタをデクリメントします.カウンタが 0 になった場合,そのデータは解放されます.現在の実装では,参照カウンタが NULL 以外の値をとるのは,データが関数 CreateData によって確保された場合のみです.その他の場合でカウンタが NULL になるケースは以下のとおりです: SetData によって外部データがヘッダに割り当てられた場合,行列のヘッダがより大きな画像や行列の一部になっている場合,ヘッダが画像や n-次元の行列ヘッダから変換された場合.
関数 cvDet は,正方行列 mat の行列式を返します.小さい行列には直接的な方法が,大きい行列にはガウスの消去法が用いられます.正定値対称行列の場合は, として SVD を行い, の対角要素の積として行列式を計算することもできます.
2 つの配列の要素毎の割り算を行います.
パラメタ: |
|
---|
この関数は,1 つの配列をもう 1 つの配列で割ります:
すべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません.
2つの配列のユークリッド内積を計算します.
パラメタ: |
|
---|
この関数は,2 つの配列のユークリッド内積を計算して返します.
マルチチャンネル配列の場合,すべてのチャンネルの結果が足し合わされます.特に, cvDotProduct(a,a) ( a は複素ベクトル)の場合は を返します. この関数は,多次元配列を,行毎,レイヤー毎,に処理することができます.
対称行列の固有値と固有ベクトルを求めます.
パラメタ: |
|
---|
この関数は,行列 A の固有値と固有ベクトルを求めます:
mat*evects(i,:)' = evals(i)*evects(i,:)' (in MATLAB notation)
lowindex あるいは highindex の一方が与えられると,もう片方も必要になります.また,このインデックスは,0 から始まります. 例えば,最大の固有値/固有ベクトルを計算する場合は, lowindex=highindex=0 をセットします. また,すべての固有値を計算する場合は, lowindex=highindex=-1 のままにしておきます. 過去の経緯から,この関数は常に入力行列と同じサイズの正方行列(固有ベクトルから構成)と,入力行列と同じ長さのベクトル(固有値から構成)を返します. インデックスで選択された固有値/固有ベクトルは,常に最初の highindex - lowindex + 1 行目に格納されます.
行列 A の内容は,この関数によって破壊されます.
今のところ,この関数は SVD よりも遅く,精度も低いです.よって, A が正定値行列(例えば,分散共分散行列など)であることが既知である場合に,その固有値と固有ベクトルを計算するには(固有ベクトルが必要とされない場合は特に) SVD を用いることが推奨されます.
各配列要素を指数として,自然対数の底(ネイピア数)e のべき乗を求めます.
パラメタ: |
|
---|
この関数は,入力配列の各要素に対して,それを指数とする自然対数の底 e のべき乗を求めます:
最大誤差は約 です.現在の実装では,指数表現されない(非正規化)浮動小数点数は 0 に変換されて出力されます.
2 次元ベクトルの角度を求めます.
パラメタ: |
|
---|
関数 cvFastArctan は,2 次元ベクトルの角度を求めます.この角度は 0 度から 360 度の間に値をとり,精度は約 0.1 度です.
2 次元配列を垂直,水平,または両軸で反転します.
パラメタ: |
|
---|
この関数は,3種の中から1つ選択された方法で配列を反転させます(行と列のインデックスは 0 が基準):
この関数が利用されるケースとして,以下のような場合が考えられます:
汎用的な行列の乗算を行います.
パラメタ: |
|
---|
この関数は,汎用的な行列の乗算を行います:
すべての入力行列は,同じデータ型,適切なサイズでなければいけません.実数あるいは複素数の,浮動小数点型の行列がサポートされます.
インデックスで指定された配列要素を返します.
パラメタ: |
|
---|
この関数は,指定された配列要素の値を返します.疎な配列で,指定したノードが存在しない場合,この関数は 0 を返します(この関数によって新しいノードは生成されません).
パラメタ: |
|
---|
関数 GetCol と GetCols は,入力配列中の指定した 1 列,あるいは指定した範囲内の複数列に対応するヘッダを返します. GetCol は, GetCols のショートカットであることに注意してください:
cvGetCol(arr, submat, col); // ~ cvGetCols(arr, submat, col, col + 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);
任意の配列に対する画像ヘッダを返します.
パラメタ: |
|
---|
関数 cvGetImage は,入力配列を画像とみなした場合の画像ヘッダを返します. 入力配列になり得るものは,行列 - CvMat と,画像 - IplImage* です. 入力が画像の場合は,単に入力ポインタをそのまま返します.入力が CvMat の場合は, imageHeader 構造体を入力行列のパラメータで初期化します. ROI が設定された IplImage から CvMat への変換を行い,再び CvMat から IplImage に戻した場合,異なるヘッダが返される可能性があります. したがって,画像の長さをその幅とアラインメントから計算するような IPL 関数は,この関数の結果として得られる画像に対しては失敗する可能性があります.
IplImage の COI を返します.この戻り値は, SetImageCOI の引数 coi に対応します.
ROI が設定されていない場合は,画像全体を表す cvRect(0,0,image->width,image->height) が返されます.
任意の配列に対する行列ヘッダを返します.
パラメタ: |
|
---|
この関数は,入力配列を行列とみなした場合の行列ヘッダを返します.
入力配列になり得るものは,行列 - CvMat ,画像 - IplImage ,多次元の密な配列 CvMatND (これは allowND != 0 の場合のみ)です.入力が行列の場合は,単に入力ポインタをそのまま返します. IplImage* あるいは CvMatND の場合, header 構造体を現在の画像 ROI のパラメータで初期化し,そのテンポラリ構造体へのポインタを返します. CvMat では COI がサポートされないので,これは別のオプション出力として返されます.
この関数によって,2 種類の配列( IplImage と CvMat )を簡単に同じコードで扱うことができます.また,関数 GetImage を用いることで, CvMat から IplImage への逆変換が可能です.
入力配列には,内部データが確保されている,あるいは関連付けられている必要があります.そうでない場合,この関数は失敗します.
入力配列が平面データレイアウト(2 次元 RGB 画像など)を持ち,COI が設定されている IplImage である場合,この関数は,選択された平面(例えば,色平面 R)へのポインタと COI = 0 を返します.OpenCVの関数を用いて,マルチチャンネル画像の各チャンネル(平面)毎に処理を行う事ができるようになります.
疎な配列の,次の要素へのポインタを返します.
パラメタ: |
|
---|
この関数は,イテレータを次の要素へ動かし,そこへのポインタを返します.現在のバージョンでは,個々の要素はハッシュテーブルに保存されているので,それらに特別な順番はありません.以下のサンプルで,疎行列内を繰り返し処理する様子を示します:
InitSparseMatIterator と GetNextSparseNode を用いた,浮動小数点型疎行列の総和演算.
double sum;
int i, dims = cvGetDims(array);
CvSparseMatIterator mat_iterator;
CvSparseNode* node = cvInitSparseMatIterator(array, &mat_iterator);
for(; node != 0; node = cvGetNextSparseNode(&mat_iterator ))
{
/* 要素インデックスへのポインタを取得します. */
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("
printf("
sum += val;
}
printf("nTotal sum =
与えられたベクトルサイズに対する最適な DFT サイズを返します.
パラメタ: |
|
---|
この関数は,DFT サイズ N を返します.この N は,DFT を高速に実行できるサイズのうちで size0 以上の最小値です.現在の実装では,ある , , に対して となっています.
size0 が大きすぎる( INT_MAX に非常に近い)場合,この関数は負の値を返します.
配列に関する低レベルの情報を取得します.
パラメタ: |
|
---|
この関数は,配列データに関する低レベル情報を変数に出力します.すべての出力パラメータは任意であり,あるポインタを NULL にセットしても構いません.配列が ROI をもつ IplImage である場合,ROI のパラメータが返されます.
以下に,この関数を用いて配列の要素にアクセスする例を示します. cvGetRawData を用いて,シングルチャンネル,float 型配列の要素の絶対値を計算します.
float* data;
int step;
CvSize size;
int x, y;
cvGetRawData(array, (uchar**)&data, &step, &size);
step /= sizeof(data[0]);
for(y = 0; y < size.height; y++, data += step )
for(x = 0; x < size.width; x++ )
data[x] = (float)fabs(data[x]);
シングルチャンネルの 1 次元配列の,指定された要素を返します.
パラメタ: |
|
---|
シングルチャンネル配列の指定された要素を返します. また,配列がマルチチャンネルである場合,ランタイムエラーが発生します. 関数 Get は,多少処理が遅いですが,シングルチャンネル配列にもマルチチャンネル配列にも安全に使えることに注意してください.
疎な配列の場合,要求されたノードが存在しなければ,この関数は 0 を返します(この関数によって新たにノードが作成されることはありません).
シングルチャンネルの 2 次元配列の,指定された要素を返します.
パラメタ: |
|
---|
シングルチャンネル配列の指定された要素を返します. また,配列がマルチチャンネルである場合,ランタイムエラーが発生します. 関数 Get は,多少処理が遅いですが,シングルチャンネル配列にもマルチチャンネル配列にも安全に使えることに注意してください.
疎な配列の場合,要求されたノードが存在しなければ,この関数は 0 を返します(この関数によって新たにノードが作成されることはありません).
シングルチャンネルの3次元配列の,指定された要素を返します.
パラメタ: |
|
---|
シングルチャンネル配列の指定された要素を返します. また,配列がマルチチャンネルである場合,ランタイムエラーが発生します. 関数 Get は,多少処理が遅いですが,シングルチャンネル配列にもマルチチャンネル配列にも安全に使えることに注意してください.
疎な配列の場合,要求されたノードが存在しなければ,この関数は 0 を返します(この関数によって新たにノードが作成されることはありません).
シングルチャンネルの配列の,指定された要素を返します.
パラメタ: |
|
---|
シングルチャンネル配列の指定された要素を返します. また,配列がマルチチャンネルである場合,ランタイムエラーが発生します. 関数 Get は,多少処理が遅いですが,シングルチャンネル配列にもマルチチャンネル配列にも安全に使えることに注意してください.
疎な配列で,指定したノードが存在しない場合,この関数は 0 を返します(この関数によって新しいノードは生成されません).
パラメタ: |
|
---|
これらの関数は,入力配列中の指定した 1 行,あるいは指定した範囲内の複数行に対応するヘッダを返します. GetRow は, GetRows のショートカットであることに注意してください:
cvGetRow(arr, submat, row ) ~ cvGetRows(arr, submat, row, row + 1, 1);
この関数は,入力行列あるいは入力画像の行数(CvSize::height)および列数(CvSize::width)を返します.入力が画像の場合は,ROIのサイズが返されます.
入力画像または行列の,矩形部分配列に相当するヘッダを返します.
パラメタ: |
|
---|
関数 cvGetSubRect は,入力配列中の指定矩形領域に対応するヘッダを返します.つまり,入力配列の一部の矩形領域を独立した配列として扱えるようにします.この関数では ROI を考慮し,実際には ROI の部分配列が取り出されます.
入力配列の要素値が,別の2つの配列要素で表される範囲内にあるかどうかをチェックします.
パラメタ: |
|
---|
この関数は,入力配列の要素毎に範囲チェックを行います:
シングルチャンネル配列の場合,
2チャンネル配列などの場合,
src(I) が範囲内にあれば dst(I) に 0xff(すべてのビットが 1 )がセットされ,そうでなければ 0 がセットされます.出力配列を除くすべての入力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません.
入力配列の要素値が,2 つのスカラ値で表される範囲内にあるかどうかをチェックします.
パラメタ: |
|
---|
この関数は,入力配列の要素毎に範囲チェックを行います:
シングルチャンネル配列の場合,
2チャンネル配列などの場合,
src(I) が範囲内にあれば dst(I) に 0xff(すべてのビットが 1 )がセットされ,そうでなければ 0 がセットされます.出力配列を除く全ての入力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません.
関数 cvIncRefData は, CvMat や CvMatND のデータ参照カウンタをインクリメントし,新しいカウンタの値を返します.参照カウンタポインタが NULL の場合は 0 を返します.
あらかじめ確保された画像ヘッダを初期化します.
パラメタ: |
|
---|
戻り値の IplImage* は,初期化されたヘッダへのポインタです.
あらかじめ確保された行列のヘッダを初期化します.
パラメタ: |
|
---|
この関数は,OpenCV の行列関数において raw データ を扱うためによく利用されます.例えば,以下のコードは 2 つの行列の積を計算し,通常の配列として格納します:
double a[] = { 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12 };
double b[] = { 1, 5, 9,
2, 6, 10,
3, 7, 11,
4, 8, 12 };
double c[9];
CvMat Ma, Mb, Mc ;
cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);
cvInitMatHeader(&Mb, 4, 3, CV_64FC1, b);
cvInitMatHeader(&Mc, 3, 3, CV_64FC1, c);
cvMatMulAdd(&Ma, &Mb, 0, &Mc);
// この行列 c には,行列 a(3x4) と 行列 b(4x3) の積が入っている
疎な配列要素のイテレータを初期化します.
パラメタ: |
|
---|
この関数は,疎な配列要素のイテレータを初期化し先頭要素へのポインタを返します.配列が空の場合は NULL を返します.
平方根の逆数を求めます.
パラメタ: |
|
---|
この関数は,引数で与えられた入力値の平方根の逆数を求めます.この関数は,通常, 1./sqrt(value) よりも高速です.入力値が 0 以下の場合の処理結果は不定です.また,特別な値( , NaN )は扱うことができません.
Invert
逆行列,または擬似逆行列を求めます.
パラメタ: |
|
---|
この関数は, src1 の逆行列を求め,それを src2 に格納します.
LU (ガウスの消去法)を用いた場合,この関数は src1 の行列式を返します(もちろん,src1 は正方でなければいけません).この戻り値が 0 の場合,逆行列が計算できなかったという事であり, src2 の要素は 0 で埋められます.
SVD を用いた場合,この関数は src1 の条件数の逆数(最大の特異値に対する最小の特異値の比)を返します. src1 が 0 ならば,この戻り値も 0 になります.また,SVD を用いた場合, src1 が非正則な行列ならば,その擬似逆行列を求めます.
無限大であるか否かを判定します.
パラメタ: |
|
---|
この関数は,引数で与えられた入力値が (無限大;IEEE754 で定義されています)の場合は 1 を返し,そうでなければ 0 を返します.
NaN であるか否かを判定します.
パラメタ: |
|
---|
この関数は,引数で与えられた入力値が NaN(非数値;IEEE754 で定義されている)の場合は 1 を返し,そうでなければ 0 を返します.
ルックアップテーブルを用いて配列を変換します.
パラメタ: |
|
---|
この関数は,ルックアップテーブルから取り出した値で出力配列を埋めます.テーブルの要素を指定するインデックスには,入力配列の値が用いられます.つまり,この関数は src の各要素を以下のように処理します:
ここで,
です.
各配列要素の絶対値の自然対数を求めます.
パラメタ: |
|
---|
この関数は,入力配列の各要素に対して自然対数を求めます:
ここで C は,大きな負の値です(現在の実装では,およそ -700).
2 つのベクトル間のマハラノビス距離を求めます.
パラメタ: |
|
---|
この関数は,2 つのベクトル間の重み付き距離を計算して返します:
共分散行列は,関数 CalcCovarMatrix によって求められ,その逆行列は,関数 Invert (行列は非正則であるかもしれないので CV _ SVD フラグを指定するのが望ましいです)によって求められます.
行列のヘッダを初期化します(軽量版).
パラメタ: |
|
---|
行列のヘッダを初期化し,それにデータを割り当てます.行列は, row -ワイズ (データ先頭から cols 個の要素が,行列の最初の行に入ります)で埋められます.
この関数は, InitMatHeader の高速なインライン展開であり,以下と等価です:
CvMat mat;
cvInitMatHeader(&mat, rows, cols, type, data, CV_AUTOSTEP);
2つの配列の要素同士で大きい方を求めます.
パラメタ: |
|
---|
この関数は,2 つの配列の各要素を比較して大きい方を求めます:
すべての入力配列は シングルチャンネルで,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません.
配列の各要素とスカラ値を比較して大きい方を求めます.
パラメタ: |
|
---|
この関数は,配列の各要素とスカラ値を比較して大きい方を求めます:
すべての入力配列は シングルチャンネルで,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません.
複数のシングルチャンネル配列を用いて 1 つのマルチチャンネル配列を構成します.または,配列に 1 つのチャンネルを挿入します.
#define cvCvtPlaneToPix cvMerge
param src0: 入力チャンネル 0. param src1: 入力チャンネル 1. param src2: 入力チャンネル 2. param src3: 入力チャンネル 3. param dst: 最終的に作成される出力配列.
関数 cvMerge は, Split とは逆の操作を行います.出力配列が N チャンネルを持ち,引数の最初の N 個のチャンネルが NULL ではない場合,すべてのチャンネルがコピーされます.引数の最初の N 個のチャンネルのうち1つだけが NULL ではない場合,そのチャンネルだけが出力配列にコピーされます.そのどちらでもない場合([NULL,NULL,NULL,NULL],[NULL,notNULL,notNULL,NULL]など),エラーとなります.残りの(N 番目以降の)入力チャンネルは,常に NULL でなければいけません.COI を設定した IplImage 画像に 1 つのチャンネルを挿入するためには, Copy を利用することもできます.
2 つの配列の要素同士で小さい方を求めます.
パラメタ: |
|
---|
この関数は,2 つの配列の各要素を比較して小さい方を求めます:
すべての入力配列は シングルチャンネルで,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません.
配列(部分配列)の要素の最大値と最小値を求めます.
パラメタ: |
|
---|
この関数は,配列の要素の最大・最小値とその位置を求めます.それぞれの値を求めるためにスキャンされる領域は,画像全体あるいはセットされた ROI ( IplImage の場合), また mask が NULL ではない場合は,指定された部分配列領域です.もし,入力がマルチチャンネル配列ならば,それは COI が設定された IplImage 型でなければいけません. 入力が 2 次元配列の場合,極値の座標が minLoc->x と maxLoc->x に格納されます.
配列の各要素とスカラ値を比較して小さい方を求めます.
パラメタ: |
|
---|
この関数は,配列の各要素とスカラ値を比較して大きい方を求めます:
すべての入力配列は シングルチャンネルで,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません.
入力配列から出力配列へ,指定された(複数の)チャンネルをコピーします.
パラメタ: |
|
---|
この関数は, Split , Merge および CvtColor などの形式を一般化したものです. 色平面の順番の変更,アルファチャンネルの追加や削除,1 つあるいは複数の色平面の挿入や抽出,などに利用することができます.
例として,4 チャンネル RGBA 画像を,3チャンネル BGR 画像(つまり,R と B の交換)とアルファチャンネル画像の 2 つに分離するコードを示します:
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);
cvSet(rgba, cvScalar(1,2,3,4));
CvArr* out[] = { bgr, alpha };
int from_to[] = { 0,2, 1,1, 2,0, 3,3 };
cvMixChannels(&bgra, 1, out, 2, from_to, 4);
2 つの配列の要素毎の積を求めます.
パラメタ: |
|
---|
この関数は,2 つの配列要素毎の積を計算します:
すべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します.
2つのフーリエ・スペクトルの,要素毎の積を求めます.
パラメタ: |
|
---|
この関数は,2つの CCS-packed 形式の配列 または 複素行列の,要素毎の掛け算を行います. この 2 つの行列は,実数あるいは複素数のフーリエ変換の結果です.
この関数と関数 DFT を利用することで,2 つの配列の畳み込みを高速に計算することができます.
行列とその行列の転置行列の積を求めます.
パラメタ: |
|
---|
この関数は,src とその転置行列の積を求めます:
この関数は,以下のように計算を行います.もし の場合は,
そうでない場合は,
配列の絶対値ノルム,絶対値差分ノルム,相対値差分ノルムを求めます.
パラメタ: |
|
---|
この関数は, arr2 が NULL の場合は arr1 の絶対値ノルムを計算します:
arr2 が NULL でない場合は,絶対値差分ノルムが計算されます:
または, arr2 が NULL でなく,かつ (normType & CV_RELATIVE) != 0 である場合は相対値差分ノルムが計算されます:
この関数は,求めたノルムを返します.マルチチャンネル配列は,シングルチャンネル配列として扱われます.つまり,すべてのチャンネルに対する処理結果が合計されます.
2 つの配列の要素毎に,ビット単位の論理和を計算します.
パラメタ: |
|
---|
この関数は,2 つの配列の要素毎にビット単位の論理和を計算します:
dst(I)=src1(I)|src2(I)
浮動小数点型配列の場合は,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ種類,同じサイズ(または ROI サイズ)でなければいけません.
スカラ値と配列の要素毎に,ビット単位の論理和を計算します.
パラメタ: |
|
---|
この関数は,スカラ値と配列要素ごとに,ビット単位の論理和を計算します:
dst(I)=src(I)|value if mask(I)!=0
実際の計算の前に,スカラ値は配列と同じ型に変換されます.また,浮動小数点型配列の場合は,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ種類,同じサイズ(または ROI サイズ)でなければいけません.
ベクトルの透視投影変換を行います.
パラメタ: |
|
---|
この関数は,配列 src の各要素(2 次元,あるいは 3 次元のベクトルとして扱われます)を以下のように変換します:
ここで,
また,
となります.
極座標系で表現された 2 次元ベクトルを,カーテシアン(デカルト)座標系表現に変換します.
パラメタ: |
|
---|
この関数は,各ベクトル magnitude(I)*exp(angle(I)*j), j=sqrt(-1) の x 座標,y 座標 を求めます:
x(I)=magnitude(I)*cos(angle(I)),
y(I)=magnitude(I)*sin(angle(I))
各配列要素をそれぞれ指定された値で累乗します.
パラメタ: |
|
---|
この関数は,入力配列の各要素を power 乗します:
つまり,指数 power が整数ではない場合は,入力配列要素の絶対値が計算に用いられます.しかし,入力要素が負の場合でも,いくつか処理を追加すると正しい結果を得ることができます.以下に,配列要素それぞれの立方根を求めるサンプルを示します:
CvSize size = cvGetSize(src);
CvMat* mask = cvCreateMat(size.height, size.width, CV_8UC1);
cvCmpS( src, 0, mask, CV_CMP_LT ); /* 負の配列要素を見つけます. */
cvPow(src, dst, 1./3);
cvSubRS( dst, cvScalarAll(0), dst, mask ); /* 負の入力値に対する結果の正負を反転します. */
cvReleaseMat(&mask);
power が整数値や 0.5,-0.5 などの特別な値の場合は,より高速なアルゴリズムが用いられます.
インデックスで指定された配列要素へのポインタを返します.
パラメタ: |
|
---|
この関数は,指定された配列要素へのポインタを返します.配列の次元数は,関数に渡されるインデックスの個数と一致していなければいけません.ただし,関数 cvPtr1D は,1次元,2次元,...,N次元の密な配列に対しても(シーケンシャルアクセスするために)利用できます.
この関数は,疎な配列に対しても同様に利用できます.指定したノードが存在しない場合,新たにノードを生成し 0 をセットします.
また,配列要素にアクセスする他の関数( Get , GetReal , Set , SetReal )と同様に,要素インデックスが範囲外であればエラーになります.
乱数生成器を初期化します.
パラメタ: |
|
---|
この関数は乱数生成器を初期化し,その状態を表す構造体を返します.その状態構造体へのポインタが,関数 RandInt , RandReal , RandArr に渡されます.現在の実装では,繰り上げ付き乗算アルゴリズム(multiply-with-carry)が利用されています.
配列を乱数で埋め,RNG の状態を更新します.
パラメタ: |
|
---|
この関数は,一様分布した乱数,あるいは正規分布した乱数を用いて出力配列を埋めます.
以下の例では,この関数を利用して,正規分布した浮動小数点の値を,2 次元配列内のランダム位置にある値に足し合わせています.
/* noisy_screenは,「めやくちゃな」値の浮動小数点型 2 次元配列とします */
CvRNG rng_state = cvRNG(0xffffffff);
int i, pointCount = 1000;
/* 2次元点の座標の配列を確保します */
CvMat* locations = cvCreateMat(pointCount, 1, CV_32SC2);
/* 2次元点のランダム値の配列を確保します */
CvMat* values = cvCreateMat(pointCount, 1, CV_32FC1);
CvSize size = cvGetSize(noisy_screen);
/* 座標配列を初期化します */
cvRandArr(&rng_state, locations, CV_RAND_UNI, cvScalar(0,0,0,0),
cvScalar(size.width,size.height,0,0));
/* 値を生成します */
cvRandArr(&rng_state, values, CV_RAND_NORMAL,
cvRealScalar(100), // 輝度値の平均
cvRealScalar(30) // 輝度値の標準偏差
);
/* 2 次元点をセット */
for(i = 0; i < pointCount; i++ )
{
CvPoint pt = *(CvPoint*)cvPtr1D(locations, i, 0);
float value = *(float*)cvPtr1D(values, i, 0);
*((float*)cvPtr2D(noisy_screen, pt.y, pt.x, 0 )) += value;
}
/* テンポラリ配列を忘れずに解放します */
cvReleaseMat(&locations);
cvReleaseMat(&values);
/* RNG 状態構造体は解放する必要がありません */
32 ビット符号なし整数型の乱数を返し,RNG の状態を更新します.
パラメタ: |
|
---|
この関数は,一様分布に従う 32 ビット符号なし整数型の乱数を返し,RNG の状態を更新します.これは,C言語のランタイムライブラリの rand() 関数に類似しています.しかし,rand() が 0 から RAND_MAX ( または ,プラットホームに依存)までの値を返すの対して,この関数では常に 32 ビットの値を生成します.
この関数は,点座標,領域サイズ,テーブルインデックスなどの乱数値を生成するのに用いることができます.特定範囲内の整数は剰余演算によって生成でき,特定範囲内の浮動小数点数は,値の範囲を 0...1 にスケーリングするように割算することで生成できます.
RandInt を利用して,前述の例を書き直したものを以下に示します:
/* 入力値と内容は以前のサンプルと同じです */
CvRNG rnggstate = cvRNG(0xffffffff);
int i, pointCount = 1000;
/* ... - ここでは配列の確保を行いません */
CvSize size = cvGetSize(noisygscreen);
/* 呼び出しのオーバヘッドを減らすために正規分布に従う値のバッファを生成します */
#define bufferSize 16
float normalValueBuffer[bufferSize];
CvMat normalValueMat = cvMat(bufferSize, 1, CVg32F, normalValueBuffer);
int valuesLeft = 0;
for(i = 0; i < pointCount; i++ )
{
CvPoint pt;
/* ランダムな座標を生成します */
pt.x = cvRandInt(&rnggstate )
pt.y = cvRandInt(&rnggstate )
if(valuesLeft <= 0 )
{
/* バッファが空の場合,正規分布に従う値でバッファを埋めます */
cvRandArr(&rnggstate, &normalValueMat, CV_RAND_NORMAL,
cvRealScalar(100), cvRealScalar(30));
valuesLeft = bufferSize;
}
*((float*)cvPtr2D(noisygscreen, pt.y, pt.x, 0 ) =
normalValueBuffer[--valuesLeft];
}
/* 行列のヘッダとデータはスタック上に存在するため,normalValueMat を
解放する必要はありません.これは小さい固定サイズの行列を扱う際の,
効果的で有名な手法です */
浮動小数点型の乱数を返し,RNG の状態を更新します.
パラメタ: |
|
---|
この関数は,0 から 1 の範囲(1自身は含まれない)の一様分布に従う浮動小数点型の乱数を返します.
行列をベクトルに変換します.
パラメタ: |
|
---|
この関数は,入力行列の各行(あるいは各列)を 1 次元ベクトルの集合として扱い,その集合に対して指定された処理を行うことで行列をベクトルに変換します.例えば,ラスタ画像の水平,垂直方向への射影を計算することができます. CV_REDUCE_SUM や CV_REDUCE_AVG の場合は,計算精度を保つために(桁溢れしないように)出力ベクトル要素のビット深度を入力よりも大きくとるべきです.また,これらの 2 つのモードの場合は,マルチチャンネル画像を扱うこともできます.
この関数は,配列データを解放します.配列が CvMat や CvMatND の場合は,単に cvDecRefData() が呼ばれます.つまり,この関数は外部のデータを解放することはできません. CreateData の注意事項も参照してください.
この関数呼び出しは,以下の形式を短縮したものです.
if(*image )
{
cvReleaseData(*image);
cvReleaseImageHeader(image);
}
この関数呼び出しは,以下の形式に似ています.
if(image )
{
iplDeallocate(*image, IPL_IMAGE_HEADER | IPL_IMAGE_ROI);
*image = 0;
}
しかし,この関数はデフォルトでは IPL の関数を利用しません(マクロ CV_TURN_ON_IPL_COMPATIBILITY を参照してください).
この関数は,行列データの参照カウンタをデクリメントし,行列ヘッダを解放します.データの参照カウンタが 0 になった場合は,そのデータも解放されます.
if(*mat )
cvDecRefData(*mat);
cvFree((void**)mat);
この関数は,配列データの参照カウンタをデクリメントし,配列ヘッダを解放します.データの参照カウンタが 0 になった場合は,そのデータも解放されます.
if(*mat )
cvDecRefData(*mat);
cvFree((void**)mat);
疎な配列を解放します.
パラメタ: |
|
---|
この関数は,疎な配列を解放し,関数の終了時に配列ポインタをクリアします.
コピー元配列を用いて,コピー先配列をタイル状に埋めます.
パラメタ: |
|
---|
この関数は,コピー元配列を繰り返しコピーして,コピー先配列を埋めます:
dst(i,j)=src(i mod rows(src), j mod cols(src))
コピー先配列は,コピー元配配列より大きくても小さくても構いません.
画像全体が操作対象となるように ROI をリセットして,ROI 構造体を解放します.
パラメタ: |
|
---|
これは,以下の操作に似ています. しかし,この関数ではさらに ROI 構造体を解放することができます.
cvSetImageROI(image, cvRect(0, 0, image->width, image->height ));
cvSetImageCOI(image, 0);
データをコピーせずに行列/画像の形状を変更します.
パラメタ: |
|
---|
この関数は,与えられた配列を元に CvMat ヘッダを初期化します.これは,元の配列とは異なる形状(チャンネル数や行数が異なる)で,元の配列と同じデータへのポインタを持つ新しい配列ヘッダとなります.
例えば,次のコードでは,1 つの画像とそれに対する 2 つの画像ヘッダ(320x240x3,960x240x1)を作成します:
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);
そして,次の例では,3x3 の行列を 1x9 のベクトルに変換しています:
CvMat* mat = cvCreateMat(3, 3, CV_32F);
CvMat row_header, *row;
row = cvReshape(mat, &row_header, 0, 1);
データをコピーせずに多次元配列の形状を変更します.
#define cvReshapeND(arr, header, newCn, newDims, newSizes ) \
cvReshapeMatND((arr), sizeof(*(header)), (header), \
(newCn), (newDims), (newSizes))
param arr: 入力配列. param sizeofHeader: 出力されるヘッダのサイズ,IplImage,CvMat, CvMatND を区別するために用いられます. param header: 出力される新しいヘッダ. param newCn: 新しいチャンネル数. の場合は,チャンネル数は変更されません. param newDims: 新しい次元数. の場合は,次元数は変更されません. param newSizes: 新しい次元数,を要素とする配列.要素の総数は変化してはいけないので, 個の値のみが利用されます.したがって, の場合は,配列 newSizes は利用されません.
この関数は, Reshape の拡張バージョンです.この関数は,多次元配列を扱うことができ(普通の画像と行列も扱えます),次元数を変更する事も可能です.
Reshape の項で説明した2つのサンプルを, ReshapeMatND を用いて書き直すと次のようになります:
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 = (CvMat*)cvReshapeND(mat, &row_header, 0, 1, 0);
浮動小数点型の値を整数型の値に変換します.
パラメタ: |
|
---|
関数 cvRound , cvFloor , cvCeil は,それぞれの丸め方を用いて,浮動小数点型の入力値を整数型に変換します. cvRound は,入力値に最も近い整数値を返します. cvFloor は,入力値より大きくない最大の整数値を返します. cvCeil は,入力値より小さくない最小の整数値を返します. これらの関数は,(処理系によっては)C言語の標準キャスト関数よりも大幅に高速に動作します. 入力値の絶対値が よりも大きければ,処理結果は不定です.また,特別な値( , NaN )は扱うことができません.
スケーリングされた配列ともう1つの配列の和を求めます.
パラメタ: |
|
---|
この関数は,スケーリングされた配列ともう 1 つの配列の和を求めます:
すべての入出力配列は,同じ型,同じサイズでなければいけません.
配列の各要素に与えられた値をセットします.
パラメタ: |
|
---|
この関数は,スカラ値 value を,配列の指定された要素すべてにコピーします:
配列 arr が, IplImage 型である場合,ROI は利用されますが COI を設定してはいけません.
インデックスで指定された配列要素を変更します.
パラメタ: |
|
---|
これらの関数は,指定した配列要素に新しい値を割り当てて変更します.疎な配列の場合に指定ノードが存在しなければ,新たにノードを生成します.
ユーザデータを配列のヘッダに割り当てます.
パラメタ: |
|
---|
この関数は,ユーザデータを配列のヘッダに割り当てます.このヘッダは,関数 cvCreate*Header , cvInit*Header あるいは Mat (行列の場合)を用いて,あらかじめ初期化しておく必要があります.
行列をスカラ倍された単位行列として初期化します.
パラメタ: |
|
---|
この関数は,行列をスカラ倍された単位行列として初期化します:
IplImage に COI を設定します.
パラメタ: |
|
---|
ROI が NULL に設定されており,COI が 0 ではない 場合,COIが確保されます. ほとんどの OpenCV の関数は,COI をサポート しません .よって,画像や行列のそれぞれのチャンネルを処理する場合, チャンネルを( Copy や Split によって)別々の画像や行列にコピーしてから処理を行い, 必要ならばその結果を( Copy や Merge によって)再びコピーして戻します.
与えられた矩形領域を,画像の ROI として設定します.
パラメタ: |
|
---|
元の画像の ROI が NULL であり rect が画像全体ではない場合,ROI 構造体が確保されます.
ほとんどの OpenCV の関数が ROI をサポートしており,矩形の部分画像を別の画像として扱うことができます.例えば,すべてのピクセル座標は,元画像の原点からではなく,ROI の原点(左上あるいは左下)からカウントされます.
インデックスで指定された配列要素を変更します.
パラメタ: |
|
---|
.}
この関数は,シングルチャンネル配列の指定した要素に新しい値を割り当てて変更します.配列がマルチチャンネルのときは,ランタイムエラーが発生します.関数 Set*D は,シングルチャンネルとマルチチャンネルの配列に対して安全に使用することができますが,若干処理速度が遅いことに注意してください.
疎な配列の場合に指定ノードが存在しなければ,新たにノードを生成します.
#define cvZero cvSetZero
param arr: クリアされる配列.
この関数は,配列をクリアします.密な配列(CvMat,CvMatND,IplImage)に対する cvZero(array) は,cvSet(array,cvScalarAll(0),0) と等価です. 疎な配列の場合は,すべての要素が削除されます.
連立一次方程式,あるいは最小二乗問題を解きます.
パラメタ: |
|
---|
この関数は,連立一次方程式あるいは最小二乗問題を解きます(後者は,SVD によって求められます):
CV_LU の手法が用いられる場合, src1 が正則行列であれば 1 を返し,そうでなければ 0 を返します. 後者の場合, dst の値は有効なものではありません.
三次方程式の実根を求めます.
パラメタ: |
|
---|
この関数は,3 次方程式の実根を求めます:
coeffs が 4 要素のベクトルである場合:
coeffs が 3 要素のベクトルである場合:
この関数は,求めた実根の個数を返し,その実根は root 配列に格納されます.実根が1つだけの場合,配列の残りの要素は 0 で埋められます.
マルチチャンネル配列を複数のシングルチャンネル配列に分割します.または,配列から 1 つのチャンネルだけを抜き出します.
パラメタ: |
|
---|
この関数は,マルチチャンネル配列を複数のシングルチャンネル配列に分割します.この操作には 2 つのモードが存在します. 入力配列が N チャンネルで,引数の最初の N 個のチャンネルが NULL ではない場合,すべてのチャンネルが抜き出されます. 引数の最初の N 個のチャンネルのうち1つだけが NULL ではない場合,そのチャンネルだけが抜き出されます. そのどちらでもない場合([NULL,NULL,NULL,NULL],[NULL,notNULL,notNULL,NULL]など),エラーとなります. 残りの出力チャンネル(最初のN個より後ろ)は,常にNULLでなければいけません. COI を設定した IplImage 画像から1つのチャンネルを抜き出すためには, Copy を利用することもできます.
平方根を求めます.
パラメタ: |
|
---|
この関数は,引数で与えられた入力値の平方根を求めます.入力値が負の場合は,処理結果は不定です.
2 つの配列の要素毎の差を求めます.
パラメタ: |
|
---|
この関数は,1 つの配列からもう 1 つの配列を引きます:
dst(I)=src1(I)-src2(I) if mask(I)!=0
マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します.
スカラ値から配列要素を引きます.
パラメタ: |
|
---|
この関数は,スカラ値から入力配列の各要素を引きます:
dst(I)=value-src(I) if mask(I)!=0
マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します.
配列からスカラ値を引きます.
パラメタ: |
|
---|
この関数は,入力配列の各要素からスカラ値を引きます:
dst(I)=src(I)-value if mask(I)!=0
マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します.
関数 cvSum は,各チャンネルごとに配列要素値の総和 S を求めます:
配列が IplImage で COI が設定されている場合,この関数は指定されたチャンネルのみを処理し,その結果を戻り値の CvScalar の 1 番目の要素 に格納します.
特異値の後退代入を行います.
パラメタ: |
|
---|
この関数は,特異値分解された行列 A ( SVD の説明を参照してください)と行列 B に対して後退代入を行います:
ここで,
なお, は,行列のデータ型に依存する微小な値です.
この関数は, Invert や Solve の内部で SVD と共に用いられます.これらの「低レベルな」関数( SVD と SVBkSb )を用いる状況があるとすれば,これらに対応する高レベルな関数( Invert と Solve )内部でのテンポラリな行列の確保を避けるためでしょう.
浮動小数点型の実数行列の特異値分解を行います.
パラメタ: |
|
---|
この関数は,行列 A を 1 つの対角行列と 2 つの直交行列の積に分解します:
ここで は,特異値を対角要素にもつ対角行列であり,特異値を要素とする1次元ベクトルとして表現する事もできます. すべての特異値は非負であり,( と の列と共に)降順にソートされます.
SVD アルゴリズムは,数値的に安定しており,その典型的な応用例には以下のものがあります:
各配列要素に対して,行列変換を行います.
パラメタ: |
|
---|
この関数は,配列 src の各要素に行列変換を施し,その結果を dst に代入します:
つまり, N チャンネル配列 src の各要素を N 個の要素を持つベクトルとして扱い, の変換行列 transmat と並進ベクトル shiftvec によって変換した結果を, M チャンネル配列 dst の要素に格納します. 同次座標系の場合, transmat は の行列であり,最右列は並進ベクトルとして扱われます.
入出力配列は共に,同じビット深度,同じサイズ(同じ ROI サイズ)でなければいけません.また, transmat と shiftvec は,その要素が浮動小数点型実数でなくていけません.
この関数は,n-次元の点群の幾何学変換,色空間における任意の線形変換,チャンネルの入れ替えなどに利用できます.
この関数は,入力行列 src1 を転置します:
複素行列の場合,複素数の共役化は行われないので,これとは別に行う必要があることに注意してください:この例として, XorS のサンプルコードを参照してください.
2つの配列の要素毎に,ビット単位の排他的論理和を計算します.
パラメタ: |
|
---|
この関数は,2つの配列の要素毎にビット単位の排他的論理和を計算します:
dst(I)=src1(I)^src2(I) if mask(I)!=0
実際の計算の前に,スカラ値は配列と同じ型に変換されます.また,浮動小数点型配列の場合は,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません.
スカラ値と配列の要素毎に,ビット単位の排他的論理和を計算します.
パラメタ: |
|
---|
この関数は,スカラ値と配列要素毎に,ビット単位の論理和を計算します:
dst(I)=src(I)^value if mask(I)!=0
実際の計算の前に,スカラ値は配列と同じ型に変換されます.また,浮動小数点型配列の場合は,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません.
以下のサンプルは,虚部の最上位ビットを反転することで共役複素ベクトルを求める方法を示しています:
float a[] = { 1, 0, 0, 1, -1, 0, 0, -1 }; /* 1, j, -1, -j */
CvMat A = cvMat(4, 1, CV_32FC2, &a);
int i, negMask = 0x80000000;
cvXorS(&A, cvScalar(0, *(float*)&negMask, 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)
シングルチャンネルの浮動小数点型行列の指定された要素を返します.
パラメタ: |
|
---|
この関数は, GetReal2D の高速バージョンで,シングルチャンネルの浮動小数点型行列に対してのみ利用できます.これは,インライン展開,配列や要素の種類チェックが最小限,行と列の範囲チェックはデバックモード時のみ,といった理由で高速に動作します.
シングルチャンネル,浮動小数点型行列の指定された要素を変更します.
パラメタ: |
|
---|
この関数は, SetReal2D の高速バージョンで,シングルチャンネルの浮動小数点型行列に対してのみ利用できます.これは,インライン展開,配列や要素の種類チェックが最小限,行と列の範囲チェックはデバックモード時のみ,といった理由で高速に動作します.