各行列要素の絶対値を求めます.
Parameter: | src – 行列または行列表現 |
---|
abs はメタ関数であり, absdiff() の一形式に拡張されます:
出力行列は,入力行列と同じサイズ同じ型(最後の場合を除きます.ここでは, C は depth=CV_8U となります).
参考: Matrix Expressions , absdiff() ,
2つの配列同士,あるいは配列とスカラの 要素毎の差の絶対値を求めます.
パラメタ: |
|
---|
関数 absdiff は,以下を求めます:
2つの配列の差の絶対値
あるいは,配列とスカラの差の絶対値
ここで I は,配列要素の多次元インデックスを表します.
マルチチャンネル配列の場合,各チャンネルは個別に処理されます.
参考: abs() ,
2つの配列同士,あるいは配列とスカラの 要素毎の和を求めます.
パラメタ: |
|
---|
関数 add は,以下を求めます:
2つの配列の和:
あるいは,配列とスカラの和
ここで I は,配列要素の多次元インデックスを表します.
上述のリストの最初の関数は,行列表現を用いて置き換えることができます:
dst = src1 + src2;
dst += src1; // add(dst, src1, dst); と等価
マルチチャンネル配列の場合,各チャンネルは個別に処理されます.
参考: subtract() , addWeighted() , scaleAdd() , convertScale() , Matrix Expressions , .
2つの配列の重み付き和を求めます.
パラメタ: |
|
---|
関数 addWeighted は,2つの配列の重み付き和を次のように求めます:
ここで I は,配列要素の多次元インデックスを表します.
最初の関数は,行列表現を用いてで置き換えることができます:
dst = src1*alpha + src2*beta + gamma;
マルチチャンネル配列の場合,各チャンネルは個別に処理されます.
参考: add() , subtract() , scaleAdd() , convertScale() , Matrix Expressions , .
2つの配列同士,あるいは配列とスカラの ビット毎の論理積を求めます.
パラメタ: |
|
---|
関数 bitwise_and は,各要素のビット毎の論理積を求めます:
2つの配列同士:
配列とスカラ:
浮動小数点型配列の場合は,マシン固有のビット表現(通常は,IEEE754準拠)が処理に利用されます.また,マルチチャンネル配列の場合,各チャンネルは個別に処理されます.
参考: , ,
配列の各ビットを反転します.
パラメタ: |
|
---|
関数 bitwise_not は,入力配列の各要素の各ビットを反転します:
浮動小数点型配列の場合は,マシン固有のビット表現(通常は,IEEE754準拠)が処理に利用されます.また,マルチチャンネル配列の場合,各チャンネルは個別に処理されます.
参考: , ,
2つの配列同士,あるいは配列とスカラの ビット毎の論理和を求めます.
パラメタ: |
|
---|
関数 bitwise_or は,各要素のビット毎の論理和を求めます:
2つの配列同士:
配列とスカラ:
浮動小数点型配列の場合は,マシン固有のビット表現(通常は,IEEE754準拠)が処理に利用されます.また,マルチチャンネル配列の場合,各チャンネルは個別に処理されます.
参考: , ,
2つの配列同士,あるいは配列とスカラの ビット毎の排他的論理和を求めます.
パラメタ: |
|
---|
関数 bitwise_xor は,各要素のビット毎の排他的論理和を求めます:
2つの配列同士:
配列とスカラ:
浮動小数点型配列の場合は,マシン固有のビット表現(通常は,IEEE754準拠)が処理に利用されます.また,マルチチャンネル配列の場合,各チャンネルは個別に処理されます.
参考: , ,
ベクトル集合の共分散行列を求めます.
パラメタ: |
|
---|
関数 calcCovarMatrix は,共分散行列を求め,またオプションとして入力ベクトル集合の平均ベクトルを計算します.
参考: PCA() , mulTransposed() , Mahalanobis()
2次元ベクトルの角度と大きさを求めます.
パラメタ: |
|
---|
関数 cartToPolar は,2次元ベクトル集合 (x(I),y(I)) それぞれの大きさと角度のどちらか片方,あるいは両方を求めます:
角度は, の精度で求められます. (0,0) の場合,その角度は 0 になります.
入力配列の各要素が有効な値であるかどうかをチェックします.
パラメタ: |
|
---|
関数 checkRange は,配列の各要素が NaN あるいは ではないことをチェックします. minVal < -DBL_MAX かつ maxVal < DBL_MAX である場合,この関数は各値が minVal から maxVal の範囲に収まっているかどうかもチェックします.マルチチャンネル配列の場合は,各チャンネルは個別に処理されます.もし範囲外の値があれば,その最初の外れ値の位置が pos に保存され( の場合),関数は false を返す( quiet=true の場合)か,例外を投げます.
2つの配列同士,あるいは配列とスカラの各要素を比較します.
パラメタ: |
|
---|
関数 compare は, src1 の各要素と,それに対応する src2 の要素,あるいは実数のスカラ値 value とを比較します. 比較結果が真ならば,出力配列の対応する要素が 255 にセットされ,そうでなければ 0 にセットされます:
この比較と等価な処理を,行列表現を用いて表すことも出来ます:
Mat dst1 = src1 >= src2;
Mat dst2 = src1 < 8;
...
参考: checkRange() , min() , max() , threshold() , Matrix Expressions
正方行列の上半分または下半分を,もう半分の側にコピーします.
パラメタ: |
|
---|
関数 completeSymm は,正方行列の下半分または上半分を逆側の半分にコピーします.このとき,行列の対角成分は,変更されずにそのまま残ります.
参考: flip() , transpose()
スケーリング後,絶対値を計算し,結果を結果を 8 ビットに変換します.
パラメタ: |
|
---|
関数 convertScaleAbs は,入力配列の各要素に対して連続した三つの処理を施します:スケーリング,絶対値の計算,符号なし8ビット型への変換:
マルチチャンネル配列の場合,関数は各チャンネルを個別に処理します.出力が8ビットでない場合は, Mat::convertTo メソッドを呼び出して(あるいは行列を用いて処理し),さらに結果の絶対値を求めることで同等の処理が可能です.例えば:
Mat_<float> A(30,30);
randu(A, Scalar(-100), Scalar(100));
Mat_<float> B = A*5 + 3;
B = abs(B);
// Mat_<float> B = abs(A*5+3) でも同じことができますが
// その場合,テンポラリ行列が確保されます.
参考: Mat::convertTo() , abs()
0 ではない配列要素を数えます.
Parameter: | mtx – シングルチャンネルの配列 |
---|
関数 cvCountNonZero は,mtx 内の 0 ではない要素の数を返します:
参考: mean() , meanStdDev() , norm() , minMaxLoc() , calcCovarMatrix()
引数の3乗根を求めます.
Parameter: | val – この関数の引数 |
---|
関数 cubeRoot は, を求めます.負の値も正しく扱うことができますが, NaN や は扱えません.精度は,単精度データに対して可能な最大精度とほぼ等しくなります.
CvMat, IplImage または CvMatND を cv::Mat に変換します.
パラメタ: |
|
---|
関数 cvsrcToMat は, CvMat , IplImage または CvMatND のヘッダを Mat() のヘッダに変換します.その際に,オプションとして内部データを複製することもできます.作成されたヘッダは,この関数の戻り値となります.
copyData=false の場合,変換は非常に高速に(O(1)の定数時間で)行われ,新たに作成された行列ヘッダは refcount=0 となります. これは,行列データに対して参照カウントが行われないことを意味するので,ユーザは新しいヘッダが解放されるまでの間データを保持しておく必要があります.つまり,
cvsrcToMat(src, true) cvsrcToMat(src, false).clone() (COIはセットされていないものとします).この関数は,新しい形式のデータ構造を内部的に利用するためにデータを移行するコード内部で, CvArr の枠組みをサポートする一貫した方法を提供します.また, Mat() から CvMat や IplImage への逆変換は,単純な代入によって行うことができます:
CvMat* A = cvCreateMat(10, 10, CV_32F);
cvSetIdentity(A);
IplImage A1; cvGetImage(A, &A1);
Mat B = cvarrToMat(A);
Mat B1 = cvarrToMat(&A1);
IplImage C = B;
CvMat C1 = B1;
// A, A1, B, B1, C, C1 は
// 同じ 10x10 の浮動小数点型配列に対する別々のヘッダ.
// C, C1 を OpenCV の関数に渡す場合には
// "&" が必要なことに注意してください.例えば:
printf("
この関数は通常,古い形式の2次元配列( CvMat や IplImage )を Mat に変換するために利用されますが,入力として CvMatND を受け取り,可能ならばそこから Mat() を作成することもできます.ある CvMatND A において,すべて(そ れが1次元でも可)の次元 i, 0 < i < A.dims に対して A.dim[i].size*A.dim.step[i] == A.dim.step[i-1] の場合に限り変換が可能です.つまり,行列データは連続であるか,連続した行列のシーケンスとして表現可能なものでなくてはいけません.この関数をこの様に使うことで, CvMatND に任意の要素単位の処理関数を適用できます.しかし,フィルタリング関数のような,より複雑な処理ではうまく動作しないので,コンストラクタを利用して CvMatND を MatND() に変換する必要があります.
最後のパラメータ coiMode は,COI が設定された画像の扱い方を指定します:デフォルト値である 0 の場合,COI が設定された画像が入力されると関数はエラーを発生させます. coiMode=1 は,エラーが起こらないことを意味するので,ユーザは COI が設定されているかどうかをチェックして,それを手動で処理しなければいけません. Mat() や MatND() などの新しい構造体は,COI をネイティブにはサポートしていません.新しい形式の配列の個々のチャンネルを処理するためには,(例えば,行列のイテレータを利用して)配列を横断するループを作り COI を処理するか,あるいは mixChannels() (新しい形式用)や extractImageCOI() (古い形式用)を用いて COI を抽出し,その個々のチャンネルを処理した後,必要ならば( mixChannel() や insertImageCOI() を用いて)出力配列の中に戻す,といった手段が必要になります.
参考: cvGetImage() , cvGetMat() , cvGetMatND() , extractImageCOI() , insertImageCOI() , mixChannels()
1次元あるいは2次元の配列に対して,離散コサイン変換または逆変換を行います.
パラメタ: |
|
---|
関数 dct は,1次元または2次元の浮動小数点型配列に対して離散コサイン変換(DCT)または逆変換を行います:
要素の1次元ベクトルのコサイン変換:
ここで
また に対して , です.
要素の1次元ベクトルの逆コサイン変換:
( は対角行列なので, となります)
の行列のコサイン変換:
の行列の逆コサイン変換:
この関数は,フラグと入力配列のサイズを見て処理モードを選択します:
重要な注意 :現在の cv::dct は,偶数サイズの配列(2, 4, 6 ...)をサポートしています.データ分析や近似の際には,必要ならば配列にダミーの値を詰めてサイズを調整できます.
また,この関数の性能は配列のサイズに非常に依存します(が,単調依存ではありません).これに関しては getOptimalDFTSize() を参照してください.現在の実装では,サイズ N のベクトルの DCT は, N/2 サイズの DFT を介して計算されます.よって,最適な DCT サイズ は以下のように求めることができます:
size_t getOptimalDCTSize(size_t N) { return 2*getOptimalDFTSize((N+1)/2); }
参考: dft() , getOptimalDFTSize() , idct()
1次元あるいは2次元の配列に対して,離散フーリエ変換または逆変換を行います.
パラメタ: |
|
---|
要素の1次元ベクトルのフーリエ変換:
ここで , 要素の1次元ベクトルの逆フーリエ変換:
ここで の2次元ベクトルのフーリエ変換:
の2次元ベクトルの逆フーリエ変換:
実数(シングルチャンネル)データの場合,フーリエ変換の結果や逆フーリエ変換の入力を表すために,IPL で利用されていた CCS (複素共役対称)と呼ばれるパックされた形式が利用されます:
1次元の実数ベクトルの変換の場合,出力は上述の行列の1行目のようになります.
また,この関数は,フラグと入力配列のサイズに依存する処理モードを選択します:
もし DFT_SCALE がセットされていれば,変換後にスケーリングが行われます.
dct() とは異なり,この関数は任意サイズの配列をサポートしますが,効率的に処理できるのは,小さい素数(現在の実装では 2, 3, 5)の積で量子化されたサイズの配列のみです.このような効率的な DFT サイズは, getOptimalDFTSize() メソッドを用いて求めることができます.
ここでは,DFT を利用した実数の2次元配列の畳み込み計算の方法を示します:
void convolveDFT(const Mat& A, const Mat& B, Mat& C)
{
// 必要なら出力配列の再割り当てを行います.
C.create(abs(A.rows - B.rows)+1, abs(A.cols - B.cols)+1, A.type());
Size dftSize;
// DFT変換のサイズを計算します.
dftSize.width = getOptimalDFTSize(A.cols + B.cols - 1);
dftSize.height = getOptimalDFTSize(A.rows + B.rows - 1);
// テンポラリバッファを確保し,0で初期化します
Mat tempA(dftSize, A.type(), Scalar::all(0));
Mat tempB(dftSize, B.type(), Scalar::all(0));
// A と B をそれぞれ tmpA と tmpB の左上の角にコピーします.
Mat roiA(tempA, Rect(0,0,A.cols,A.rows));
A.copyTo(roiA);
Mat roiB(tempB, Rect(0,0,B.cols,B.rows));
B.copyTo(roiB);
// パックされた A と B を変換し置換します.
// 処理を高速化するために "nonzeroRows" を利用します.
dft(tempA, tempA, 0, A.rows);
dft(tempB, tempB, 0, B.rows);
// スペクトルの積を求めます;
// この関数は,スペクトルのパックされた表現を扱うことができます.
mulSpectrums(tempA, tempB, tempA);
// 結果を周波数領域から逆変換します.
// すべての行が 0 でないとしても
// 必要なのは C.rows だけなので
// nonzeroRows == C.rows を渡します.
dft(tempA, tempA, DFT_INVERSE + DFT_SCALE, C.rows);
// 結果をコピーして C に戻します.
tempA(Rect(0, 0, C.cols, C.rows)).copyTo(C);
// すべてのテンポラリバッファは自動的に解放されます.
}
上述のサンプルで,最適化できる箇所はどこでしょうか?
上記の改良はすべて, matchTemplate() と filter2D() に実装されているので,これらの関数を用いると,上述の理論的に最適な実装を利用するよりも良い性能を得られます(これら2つの関数は実際には畳み込みではなく相互相関を計算するので, flip() を利用してカーネルか画像をその中心で「反転」させる必要があります).
参考: dct() , getOptimalDFTSize() , mulSpectrums() , filter2D() , matchTemplate() , flip() , cartToPolar() , magnitude() , phase()
2つの配列同士,あるいは配列とスカラの 要素毎の商を求めます.
パラメタ: |
|
---|
関数 divide は,ある配列を別の配列で割ります:
あるいは,スカラを配列で割ります.この場合 src1 は存在しません:
結果は, src1 と同じ型になります. src2(I)=0 の場合は,結果も dst(I)=0 となります.
参考: multiply() , add() , subtract() , Matrix Expressions
浮動小数点型の正方行列の行列式を返します.
Parameter: | mtx – 入力行列; CV_32FC1 か CV_64FC1 型で正方でなければいけません |
---|
関数 determinant は,指定された行列の行列式を求め,それを返します. 小さい行列( mtx.cols=mtx.rows<=3 )に対しては直接法を利用し,大きい行列に対しては LU 分解を利用します.
正値対称行列に対しては, SVD() を計算することも可能です: .そして, の対角成分の積として行列式を求めます.
参考: SVD() , trace() , invert() , solve() , Matrix Expressions
対称行列の固有値及び固有ベクトルを求めます.
パラメタ: |
|
---|
関数 eigen は,対称行列 src の固有値のみ,または固有値と固有ベクトルの両方を求めます:
src*eigenvectors(i,:)' = eigenvalues(i)*eigenvectors(i,:)' (in MATLAB notation)
lowindex あるいは highindex の一方が与えられると,もう片方も必要になります.インデックス番号は 0 から始まります.例えば,最大の固有値/固有ベクトルを計算する場合は, lowindex = highindex = 0 をセットします.過去の経緯から,この関数は常に入力行列と同じサイズの正方行列(固有ベクトルから構成)と,入力行列と同じ長さのベクトル(固有値から構成)を返します.インデックスで選択された固有値/固有ベクトルは,常に最初の highindex - lowindex + 1 行目保存されます.
参考: SVD() , completeSymm() , PCA()
各配列要素を指数として,自然対数の底(ネイピア数)e のべき乗を求めます.
パラメタ: |
|
---|
関数 exp は,入力配列の各要素に対して,それを指数とする自然対数の底eのべき乗を求めます:
最大誤差は,単精度で約 ,倍精度で 未満です.現在の実装では,指数表現されない(非正規化)浮動小数点数は出力時に 0 に変換されます.また,特殊な値(NaN, )は扱いません.
参考: log() , cartToPolar() , polarToCart() , phase() , pow() , sqrt() , magnitude()
画像の選択されたチャンネルを抽出します.
パラメタ: |
|
---|
関数 extractImageCOI は,古い形式の配列から画像の COI を抽出し,それを新しい形式の C++ 行列に配置するために利用されます.他の関数と同様に,必要ならば Mat::create によって出力行列が再割り当てされます.
新しい形式の行列からチャンネルを抽出するには mixChannels() や split() を利用してください.
参考: mixChannels() , split() , merge() , cvarrToMat() , cvSetImageCOI() , cvGetImageCOI()
2次元ベクトルの角度(度単位)を求めます.
パラメタ: |
|
---|
関数 fastAtan2 は,2次元の入力ベクトルの角度を求めます.角度は度単位で表現され, から の範囲で変化します.精度は約 です.
2次元配列を,垂直軸,水平軸,あるいはその両方の軸で反転します.
パラメタ: |
|
---|
関数 flip は,3種類の中から1つ選択された方法で配列を反転させます(行と列のインデックスは0が基準):
この関数を利用するケースとして,以下のような場合が考えられます:
参考: transpose() , repeat() , completeSymm()
汎用的な行列の乗算を行います.
パラメタ: |
|
---|
この関数は,汎用的な行列の乗算を行うもので,対応する BLAS レベル 3 の *gemm 関数に似ています. 例えば, gemm(src1, src2, alpha, src3, beta, dst, GEMM_1_T + GEMM_3_T) は以下に相当します.
この関数は,行列の式で置き換えることができます.例えば,上述の例は以下のように置き換えが可能です:
dst = alpha*src1.t()*src2 + beta*src3.t();
参考: mulTransposed() , transform() , Matrix Expressions
1ピクセルに対する変換関数を返します.
パラメタ: |
|
---|
関数 getConvertElem および getConvertScaleElem は,個々のピクセルをある型から別の型に変換する関数へのポインタを返します. この関数の主な目的は1ピクセルの変換ですが(実際は,疎な行列をある型から別の型に変換するため),行列データが連続ならば, cn = matrix.cols*matrix.rows*matrix.channels() を設定することで,密な行列の行全体,あるいは行列全体を一度に変換することができます.
参考: Mat::convertTo() , MatND::convertTo() , SparseMat::convertTo()
与えられたベクトルサイズに対して最適な DFT サイズを返します.
Parameter: | vecsize – ベクトルサイズ |
---|
DFT の性能は,ベクトルサイズの単調関数ではありません.よって,2つの配列の畳み込みや配列のスペクトル分析を行う場合に,入力データに0を埋め込んで,元の配列よりも高速に変換できる少しだけ大きい配列を得るというのは妥当な処理と言えます.
サイズが2の累乗である配列が最も高速に処理できますが,サイズが 2, 3, 5 の積(例えば,300 = 5*5*3*2*2)である配列も非常に効率的に処理可能です.
関数 getOptimalDFTSize は, vecsize 以上の値で,サイズ N のベクトルの DFT が効率的に計算できるような最小の値 N を返します.現在の実装では,ある , , に対して となります.
vecsize が大きすぎる( INT_MAX に非常に近い)場合,この関数は負の値を返します.
DCT に対する最適なベクトルサイズを推定するのに,この関数を直接利用することはでません(現在の DCT の実装では,偶数サイズのベクトルのみをサポートしているので)が, getOptimalDFTSize((vecsize+1)/2)*2 とすれば簡単に求めることが可能です.
参考: dft() , dct() , idft() , idct() , mulSpectrums()
1次元あるいは2次元の配列に対して,逆離散コサイン変換または逆変換を行います.
パラメタ: |
|
---|
idct(src, dst, flags) は, dct(src, dst, flags | DCT_INVERSE) と等価です. 詳しくは dct() を参照してください.
参考: dct() , dft() , idft() , getOptimalDFTSize()
1次元あるいは2次元の配列に対して,逆離散フーリエ変換を行います.
パラメタ: |
---|
idft(src, dst, flags) は dct(src, dst, flags | DFT_INVERSE) と等価です.詳しくは dft() を参照してください. dft と idft は,デフォルトでは結果をスケーリングしないことに注意してください.したがって,互いに逆変換を行う場合は, dft と idft のどちらか片方に DFT_SCALE を渡さなければいけません.
参考: dft() , dct() , idct() , mulSpectrums() , getOptimalDFTSize()
ある配列要素が,別の2つの配列要素で表される範囲内に収まっているかをチェックします.
パラメタ: |
|
---|
関数 inRange は,入力配列の各要素に対して範囲チェックを行います:
シングルチャンネル配列の場合は,
となり,2チャンネル以上の配列の場合も同様になります.
dst (I) は, src (I) が指定した範囲内にある場合は 255(すべてのビットが 1 )にセットされ,そうでない場合は 0 にセットされます.
行列の逆行列,または擬似逆行列を求めます.
パラメタ: |
|
---|
関数 invert は,行列 src の逆行列を求め,結果を dst に格納します. src が正則でない場合,この関数は擬似逆行列, つまり を最小にする dst を求めます.
DECOMP_LU メソッドを利用する場合,この関数は src の行列式を返します( src は必ず正方 ).これが 0 の場合,逆行列は求まらずに dst は 0 で埋められます.
DECOMP_SVD メソッドを利用する場合,この関数は src の条件数の逆数(最大の特異値に対する最小の特異値の比)を返しますが, src が特異行列の場合は 0 を返します. src が特異行列の場合,SVD メソッドは擬似逆行列を求めます.
DECOMP_LU と同様に, DECOMP_CHOLESKY メソッドも正則な行列の場合のみ利用できます.逆行列が求まれば,それを dst に格納して 0 ではない値を返し,そうでなければ 0を返します.
各配列要素の絶対値の自然対数を求めます.
パラメタ: |
|
---|
関数 log は,入力配列の各要素の絶対値の自然対数を求めます:
ここで C は,大きな負の値を表します(現在の実装では,およそ -700). 最大相対誤差は,単精度の入力に対して約 ,倍精度の入力に対して 未満です.特殊な値(NaN, )は扱いません.
参考: exp() , cartToPolar() , polarToCart() , phase() , pow() , sqrt() , magnitude()
ルックアップテーブルを用いて配列を変換します.
パラメタ: |
|
---|
関数 LUT は,ルックアップテーブルから取り出した値で出力配列を埋めます.テーブルの要素を指定するインデックスには,入力配列の値が用いられます.つまり,この関数は src の各要素を以下のように処理します:
ここで,
参考: convertScaleAbs() , Mat::convertTo
2次元ベクトルの大きさを求めます.
パラメタ: |
|
---|
関数 magnitude は, x と y の配列要素で表された2次元ベクトルの大きさを求めます:
参考: cartToPolar() , polarToCart() , phase() , sqrt()
2つのベクトル間のマハラノビス距離を求めます.
パラメタ: |
|
---|
関数 cvMahalonobis は,2つのベクトル間の重み付き距離を求め,それを返します:
共分散行列を関数 calcCovarMatrix() を用いて計算し,関数 invert() を用いてその逆行列を求ます(精度良く計算するために,なるべく DECOMP _ SVD メソッドを利用してください).
2つの配列同士,あるいは配列とスカラの 要素毎の最大値を求めます.
パラメタ: |
|
---|
関数 max は,2つの配列の要素を比較し大きい方を求めます:
または,配列とスカラの比較:
配列とスカラを引数にとる場合,入力配列がマルチチャンネルならば,各チャンネルは個別に value と比較されます.
上述したこの関数のバリエーションのうち,最初の三つの形式は,実際には Matrix Expressions の一部です.これらは行列表現オブジェクトを返します.そして,それをさらに変換したり,行列に代入したり,関数に渡したりできます.
参考: min() , compare() , inRange() , minMaxLoc() , Matrix Expressions
配列要素の平均値を求めます.
パラメタ: |
|
---|
関数 mean は,各チャンネル毎に配列要素の平均値 M を求め,それを返します:
すべてのマスク要素が 0 の場合,この関数は Scalar::all(0) を返します.
参考: countNonZero() , meanStdDev() , norm() , minMaxLoc()
配列要素の平均と標準偏差を求めます.
パラメタ: |
|
---|
関数 meanStdDev は,各チャンネル毎に配列要素の平均と標準偏差を求め,それを出力パラメータに格納します:
すべてのマスク要素が0の場合,この関数は Scalar::all(0) を返します.
計算される標準偏差は,完全に正規化された共分散行列の対角成分にすぎないことに注意してください.もし完全な行列が必要ならば,マルチチャンネル配列 をシングルチャンネル配列 に変形して(行列が連続である場合のみ可能),この行列を calcCovarMatrix() に渡してください.
参考: countNonZero() , mean() , norm() , minMaxLoc() , calcCovarMatrix()
複数のシングルチャンネル配列からマルチチャンネル配列を作成します.
パラメタ: |
|
---|
関数 merge は,複数のシングルチャンネル配列を結合させて(厳密に言えば,要素をインタリーブして),1つのマルチチャンネル配列を作成します.
関数 split() は,この逆の処理を行います.また,複数のマルチチャンネル画像を結合したり,別の高度な方法でチャンネルを入れ替える必要がある場合は, mixChannels() を利用してください.
参考: mixChannels() , split() , reshape()
2つの配列同士,あるいは配列とスカラの 要素毎の最小値を求めます.
パラメタ: |
|
---|
関数 min は,2つの配列の要素を比較し大きい方を求めます:
または,配列とスカラの比較:
配列とスカラを引数にとる場合,入力配列がマルチチャンネルならば,各チャンネルは個別に value と比較されます.
上述したこの関数のバリエーションのうち,最初の三つの形式は,実際には Matrix Expressions の一部です.これらは行列表現オブジェクトを返します.そして,それをさらに変換したり,行列に代入したり,関数に渡したりできます.
参考: max() , compare() , inRange() , minMaxLoc() , Matrix Expressions
配列全体あるいは部分配列に対する,大域的最小値および最大値を求めます.
パラメタ: |
|
---|
関数 minMaxLoc は,最小と最大の要素値,およびそれらの位置を求めます. この極値は,配列全体から探索されますが, mask が空の配列でない場合は,指定された配列領域から探索されます.
この関数は,マルチチャンネル配列に対しては動作しません.すべてのチャンネルに対する最小,最大の要素を見つける必要がある場合は,最初に reshape() を用いて配列をシングルチャンネルに再編成します.あるいは, extractImageCOI() や mixChannels() , split() などの関数を用いて,特定のチャンネルを抜き出す方法もあります.
疎な行列の場合,最小値は 0 ではない要素の中から求められます.
参考: max() , min() , compare() , inRange() , extractImageCOI() , mixChannels() , split() , reshape() .
入力配列の指定されたチャンネルを,出力配列の指定されたチャンネルへコピーします.
パラメタ: |
|
---|
関数 mixChannels は,画像のチャンネルを入れ替える高度な機構を提供します. split() や merge() ,また cvtColor() のいくつかの形式は,この mixChannels の特定の場合を表しています.
例として,4チャンネル RGBA 画像を, 3チャンネル BGR 画像(つまり,R と B の交換)とアルファチャンネル画像の2つに分離するコードを示します:
Mat rgba( 100, 100, CV_8UC4, Scalar(1,2,3,4) );
Mat bgr( rgba.rows, rgba.cols, CV_8UC3 );
Mat alpha( rgba.rows, rgba.cols, CV_8UC1 );
// 行列のデータはコピーされず,ヘッダのみがコピーされるので
// 行列の配列を作成するのは非常に効率的な作業です.
Mat out[] = { bgr, alpha };
// rgba[0] -> bgr[2], rgba[1] -> bgr[1],
// rgba[2] -> bgr[0], rgba[3] -> alpha[0]
int from_to[] = { 0,2, 1,1, 2,0, 3,3 };
mixChannels( &rgba, 1, out, 2, from_to, 4 );
OpenCV の他の多くの新形式の C++ 関数と異なり(イントロダクションと Mat::create() を参照してください), mixChannels では,出力配列をあらかじめ確保しておく必要があることに注意してください.
参考: split() , merge() , cvtColor()
2つのフーリエスペクトル同士の要素毎の乗算を行います.
パラメタ: |
|
---|
関数 mulSpectrums は,実数または複素数のフーリエ変換の結果である,CCSパック表現の行列または複素行列の要素同士の乗算を行います.
この関数は, dft() や idft() と共に,2つの配列の畳み込み( conj=false を渡す),あるいは相関( conj=false を渡す)を高速に計算するために利用されます.複素配列である場合は,単純に(要素毎に)掛け算され,また,オプションで2番目の配列を複素共役に変更できます.実数配列である場合は,CCSパック表現と仮定されます(詳しくは dft() を参照してください).
2つの配列同士の,要素毎のスケーリングされた積を求めます.
パラメタ: |
|
---|
関数 multiply は,2つの配列の各要素毎の積を求めます:
1番目の関数形式の, Matrix Expressions と相性の良いバージョンも存在します. Mat::mul() を参照してください.
要素毎の積ではなく行列の積を探しているならば, gemm() を参照してください.
参考: add() , substract() , divide() , Matrix Expressions , scaleAdd() , addWeighted() , accumulate() , accumulateProduct() , accumulateSquare() , Mat::convertTo()
行列とその転置行列の積を求めます.
パラメタ: |
|
---|
関数 mulTransposed は, src とその転置行列の積を求めます.
aTa=true の場合は,
となり,そうでない場合は,
となります.この関数は,共分散行列の計算や,デルタを 0 とすることで一般的な行列積の計算の,高速な代替手段として用いられます.
参考: calcCovarMatrix() , gemm() , repeat() , reduce()
配列の絶対値ノルム,絶対差分値ノルム,相対差分値ノルムを求めます.
パラメタ: |
|
---|
関数 norm は, src1 の絶対値ノルム( src2 が存在しない場合)を求めます:
また src2 が存在する場合は,絶対差分値ノルム,相対差分値ノルムを求めます:
あるいは
関数 norm は,計算されたノルムを返します.
mask パラメータが存在し,それが空ではない(そして,型が CV_8U で, src1 と同じサイズ)場合,そのマスク領域によって指定された部分のノルムのみが計算されます.
マルチチャンネルの入力配列は,シングルチャンネルとして扱われます.つまり,すべてのチャンネルの結果が重ね合わされます.
配列のノルム,またはその範囲を正規化します.
パラメタ: |
|
---|
関数 normalize は,入力配列の要素にスケーリングとシフトを施し,以下を満たすようにします.
normType=NORM_INF , NORM_L1 または NORM_L2 の場合
(ここで , 1 または 2)
となり,また normType=NORM_MINMAX の場合(密な配列の場合のみ)は,
となります.
オプションのマスクは,正規化される部分配列を指定します.つまり,部分配列のノルム,または部分配列の最小値最大値が求められて,この部分配列だけが正規化されます.ノルムや最小値最大値を求める為だけにマスクを利用し,配列全体をそれで正規化したい場合は, norm() と Mat::convertScale() / MatND::convertScale() /cross{SparseMat::convertScale}を別々に利用するとよいでしょう.
疎な行列の場合,0 ではない値のみが分析され変換されます.そのため,0 基準をずらすことが出来てしまうので,疎な行列の範囲の変換はできません.
参考: norm() , Mat::convertScale() , MatND::convertScale() , SparseMat::convertScale()
主成分分析のためのクラス.
class PCA
{
public:
// デフォルトコンストラクタ
PCA();
// 行また列データとして格納されたベクトル集合に対して PCA を行います.
PCA(const Mat& data, const Mat& mean, int flags, int maxComponents=0);
// 行また列データとして格納されたベクトル集合に対して PCA を行います.
PCA& operator()(const Mat& data, const Mat& mean, int flags, int maxComponents=0);
// ベクトルを主成分空間に射影します.
Mat project(const Mat& vec) const;
void project(const Mat& vec, Mat& result) const;
// 主成分空間への射影からベクトルを再構成します.
Mat backProject(const Mat& vec) const;
void backProject(const Mat& vec, Mat& result) const;
// 主成分空間の固有ベクトル.行列の行として格納されています.
Mat eigenvectors;
// それに対応する固有値. PCA 圧縮 / 分解では利用されません.
Mat eigenvalues;
// 平均ベクトル.射影されたベクトルから引かれます.
// または,再構成されたベクトルに足されます.
Mat mean;
};
PCA クラスは,ベクトル集合の特別な基底を求めるために利用されます.この基底は,入力ベクトル集合から計算された共分散行列の固有ベクトルで構成されます. PCA クラスは,この基底によって定義される新しい座標空間と相互にベクトルを変換することもできます.通常,この新しい座標系では,元の集合の各ベクトル(および,そのベクトルの線型結合)は,最初のいくつかの成分,つまり大きな固有値を持つ共分散行列の固有ベクトルを用いて非常に正確に近似できます.幾何的には,共分散行列の固有ベクトルのうち,影響力の大きな固有値に対応するものが張る部分空間へのベクトルの射影を計算することを意味します.そして通常,このような射影は元のベクトルに非常に近いものになります.つまり,元の高次空間のベクトルを,部分空間に射影されたベクトルの座標から成る非常に短いベクトルで表現できます.このような変換は,Karhunen-Loeve変換,KLTとしても知られています. http://en.wikipedia.org/wiki/Principal_component_analysis を参照してください.
次のサンプルは,二つの行列を引数にとる関数です.1番目の行列には,ベクトル集合が格納されており(1行が1つのベクトル),PCA の計算を行うために使われます.2番目の行列には,ベクトルの「テスト」集合が格納されており(1行が1つのベクトル),まずPCAで圧縮された後に再構成され,そこで計算された再構成誤差ノルムが各ベクトル毎に表示されます.
PCA compressPCA(const Mat& pcaset, int maxComponents,
const Mat& testset, Mat& compressed)
{
PCA pca(pcaset, // データを渡します.
Mat(), // 平均ベクトルがあらかじめ計算されているわけではないので,
// PCA の関数に計算してもらいます.
CV_PCA_DATA_AS_ROW, // ベクトルが行列の行として
// 格納されていることを示します
// (もしベクトルが列として格納されていれば
// CV_PCA_DATA_AS_COL を利用すします)
maxComponents // いくつの主成分を保持するかを指定します.
);
// テストデータが存在しなければ,計算された基底を返すだけです.
if( !testset.data )
return pca;
CV_Assert( testset.cols == pcaset.cols );
compressed.create(testset.rows, maxComponents, testset.type());
Mat reconstructed;
for( int i = 0; i < testset.rows; i++ )
{
Mat vec = testset.row(i), coeffs = compressed.row(i);
// ベクトルを圧縮し,その結果を
// 出力行列の i 番目の行に格納します.
pca.project(vec, coeffs);
// 次に,それを再構成します.
pca.backProject(coeffs, reconstructed);
// そして,誤差を計測します.
printf("
}
return pca;
}
参考: calcCovarMatrix() , mulTransposed() , SVD() , dft() , dct()
PCA コンストラクタ.
パラメタ: |
|
---|
デフォルトコンストラクタは,空の PCA 構造体を初期化します.2番目のコンストラクタは,構造体を初期化し, PCA::operator() を呼び出します.
与えられたデータ集合に対して,主成分分析を行います.
パラメタ: |
|
---|
このオペレータは,与えられたデータ集合に対して PCA を実行します.同じ PCA 構造体を複数のデータ集合に対して使用しても安全です.つまり,以前に別のデータ集合に対して利用された構造体があれば,その内部データは回収され,新しい eigenvalues , eigenvectors , mean が計算されます.
求められた固有値は降順に,固有ベクトルもそれに対応するように PCA::eigenvectors の行に格納されます.
(複数の)ベクトルを主成分部分空間に射影します.
パラメタ: |
|
---|
このメソッドは,1つまたは複数のベクトルを主成分部分空間に射影します.各ベクトルの射影は,主成分基底の係数で表現されます.このメソッドの1番目の形式は行列を返し,2番目の形式は結果を result に書き込みます.従って,1番目の形式は式の一部として利用することができ,2番目の形式は処理ループでより効率的に実行できます.
主成分空間への射影からベクトルを再構成します.
パラメタ: |
|
---|
このメソッドは, PCA::project() の逆変換です.射影されたベクトルの主成分座標を引数にとり,元のベクトルを再構成します.もちろん,主成分がすべて保持されている場合を除いて,再構成されたベクトルは元のものとは異なります.しかし大抵の場合,成分数が十分に多ければ(しかし,元ベクトルの次元に比べると十分に小さいですが),その差は小さくなります.この様な理由で,PCA はよく利用されます.
ベクトルの透視行列変換を行います.
パラメタ: |
|
---|
関数 perspectiveTransform は, src の各要素を2次元または3次元ベクトルとして扱い,以下のように(ここでは,3次元ベクトルの変換を示します.2次元ベクトル変換の場合 成分が除かれます)変換します:
ここで
また
この関数は,2次元または3次元ベクトルの疎な集合を変換することに注意してください.画像を透視変換により変形したい場合は, warpPerspective() を利用します.逆の処理,つまり,いくつかの点対応の組から最も尤もらしい透視変換を求める場合は, getPerspectiveTransform() や findHomography() を利用することができます.
参考: transform() , warpPerspective() , getPerspectiveTransform() , findHomography()
2次元ベクトルの回転角度を求めます.
パラメタ: |
|
---|
関数 phase は, x と y の対応する要素から構成される各2次元ベクトルの,回転角度を求めます:
この角度の推定精度は であり, x(I)=y(I)=0 の場合,対応する angle (I) は にセットされます.
参考:
2次元ベクトルの大きさと角度から,x座標,y座標を求めます.
パラメタ: |
|
---|
関数 polarToCart は, magnitude と angle の対応する組で表される2次元ベクトルの,カーテシアン座標を求めます:
推定座標の相対精度は です.
参考: cartToPolar() , magnitude() , phase() , exp() , log() , pow() , sqrt()
各配列要素を累乗します.
パラメタ: |
|
---|
関数 pow は,入力配列の各要素を p 乗します:
つまり,非整数の指数に対しては,入力配列要素の絶対値が用いられます.しかし,入力要素が負の場合でも,いくつか処理を追加すると正しい結果を得ることができます.以下に,配列 src の5乗根を求める例を示します:
Mat mask = src < 0;
pow(src, 1./5, dst);
subtract(Scalar::all(0), dst, dst, mask);
整数,0.5,-0.5 などのいくつかの p に対しては,特別に高速なアルゴリズムが利用されます.
参考: sqrt() , exp() , log() , cartToPolar() , polarToCart()
乱数生成器クラス.
class CV_EXPORTS RNG
{
public:
enum { A=4164903690U, UNIFORM=0, NORMAL=1 };
// コンストラクタ
RNG();
RNG(uint64 state);
// 32ビット符号なし乱数を返します
unsigned next();
// 指定された型の乱数を返します
operator uchar();
operator schar();
operator ushort();
operator short();
operator unsigned();
// 一様分布 [0, N) からサンプルされた整数型の乱数が返されます.
unsigned operator()(unsigned N);
unsigned operator()();
operator int();
operator float();
operator double();
// 一様分布 [a, b) からサンプルされた乱数が返されます.
int uniform(int a, int b);
float uniform(float a, float b);
double uniform(double a, double b);
// 平均が0のガウス分布乱数が返されます.
double gaussian(double sigma);
// 指定された分布からサンプルされた乱数で,配列を埋めます.
void fill( Mat& mat, int distType, const Scalar& a, const Scalar& b );
void fill( MatND& mat, int distType, const Scalar& a, const Scalar& b );
// RNG Nお内部状態(将来的に変更されるかもしれません)
uint64 state;
};
RNG クラスは,乱数生成器の実装です.これは,RNG 状態(現在は,64ビット整数)をカプセル化し,ランダムなスカラ値を返すメソッドと,乱数で配列を埋めるメソッドを持ちます.現在のところ,一様分布とガウス分布(正規分布)をサポートします.この生成器は,G. Marsaglia ( http://en.wikipedia.org/wiki/Multiply-with-carry ) によって提唱されたキャリー付き乗算アルゴリズムを利用しています.また,ガウス分布乱数は, G. Marsaglia と W. W. Tsang によって提唱された Ziggurat アルゴリズム ( http://en.wikipedia.org/wiki/Ziggurat_algorithm ) によって生成されます.
RNG コンストラクタ
Parameter: | state – RNG の初期化に利用される64ビット値 |
---|
これらは RNG コンストラクタです.1番目の形式は,状態をあらかじめ定義された値,現在の実装では 2**32-1 ,にセットします.2番目の形式は,指定された値をセットします.ユーザが state=0 を引数に与えた場合,全てが0になってしまう特異な乱数列を避けるために,コンストラクタは前述のデフォルト値を代わりに利用します.
各メソッドは,MWC アルゴリズムを用いて状態を更新し,指定された型の次の乱数を返します.整数型の場合,戻り値は,指定された型の有効な範囲内全体から選択されます.浮動小数点数型の場合,戻り値は, [0,1) の範囲から選択されます.
次の乱数を返します.
Parameter: | N – The upper non-inclusive boundary of the returned random number |
---|
このメソッドは,MWC アルゴリズムを用いて状態を更新し,次の乱数を返します.1番目の形式は, RNG::next() と等価です.2番目の形式は,モジュロ N の乱数,つまり [0, N) の範囲にある値を返します.
一様分布からサンプルされた乱数を返します.
パラメタ: |
|
---|
このメソッドは,MWC アルゴリズムを用いて状態を更新し,次の一様分布乱数を返します.一様分布の範囲は [a, b) となり,乱数の型はこの引数の型から推定されます.以下の例で説明するように,それぞれ微妙な違いがあります.
cv::RNG rng;
// 常に0が生成されます
double a = rng.uniform(0, 1);
// [0, 1) 範囲の double 値が生成されます
double a1 = rng.uniform((double)0, (double)1);
// [0, 1) 範囲の float 値が生成されます
double b = rng.uniform(0.f, 1.f);
// [0, 1) 範囲の double 値が生成されます.
double c = rng.uniform(0., 1.);
// 曖昧性のためにコンパイルエラーが発生するでしょう:
// RNG::uniform(0, (int)0.999999) と RNG::uniform((double)0, 0.99999) のどっち?
double d = rng.uniform(0, 0.999999);
コンパイラは, RNG::uniform の結果に割り当てられた変数の型を考慮しません.ここで考慮されるのは,引数 a と b の型だけです.乱数の上下限値が整数値で,浮動小数点数型の乱数が欲しい場合は,引数の最後にドットをつけるか,また,定数の場合などは,上述の a1 のように明示的にキャスト演算子を利用してください.
ガウス分布からサンプルされた乱数を返します.
Parameter: | sigma – 分布の標準偏差 |
---|
このメソッドは,MWC アルゴリズムを用いて状態を更新し,ガウス分布 N(0,sigma) からサンプルされた次の乱数を返します.つまり,返される乱数の平均値は0,標準偏差は sigma となります.
配列を乱数で埋めます.
パラメタ: |
|
---|
各メソッドは,指定の分布からサンプルされた乱数値で行列を埋めます.新しい値が生成されると,それに伴い RNG の状態も更新されます.マルチチャンネル画像の場合,各チャンネルは独立に埋められます.つまり,RNG は,非対角な共分散行列を持つ多次元ガウス分布から直接サンプルすることはできない,という事です.このために,まず,分布 つまり,平均が0で共分散行列が単位行列となるガウス分布から行列を生成し,これを, transform() と個別の共分散行列を用いて変形します.
一様分布する乱数,または乱数の配列を生成します.
パラメタ: |
|
---|
関数テンプレート randu は,指定された型の一様分布する乱数を生成し,その値を返します. randu<int>() は, (int)theRNG(); などと等価です. RNG() を参照してください.
2番目の形式の関数(関数テンプレートではない方)は,指定された範囲内で一様分布する乱数で行列 mtx を埋めます:
正規分布する乱数で配列を埋めます.
パラメタ: |
|
---|
関数 randn は,指定された平均と標準偏差で正規分布する乱数を生成し,行列 mtx をそれで埋めます.生成された数値には が適用されます(つまり,値が切り詰められます).
参考: RNG() , randu()
配列の要素をランダムに入れ替えます.
パラメタ: |
|
---|
関数 randShuffle は,指定された1次元配列の要素をランダムに選択し,それらを入れ替えることでシャッフルを行います.このような入れ替え処理は, mtx.rows*mtx.cols*iterFactor 回行われます.
参考: RNG() , sort()
行列をベクトルに縮小します.
パラメタ: |
|
---|
関数 reduce は,行列の行または列を1次元ベクトルの集合として扱い,単一の行または列が得られるまで,そのベクトル集合に対して指定された処理を繰り返します.例えば,ラスタ画像を水平軸や垂直軸に射影する場合に,この関数が利用できます. CV_REDUCE_SUM および CV_REDUCE_AVG の場合は,計算精度を保つために(桁溢れしないように),出力ベクトル要素のビット深度を入力よりも大きくとるべきです.また,これら2つの縮小モードの場合は,マルチチャンネル画像を扱うこともできます.
参考: repeat()
入力配列を繰り返しコピーして出力配列を埋めます.
パラメタ: |
|
---|
関数 repeat() は,2つの軸それぞれに沿って,入力配列を1回または複数回複製します:
2番目の形式の関数は, Matrix Expressions と一緒に利用する際に便利です.
参考: reduce() , Matrix Expressions
ある基本型から別の基本型への正確な変換のためのテンプレート関数.
Parameter: | v – この関数のパラメータ |
---|
関数 saturate_cast は, static_cast<T>() などの C++ の標準的なキャスト操作と似ています.これらは,ある基本型から別の基本型へ効率的に,かつ正確に変換を行います.詳しくは,イントロダクションを参照してください.名前の “saturate” は,入力値 v が変換後の型の範囲外にある場合に,単に入力の下位ビットを持ってくるわけではなく,代わりに数値を切り詰めることを意味します.例えば:
uchar a = saturate_cast<uchar>(-100); // a = 0 (UCHAR_MIN)
short b = saturate_cast<short>(33333.33333); // b = 32767 (SHRT_MAX)
このような切り詰めは,変換後の型が unsigned char, signed char, unsigned short, signed short である場合に起こります.32 ビット整数に対しては切り詰めは行われません.
パラメータが浮動小数点数であり,変換後の型が整数(8ビット,16ビット,32ビット)である場合,この浮動小数点数は,まず最も近い整数値に丸められてから,必要ならば切り詰められます(変換後の型が,8ビットあるいは16ビット整数の場合).
この処理は,OpenCV のほとんどの画像処理関数で利用されています.
参考: add() , subtract() , multiply() , divide() , Mat::convertTo()
スケーリングされた配列と別の配列との和を求めます.
パラメタ: |
|
---|
関数 cvScaleAdd は, BLAS における DAXPY あるいは SAXPY として知られる,線形代数の古典的な基本処理の1つです.これは,スケーリングされた配列と別の配列との和を求めます.
行列表現を用いて,この関数と同じ処理をすることもできます.例えば:
Mat A(3, 3, CV_64F);
...
A.row(0) = A.row(1)*2 + A.row(2);
参考: add() , addWeighted() , subtract() , Mat::dot() , Mat::convertTo() , Matrix Expressions
行列を,定数倍した単位行列として初期化します.
パラメタ: |
|
---|
関数 setIdentity() は,行列を,定数倍した単位行列として初期化します:
行列の初期化と行列表現を用いて,この関数と同じ処理をすることもできます.例えば:
Mat A = Mat::eye(4, 3, CV_32F)*5;
// A には [[5, 0, 0], [0, 5, 0], [0, 0, 5], [0, 0, 0]] がセットされます.
参考: Mat::zeros() , Mat::ones() , Matrix Expressions ,
Mat::setTo() , Mat::operator=() ,
連立一次方程式,あるいは最小二乗問題を解きます.
パラメタ: |
|
---|
関数 solve は,連立方程式あるいは最小二乗問題を解きます(後者は,SVD か QR メソッド,または DECOMP_NORMAL フラグを指定して解くことができます).
DECOMP_LU あるいは DECOMP_CHOLESKY メソッドが用いられる場合, src1 (または )が正則ならば1を返し,そうでなければ0を返します.後者の場合, drt は無効になります.別のメソッドが用いられる場合,左辺が特異行列ならば擬似逆行列を求めます.
劣決定の連立方程式 において単一の解を求めたい場合は,関数 solve は使えません.代わりに SVD::solveZ() を利用してください.
三次方程式の実根を求める.
パラメタ: |
|
---|
関数 solveCubic は,三次方程式の実根を求めます:
coeffs が4要素ベクトルの場合:
coeffs が3要素ベクトルの場合:
実根は,配列 roots に格納されます.
Finds the real or complex roots of a polynomial equation
パラメタ: |
|
---|
関数 solvePoly は,多項式の実根または複素根を求めます:
行列の各行,または各列をソートします.
パラメタ: |
|
---|
関数 sort は,行列の各行または各列を,昇順または降順にソートします.行列の各行または各列を辞書順にソートしたい場合は,適切な比較述語を渡した STL の汎用関数 std::sort を利用してください.
参考: sortIdx() , randShuffle()
行列の各行,または各列をソートします.
パラメタ: |
|
---|
関数 sortIdx は,行列の各行または各列を,昇順または降順にソートします.要素自身を並べ換える代わりに,ソートされた要素のインデックスが出力配列に格納されます.例えば:
Mat A = Mat::eye(3,3,CV_32F), B;
sortIdx(A, B, CV_SORT_EVERY_ROW + CV_SORT_ASCENDING);
// B はおそらく次のようになります.
// ( A に同値の要素があると,その入れ替わりが起こる可能性があるので)
// [[1, 2, 0], [0, 2, 1], [0, 1, 2]]
参考: sort() , randShuffle()
マルチチャンネルの配列を,複数のシングルチャンネルの配列に分割します.
パラメタ: |
|
---|
関数 split は,マルチチャンネルの配列を,別々のシングルチャンネルの配列に分割します:
シングルチャンネルの抽出,またはより洗練されたチャンネルの入れ替えが必要ならば, mixChannels() を利用してください.
参考: merge() , mixChannels() , cvtColor()
配列要素の平方根を求めます.
パラメタ: |
|
---|
関数 sqrt は,入力配列の各要素の平方根を求めます.マルチチャンネル配列の場合,各チャンネルは個別に処理されます.この関数の精度は,組み込みの std::sqrt と同等です.
参考: pow() , magnitude()
2つの配列同士,あるいは配列とスカラの 要素毎の差を求めます.
パラメタ: |
|
---|
関数 subtract は,以下を求めます:
2つの配列同士の差:
配列とスカラの差:
スカラと配列の差:
ここで I は,配列要素の多次元インデックスを表します.
上述のリストの最初の関数は,行列表現を用いたもので置き換えることができます:
dst = src1 - src2;
dst -= src2; // subtract(dst, src2, dst); と等価
参考: add() , addWeighted() , scaleAdd() , convertScale() , Matrix Expressions , .
特異値分解を行うためのクラス.
class SVD
{
public:
enum { MODIFY_A=1, NO_UV=2, FULL_UV=4 };
// デフォルトコンストラクタ
SVD();
// A を u, w, vt に分解します: A = u*w*vt;
// u と vt は直行行列, w は 対角行列です
SVD( const Mat& A, int flags=0 );
// A を u, w, vt に分解します.
SVD& operator ()( const Mat& A, int flags=0 );
// A が特異行列の場合に, A*x = 0 かつ,
// norm(x)=1 を満たす x を求めます.
static void solveZ( const Mat& A, Mat& x );
// 後退代入を行います:
// x = vt.t()*inv(w)*u.t()*rhs ~ inv(A)*rhs
void backSubst( const Mat& rhs, Mat& x ) const;
Mat u, w, vt;
};
SVD クラスは,最小二乗問題,劣決定連立方程式,逆行列,条件数の計算などの解を得るための,浮動小数点型行列の特異値分解を行うために利用されます.
分解される行列を保存しておく必要がなければ, flags=SVD::MODIFY_A|... を渡して行列を直接変更すると,処理が少し速くなります.行列の条件数や行列式の絶対値を求めたい場合は, u と vt は不要なので flags=SVD::NO_UV|... を渡しても構いません.もう1つのフラグ FULL_UV は,完全なサイズの u と vt を必ず求めることを指定しますが,これは大抵の場合は不要です.
参考: invert() , solve() , eigen() , determinant()
SVD コンストラクタ
パラメタ: |
|
---|
1番目のコンストラクタは,空の SVD 構造体を初期化します.2番目のコンストラクタは,空の SVD 構造体を初期化し, SVD::operator () を呼び出します.
行列の特異値分解を行います.
パラメタ: |
|
---|
このオペレータは,与えられた行列を特異値分解します. U ,転置された V , W の対角成分,が構造体に格納されます.また,同じ SVD 構造体を,異なる行列に対して再利用することができます.もし必要ならば,以前の u , vt , w は回収され,新しい行列が作成されます.これらはすべて Mat::create() によって実現されます.
このメソッドは,劣決定連立方程式 の単位長さの解 x を求めます.この様な方程式は,理論的には無限個の解を持つので,このアルゴリズムでは,最小の特異値(0のはず)に対応する右特異ベクトルを単位長さの解として求めます.実際には,丸め誤差や,浮動小数点数の精度限界により,入力行列は完全な特異行列ではなく,特異行列に近い行列とみなされます.よって,厳密に言えば,このアルゴリズムは以下の問題を解くことになります:
特異値後退代入を行います.
パラメタ: |
|
---|
このメソッドは,指定された右辺に対して後退代入を行います.
この方法を用いることで,連立方程式の非常に正確な解,または優決定連立方程式の(二乗誤差の意味で)最良の擬似解を得ることができます.同じ左辺(例えば, A )を持つ連立方程式を大量に解く必要があるならば,後退代入を行う SVD を明示的に利用することが唯一の方法です.単一の連立方程式(あるいは,複数の rhs が即得られるようなもの)を解くだけならば,単に solve() を呼び出して,そこに cv::DECOMP_SVD を渡せばよく,これはまったく同じ事です.
配列要素の和を求めます.
Parameter: | mtx – 1から4までのチャンネルを持つ入力配列 |
---|
関数 sum は,各チャンネル毎の配列要素の和を求め,それを返します.
参考: countNonZero() , mean() , meanStdDev() , norm() , minMaxLoc() , reduce()
関数 theRNG は,デフォルトの乱数生成器を返します.各スレッド毎に別の乱数生成機が存在するので,この関数はマルチスレッド環境でも安全に利用できます.この生成器から発生する乱数が1つだけ必要な場合,あるいは配列を初期化する必要がある場合は,代わりに randu() や randn() が利用できます.しかし,ループ内で多くの乱数を生成するならば,この関数を用いて生成器を取得した後に RNG::operator _Tp() を利用した方がはるかに高速です.
各配列要素の変換を行います.
パラメタ: |
|
---|
関数 transform は,配列 src の各要素に対して行列変換を行い,その結果を dst に格納します.
(ここで mtx.cols=src.channels() ),または
(ここで mtx.cols=src.channels()+1 )
つまり, N -チャンネル配列 src の各要素は, N -要素のベクトルとみなされます.そしてこれらは, または の行列 mtx によって, M -チャンネル配列 dst に変換されます.
この関数は, -次元点の幾何学変換,色空間の任意の(様々な RGB YUV 変換のような)線形変換,画像チャンネルの入れ替え,などにも利用されます.
参考: perspectiveTransform() , getAffineTransform() , estimateRigidTransform() , warpAffine() , warpPerspective()