配列操作 ============ .. highlight:: c .. index:: AbsDiff .. _AbsDiff: AbsDiff ------- `id=0.126303710553 Comments from the Wiki `__ .. cfunction:: void cvAbsDiff(const CvArr* src1, const CvArr* src2, CvArr* dst) 2 つの配列の要素毎に差の絶対値を求めます. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param dst: 出力配列. この関数は,2 つの配列の要素毎に差の絶対値を求めます. .. math:: \texttt{dst} (i)_c = | \texttt{src1} (I)_c - \texttt{src2} (I)_c| すべての入力配列は,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: AbsDiffS .. _AbsDiffS: AbsDiffS -------- `id=0.210685251036 Comments from the Wiki `__ .. cfunction:: void cvAbsDiffS(const CvArr* src, CvArr* dst, CvScalar value) 配列の要素とスカラ値の差の絶対値を求めます. .. code-block:: c #define cvAbs(src, dst) cvAbsDiffS(src, dst, cvScalarAll(0)) .. :param src: 入力配列. :param dst: 出力配列. :param value: スカラ値. この関数は,入力配列の要素とスカラ値の差の絶対値を求めます. .. math:: \texttt{dst} (i)_c = | \texttt{src} (I)_c - \texttt{value} _c| すべての入力配列は,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: Add .. _Add: Add --- `id=0.993232831036 Comments from the Wiki `__ .. cfunction:: void cvAdd(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL) 2つの配列を要素毎に加算します. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param dst: 出力配列. :param mask: 8ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,以下のように1つの配列をもう1つの配列と足し合わせます: .. code-block:: c dst(I)=src1(I)+src2(I) if mask(I)!=0 .. マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します. .. index:: AddS .. _AddS: AddS ---- `id=0.491628865364 Comments from the Wiki `__ .. cfunction:: void cvAddS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL) 配列とスカラ値を加算します. :param src: 入力配列. :param value: 加えられるスカラ値. :param dst: 出力配列. :param mask: 8ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,スカラ ``value`` を入力配列 ``src1`` の各要素に加え,その結果を ``dst`` に出力します. また,有限の範囲に値をとる型は,この処理により飽和します. .. code-block:: c dst(I)=src(I)+value if mask(I)!=0 .. マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: AddWeighted .. _AddWeighted: AddWeighted ----------- `id=0.715084159996 Comments from the Wiki `__ .. cfunction:: void cvAddWeighted(const CvArr* src1, double alpha, const CvArr* src2, double beta, double gamma, CvArr* dst) 2つの配列の重み付き和を求めます. :param src1: 1 番目の入力配列. :param alpha: 1 番目の配列要素に対する重み. :param src2: 2 番目の入力配列. :param beta: 2 番目の配列要素に対する重み :param dst: 出力配列. :param gamma: 各加算結果にさらに加えられるスカラ値. この関数は,以下のように2つの配列の重み付き和を計算します: .. code-block:: c dst(I)=src1(I)*alpha+src2(I)*beta+gamma .. マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します. .. index:: And .. _And: And --- `id=0.804142565792 Comments from the Wiki `__ .. cfunction:: void cvAnd(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL) 2つの配列の要素毎に,ビット単位の論理積を求めます. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param dst: 出力配列. :param mask: 8ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,2つの配列の要素ごとに,ビット単位の論理積を計算します: .. code-block:: c dst(I)=src1(I)&src2(I) if mask(I)!=0 .. 浮動小数点型配列の場合,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけない. .. index:: AndS .. _AndS: AndS ---- `id=0.636426559199 Comments from the Wiki `__ .. cfunction:: void cvAndS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL) スカラ値と配列の要素毎に,ビット単位の論理積を求めます. :param src: 入力配列. :param value: スカラ値. :param dst: 出力配列. :param mask: 8ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,スカラ値と配列要素毎に,ビット単位の論理積を計算します: .. code-block:: c dst(I)=src(I)&value if mask(I)!=0 .. 実際の計算の前に,スカラ値は配列と同じ型に変換されます.また,浮動小数点型配列の場合は,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. 以下のサンプルでは,最上位ビットをクリアすることによって浮動小数点型配列の要素の絶対値を求める方法を示しています: .. code-block:: c 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(" .. このコードは,次のような結果を出力します: .. code-block:: c 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 .. .. index:: Avg .. _Avg: Avg --- `id=0.664853636959 Comments from the Wiki `__ .. cfunction:: CvScalar cvAvg(const CvArr* arr, const CvArr* mask=NULL) 配列の要素の平均値を求めます. :param arr: 配列. :param mask: オプションである処理マスク. この関数は,各チャンネル毎に配列要素値の平均 ``M`` を求めます: .. math:: \begin{array}{l} N = \sum _I ( \texttt{mask} (I) \ne 0) \\ M_c = \frac{\sum_{I, \, \texttt{mask}(I) \ne 0} \texttt{arr} (I)_c}{N} \end{array} 配列が ``IplImage`` で COI が設定されている場合,この関数は指定されたチャンネルのみを処理し,その結果を戻り値の ``CvScalar`` の 1 番目の要素 :math:`S_0` に格納します. .. index:: AvgSdv .. _AvgSdv: AvgSdv ------ `id=0.906613465167 Comments from the Wiki `__ .. cfunction:: void cvAvgSdv(const CvArr* arr, CvScalar* mean, CvScalar* stdDev, const CvArr* mask=NULL) 配列の要素の平均値と標準偏差を求めます. :param arr: 配列. :param mean: 平均値を出力する変数へのポインタ.必要なければ NULL でも構いません. :param stdDev: 標準偏差を出力する変数へのポインタ. :param mask: オプションである処理マスク. この関数は,各チャンネル毎に配列要素の平均値と標準偏差を求めます: .. math:: \begin{array}{l} N = \sum _I ( \texttt{mask} (I) \ne 0) \\ mean_c = \frac{1}{N} \, \sum _{ I, \, \texttt{mask} (I) \ne 0} \texttt{arr} (I)_c \\ stdDev_c = \sqrt{\frac{1}{N} \, \sum_{ I, \, \texttt{mask}(I) \ne 0} ( \texttt{arr} (I)_c - mean_c)^2} \end{array} 配列が ``IplImage`` で COI が設定されている場合,この関数は指定されたチャンネルのみを処理し,その結果(平均,標準偏差)を出力変数の1番目の要素 :math:`mean_0` , :math:`stdDev_0` に格納します. .. index:: CalcCovarMatrix .. _CalcCovarMatrix: CalcCovarMatrix --------------- `id=0.635477639429 Comments from the Wiki `__ .. cfunction:: void cvCalcCovarMatrix( const CvArr** vects, int count, CvArr* covMat, CvArr* avg, int flags) ベクトル集合の分散共分散行列を求めます. :param vects: 入力ベクトルの配列,これらのベクトルは全て同じ型,同じサイズでなければいけません.ベクトルは 1 次元である必要はなく,2次元(例えば,画像)などでも構いません. :param count: 入力ベクトルの個数. :param covMat: 出力である分散共分散行列,浮動小数点型の正方行列でなければいけません. :param avg: 入力あるいは出力(flags に依存する)配列 - 入力ベクトルの平均ベクトル. :param flags: 処理フラグ.以下の値の組み合わせ. * **CV_COVAR_SCRAMBLED** 分散共分散行列が以下のように計算されます: .. math:: \texttt{scale} * [ \texttt{vects} [0]- \texttt{avg} , \texttt{vects} [1]- \texttt{avg} ,...]^T \cdot [ \texttt{vects} [0]- \texttt{avg} , \texttt{vects} [1]- \texttt{avg} ,...] , つまり,この分散共分散行列は :math:`\texttt{count} \times \texttt{count}` の行列となります.このような一般的ではない分散共分散行列は,非常に大きなベクトル集合に対する高速なPCAのために利用されます(例えば,顔認識のための固有顔).この「スクランブルされた」行列の固有値は,真の分散共分散行列の固有値と一致します.また,「真の」固有ベクトルは「スクランブルされた」分散共分散行列の固有ベクトルから容易に求めることができます. * **CV_COVAR_NORMAL** 分散共分散行列が以下のように計算されます: .. math:: \texttt{scale} * [ \texttt{vects} [0]- \texttt{avg} , \texttt{vects} [1]- \texttt{avg} ,...] \cdot [ \texttt{vects} [0]- \texttt{avg} , \texttt{vects} [1]- \texttt{avg} ,...]^T , つまり, ``covMat`` は各入力ベクトルの要素数と同じ次数をもつ通常の分散共分散行列となります. ``CV_COVAR_SCRAMBLED`` と ``CV_COVAR_NORMAL`` のどちらかは必ず指定される必要があります. * **CV_COVAR_USE_AVG** このフラグが指定された場合,平均 ``avg`` を計算せずに,代わりに ``avg`` で指定された平均ベクトルを用います.これは,平均 ``avg`` が何らかの方法で既に計算されている場合や,分散共分散行列が部分的に計算されている場合(この場合も ``avg`` は入力ベクトルの一部の平均ではなく,すべてのベクトルの平均)に役立ちます. * **CV_COVAR_SCALE** このフラグが指定された場合,分散共分散行列はスケーリングされます. ``CV_COVAR_NORMAL`` モードでは ``scale`` は '1./count' となり, ``CV_COVAR_SCRAMBLED`` モードでは, ``scale`` は入力ベクトルの要素数の逆数となります.デフォルト(このフラグが指定されない場合)では,分散共分散行列はスケーリングされません(つまり,'scale=1'). * **CV_COVAR_ROWS** すべての入力ベクトルが1つの行列 ``vects[0]`` の行として格納されている状態を表します.この場合, ``count`` は無視され, ``avg`` は適切なサイズの1チャンネル行ベクトルでなければいけません. * **CV_COVAR_COLS** すべての入力ベクトルが1つの行列 ``vects[0]`` の列として格納されている状態を表します.この場合, ``count`` は無視され, ``avg`` は適切なサイズの1チャンネル列ベクトルでなければいけません. この関数は,分散共分散行列を求め,必要ならば入力ベクトル集合の平均ベクトルも計算します. これは,PCA や マハラノビス距離によるベクトル同士の比較などに用いられます. .. index:: CartToPolar .. _CartToPolar: CartToPolar ----------- `id=0.165383163511 Comments from the Wiki `__ .. cfunction:: void cvCartToPolar( const CvArr* x, const CvArr* y, CvArr* magnitude, CvArr* angle=NULL, int angleInDegrees=0) 2 次元ベクトルの大きさと角度を求めます. :param x: x 座標の配列. :param y: y 座標の配列. :param magnitude: 入力ベクトルの大きさが代入される出力配列,大きさが不要ならば NULL でも構いません. :param angle: 入力ベクトルの角度を代入する出力配列,角度が不要ならば NULL でも構いません.角度はラジアン( :math:`0` から :math:`2 \pi` ),または度( :math:`0` から :math:`360` )で表されます. :param angleInDegrees: 出力である角度をデフォルトの「ラジアン」で表現するか,あるいは「度」で表現するかを指定するフラグ. この関数は,2 次元ベクトル (x(I),y(I)) の大きさか角度のどちらか,あるいは両方を求めます: .. code-block:: c magnitude(I)=sqrt(x(I)^2^+y(I)^2^ ), angle(I)=atan(y(I)/x(I) ) .. この角度は,0.1 度の精度で計算されます.また,(0,0) の点では,角度は 0 にセットされます. .. index:: Cbrt .. _Cbrt: Cbrt ---- `id=0.797139685597 Comments from the Wiki `__ .. cfunction:: float cvCbrt(float value) 立方根を求めます. :param value: 浮動小数点型の入力値. この関数は,引数で与えられた入力値の立方根を求めます.また通常, ``pow(value,1./3`` よりも高速であり,負の入力値も適切に扱うことができます.しかし,特別な値( :math:`\pm \infty` , NaN )は扱うことができません. .. index:: ClearND .. _ClearND: ClearND ------- `id=0.236557372111 Comments from the Wiki `__ .. cfunction:: void cvClearND(CvArr* arr, int* idx) 指定された配列要素をクリアします. :param arr: 入力配列. :param idx: 要素を指定するインデックスの配列. 関数 :ref:`ClearND` は,密な配列および疎な配列の指定された要素をクリア(値に 0 をセット)します.指定された要素が存在しなければ何もしません. .. index:: CloneImage .. _CloneImage: CloneImage ---------- `id=0.512687527505 Comments from the Wiki `__ .. cfunction:: IplImage* cvCloneImage(const IplImage* image) ヘッダ,データ,ROIを含む,画像の完全なコピーを作成します. :param image: オリジナル画像. 戻り値の ``IplImage*`` は,コピーされた画像へのポインタです. .. index:: CloneMat .. _CloneMat: CloneMat -------- `id=0.535496204121 Comments from the Wiki `__ .. cfunction:: CvMat* cvCloneMat(const CvMat* mat) 行列の完全なコピーを作成します. :param mat: コピーされる行列. 行列の完全なコピーを作成し,そのコピーへのポインタを返します. .. index:: CloneMatND .. _CloneMatND: CloneMatND ---------- `id=0.579189105747 Comments from the Wiki `__ .. cfunction:: CvMatND* cvCloneMatND(const CvMatND* mat) 多次元の配列の完全なコピーを作成し,そのポインタを返します. :param mat: 入力配列. .. index:: CloneSparseMat .. _CloneSparseMat: CloneSparseMat -------------- `id=0.0355358507946 Comments from the Wiki `__ .. cfunction:: CvSparseMat* cvCloneSparseMat(const CvSparseMat* mat) 疎な配列の完全なコピーを作成します. :param mat: 入力配列. この関数は,入力配列のコピーを作成しそのポインタを返します. .. index:: Cmp .. _Cmp: Cmp --- `id=0.259141716548 Comments from the Wiki `__ .. cfunction:: void cvCmp(const CvArr* src1, const CvArr* src2, CvArr* dst, int cmpOp) 2 つの配列の要素毎の比較を行います. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列.入力配列は,どちらもシングルチャンネルでなければいけません. :param dst: 出力配列.これは 8u か 8s 型でなければいけません. :param CmpOp: 要素同士の関係を指定するフラグ * **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) "と等しくない". この関数は,2 つの配列の対応する 2 つの要素同士を比較し,その結果に応じた値でマスク配列を埋めます: .. code-block:: c dst(I)=src1(I) op src2(I), .. 比較結果が真であれば, ``dst(I)`` に 0xff(全てのビットが ``1`` )がセットされ,そうでなければ 0 がセットされます.出力配列を除くすべての入力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: CmpS .. _CmpS: CmpS ---- `id=0.455271477 Comments from the Wiki `__ .. cfunction:: void cvCmpS(const CvArr* src, double value, CvArr* dst, int cmpOp) スカラ値と配列の要素毎の比較を行います. :param src: 入力配列,シングルチャンネルでなければいけません. :param value: 入力配列の各要素と比較されるスカラ値. :param dst: 出力配列.これは 8u か 8s 型でなければいけません. :param cmpOp: 要素同士の関係を指定するフラグ * **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 "と等しくない". この関数は,配列の要素とスカラ値を比較し,その結果に応じた値でマスク配列を埋めます: .. code-block:: c dst(I)=src(I) op scalar .. ここで ``op`` は :math:`=` , :math:`>` , :math:`\ge` , :math:`<` , :math:`\le` , :math:`\ne` のいずれかです. 比較結果が真であれば, ``dst(I)`` に 0xff(全てのビットが ``1`` )がセットされ,そうでなければ 0 がセットされます.出力配列を除くすべての入力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: ConvertScale .. _ConvertScale: ConvertScale ------------ `id=0.863874425513 Comments from the Wiki `__ .. cfunction:: void cvConvertScale(const CvArr* src, CvArr* dst, double scale=1, double shift=0) 配列に対して任意の線形変換を行います. .. code-block:: c #define cvCvtScale cvConvertScale #define cvScale cvConvertScale #define cvConvert(src, dst ) cvConvertScale((src), (dst), 1, 0 ) .. :param src: 入力配列. :param dst: 出力配列. :param scale: スケール係数. :param shift: スケーリングされた入力配列要素に加えられる値. 関数 ``cvConvertScale`` には,使用目的に応じた複数の別名があります.この関数は,入力配列に対して任意のスケーリングと任意の変換(あるいは任意の変換のみ)を行い,結果を出力配列にコピーします: .. math:: \texttt{dst} (I) = \texttt{scale} \texttt{src} (I) + ( \texttt{shift} _0, \texttt{shift} _1,...) マルチチャンネル配列のチャンネルはすべて,個別に処理されます. 変換の種類によっては,丸めや飽和を伴う場合があります.つまり,スケーリング+変換の結果が,出力配列の要素の型で正確に表現できない場合,実軸上でもっとも近い表現可能な値が出力として用いられます. ``scale=1, shift=0`` の場合には,スケーリングは行われません.これは,特別に最適化されたケースであり,それに適した別名 :ref:`Convert` を持ちます.入出力配列が同じ種類である場合も,行列や画像のスケーリングや移動を行うことができる特別なケースであり, :ref:`Scale` と呼ばれます. .. index:: ConvertScaleAbs .. _ConvertScaleAbs: ConvertScaleAbs --------------- `id=0.689761773197 Comments from the Wiki `__ .. cfunction:: void cvConvertScaleAbs(const CvArr* src, CvArr* dst, double scale=1, double shift=0) 入力配列の要素を,任意の線形変換によって 8 ビット符号なし整数に変換します. :param src: 入力配列. :param dst: 出力配列(ビット深度は 8u). :param scale: 絶対値スケール係数. :param shift: スケーリングされた入力配列要素に加えられる値. この関数は, :ref:`ConvertScale` と似ていますが,変換結果の絶対値を保存します. .. math:: \texttt{dst} (I) = | \texttt{scale} \texttt{src} (I) + ( \texttt{shift} _0, \texttt{shift} _1,...)| この関数は,8u(8 ビット,符号なし整数)型の出力配列のみをサポートします. その他の型の場合は, :ref:`ConvertScale` と :ref:`Abs` の組み合わせることで,この関数をエミュレートできます. .. index:: CvtScaleAbs .. _CvtScaleAbs: CvtScaleAbs ----------- `id=0.638793967727 Comments from the Wiki `__ .. cfunction:: void cvCvtScaleAbs(const CvArr* src, CvArr* dst, double scale=1, double shift=0) 入力配列の要素を,別の 8 ビット,符号なし整数に変換します.オプションで,さらに線形変換を行うこともできます. :param src: 入力配列. :param dst: 出力配列(ビット深度は 8u でなければいけません). :param scale: ScaleAbs ファクタ. :param shift: スケーリングされた入力配列要素に足される値. この関数は, :ref:`ConvertScale` と似ていますが,変換結果の絶対値を出力します: .. math:: \texttt{dst} (I) = | \texttt{scale} \texttt{src} (I) + ( \texttt{shift} _0, \texttt{shift} _1,...)| この関数は,出力配列として 8u(8ビット符号なし整数)型の配列のみをサポートします.その他の型の場合は, :ref:`ConvertScale` と :ref:`Abs` を組み合わせることで,この関数と同等の結果を得られます. .. index:: Copy .. _Copy: Copy ---- `id=0.845891407779 Comments from the Wiki `__ .. cfunction:: void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL) 配列をコピーします. :param src: コピー元の配列. :param dst: コピー先の配列. :param mask: 8 ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,入力配列の選択された要素を出力配列にコピーします: .. math:: \texttt{dst} (I)= \texttt{src} (I) \quad \text{if} \quad \texttt{mask} (I) \ne 0. 引数配列に ``IplImage`` が含まれる場合,その ROI と COI が利用されます.コピー元配列とコピー先配列は,同じ型,同じ次元,同じサイズでなければいけません.また,この関数は疎な配列もコピーできます(が,その場合マスクはサポートされません). .. index:: CountNonZero .. _CountNonZero: CountNonZero ------------ `id=0.708107740298 Comments from the Wiki `__ .. cfunction:: int cvCountNonZero(const CvArr* arr) 配列中の 0 ではない要素を数えます. :param arr: シングルチャンネルの配列,あるいは COI が設定されたマルチチャンネル画像. この関数は, ``arr`` 中の 0 ではない要素数を返します: .. math:: \sum _I ( \texttt{arr} (I) \ne 0) ``IplImage`` の場合は,ROI と COI がサポートされます. .. index:: CreateData .. _CreateData: CreateData ---------- `id=0.404226770317 Comments from the Wiki `__ .. cfunction:: void cvCreateData(CvArr* arr) 配列データ領域を確保します. :param arr: 配列のヘッダ. この関数は,画像,行列あるいは多次元配列のデータの割り当てを行います.行列の場合は OpenCV の割り当て関数が用いられます.IplImage の場合も OpenCV の関数が用いられますが, ``CV_TURN_ON_IPL_COMPATIBILITY`` が呼ばれている場合は例外的に,IPL 関数によってデータ領域が割り当てられます. .. index:: CreateImage .. _CreateImage: CreateImage ----------- `id=0.0318672298611 Comments from the Wiki `__ .. cfunction:: IplImage* cvCreateImage(CvSize size, int depth, int channels) 画像ヘッダを作成し,データ領域を割り当てます. :param size: 画像の幅と高さ. :param depth: 画像のビット深度.有効な値は, :ref:`IplImage` を参照してください. :param channels: ピクセル毎のチャンネル数.詳しくは :ref:`IplImage` を参照してください.この関数は,インタリーブチャンネルの画像のみを作成できます. この関数呼び出しは,以下の形式を短縮したものです. .. code-block:: c header = cvCreateImageHeader(size, depth, channels); cvCreateData(header); .. .. index:: CreateImageHeader .. _CreateImageHeader: CreateImageHeader ----------------- `id=0.752549370062 Comments from the Wiki `__ .. cfunction:: IplImage* cvCreateImageHeader(CvSize size, int depth, int channels) 画像ヘッダを作成しますが,データ領域の割り当ては行いません. :param size: 画像の幅と高さ. :param depth: ビット深度( :ref:`CreateImage` を参照してください). :param channels: チャンネル数( :ref:`CreateImage` を参照してください). この関数呼び出しは,以下の形式に似ています. .. code-block:: c 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`` を参照してください). .. index:: CreateMat .. _CreateMat: CreateMat --------- `id=0.559930646579 Comments from the Wiki `__ .. cfunction:: CvMat* cvCreateMat( int rows, int cols, int type) 行列のヘッダを作成し,データ領域を割り当てます. :param rows: 行列の行数. :param cols: 行列の列数. :param type: ``CV_C`` で表される,行列の要素の型.ここで,S=signed:符号あり,U=unsigned:符号なし,F=float:浮動小数点型,をそれぞれ表します.例えば CV _ 8UC1 は,8ビット符号なしでシングルチャンネルの要素を意味し,CV _ 32SC2 は,32ビット符号ありで2チャンネルの要素を意味します. これは,以下の形式の簡略形と言えます: .. code-block:: c CvMat* mat = cvCreateMatHeader(rows, cols, type); cvCreateData(mat); .. .. index:: CreateMatHeader .. _CreateMatHeader: CreateMatHeader --------------- `id=0.9751429713 Comments from the Wiki `__ .. cfunction:: CvMat* cvCreateMatHeader( int rows, int cols, int type) 行列のデータ領域を割り当てずに,行列のヘッダのみを作成します. :param rows: 行列の行数. :param cols: 行列の列数. :param type: 行列の要素の種類, :ref:`CreateMat` を参照してください. この関数は,新しい行列のヘッダを作成し,そのポインタを返します.行列データは, :ref:`CreateData` を用いて割り当てを行うか,あるいは,ユーザが割り当てしたデータを :ref:`SetData` によって明示的にセットします. .. index:: CreateMatND .. _CreateMatND: CreateMatND ----------- `id=0.421534902068 Comments from the Wiki `__ .. cfunction:: CvMatND* cvCreateMatND( int dims, const int* sizes, int type) 多次元の密な配列のヘッダを作成し,データ領域を割り当てます. :param dims: 配列の次元数.この値は, CV _ MAX _ DIM (デフォルトでは32ですが,ビルド時に変更される可能性もあります)を越えてはいけません. :param sizes: 各次元のサイズを表す配列. :param type: 配列の要素の種類, :ref:`CreateMat` を参照してください. これは,以下の形式を短縮したものです: .. code-block:: c CvMatND* mat = cvCreateMatNDHeader(dims, sizes, type); cvCreateData(mat); .. .. index:: CreateMatNDHeader .. _CreateMatNDHeader: CreateMatNDHeader ----------------- `id=0.166751507142 Comments from the Wiki `__ .. cfunction:: CvMatND* cvCreateMatNDHeader( int dims, const int* sizes, int type) 行列のデータ領域を割り当てずに,行列のヘッダのみを作成します. :param dims: 配列の次元数. :param sizes: 各次元のサイズを表す配列. :param type: 配列の要素の種類, :ref:`CreateMat` を参照してください. この関数は,多次元の密な配列のヘッダを確保します.配列データは, :ref:`CreateData` を用いて割り当てるか,あるいは,ユーザが割り当てたデータを :ref:`SetData` によって明示的にセットします. .. index:: CreateSparseMat .. _CreateSparseMat: CreateSparseMat --------------- `id=0.264306154009 Comments from the Wiki `__ .. cfunction:: CvSparseMat* cvCreateSparseMat(int dims, const int* sizes, int type) 疎な配列を作成します. :param dims: 配列の次元数.密行列の場合とは逆に,次元数は実質的に無制限( :math:`2^{16}` まで)です. :param sizes: 各次元のサイズを表す配列. :param type: 配列の要素の種類.CvMat の場合と同じです. この関数は,多次元の疎な配列を確保します.この配列は,初期状態では要素を持ちません.つまり, :ref:`Get` :ref:`GetReal` は,全インデックスに対して 0 を返します. .. index:: CrossProduct .. _CrossProduct: CrossProduct ------------ `id=0.596758582295 Comments from the Wiki `__ .. cfunction:: void cvCrossProduct(const CvArr* src1, const CvArr* src2, CvArr* dst) 2 つの 3 次元ベクトルの外積を求めます. :param src1: 1 番目の入力ベクトル. :param src2: 2 番目の入力ベクトル. :param dst: 出力ベクトル. この関数は,2 つの 3 次元ベクトルの外積を求めます: .. math:: \texttt{dst} = \texttt{src1} \times \texttt{src2} あるいは: .. math:: \begin{array}{l} \texttt{dst} _1 = \texttt{src1} _2 \texttt{src2} _3 - \texttt{src1} _3 \texttt{src2} _2 \\ \texttt{dst} _2 = \texttt{src1} _3 \texttt{src2} _1 - \texttt{src1} _1 \texttt{src2} _3 \\ \texttt{dst} _3 = \texttt{src1} _1 \texttt{src2} _2 - \texttt{src1} _2 \texttt{src2} _1 \end{array} CvtPixToPlane ------------- :ref:`Split` と同義です. .. index:: DCT .. _DCT: DCT --- `id=0.63049622259 Comments from the Wiki `__ .. cfunction:: void cvDCT(const CvArr* src, CvArr* dst, int flags) 1 次元あるいは 2 次元浮動小数点型配列に対して,離散コサイン変換(DCT),逆離散コサイン変換(IDCT)を行います. :param src: 入力配列,1次元配列または2次元の,実数の配列. :param dst: 出力配列,入力配列と同じサイズ,同じ型. :param flags: 変換フラグ,以下の値の組み合わせ: * **CV_DXT_FORWARD** 1 次元あるいは 2 次元の順変換を行います. * **CV_DXT_INVERSE** 1 次元あるいは 2 次元の逆変換を行います. * **CV_DXT_ROWS** 入力配列のそれぞれの行に対して独立に,順変換あるいは逆変換を行います.このフラグによって,複数ベクトルの同時変換が可能になります.また,オーバーヘッド(ベクトルが大量にあると,計算自体の何倍も時間がかかることもあります)を減らし,3 次以上の高次元に対して変換を行うことができるようになります. この関数は,1 次元あるいは 2 次元浮動小数点型配列に対して,離散コサイン変換,逆離散コサイン変換を行います. N 個の要素を持つ 1 次元ベクトルに対するコサイン変換: .. math:: Y = C^{(N)} \cdot X ここで .. math:: C^{(N)}_{jk}= \sqrt{\alpha_j/N} \cos \left ( \frac{\pi(2k+1)j}{2N} \right ) および :math:`\alpha_0=1` , :math:`\alpha_j=2` for :math:`j > 0` です. N 個の要素を持つ 1 次元ベクトルに対する逆コサイン変換: .. math:: X = \left (C^{(N)} \right )^{-1} \cdot Y = \left (C^{(N)} \right )^T \cdot Y ( :math:`C^{(N)}` は直行行列なので, :math:`C^{(N)} \cdot \left(C^{(N)}\right)^T = I` ) :math:`M \times N` の 2 次元行列に対するコサイン変換: .. math:: Y = C^{(N)} \cdot X \cdot \left (C^{(N)} \right )^T :math:`M \times N` 個の要素を持つ 2 次元ベクトルに対する逆コサイン変換: .. math:: X = \left (C^{(N)} \right )^T \cdot X \cdot C^{(N)} .. index:: DFT .. _DFT: DFT --- `id=0.369533424601 Comments from the Wiki `__ .. cfunction:: void cvDFT(const CvArr* src, CvArr* dst, int flags, int nonzeroRows=0) 1 次元あるいは 2 次元浮動小数点型配列に対して,離散フーリエ変換(DFT),逆離散フーリエ変換(IDFT)を行います. :param src: 入力配列,実数あるいは複素数. :param dst: 出力配列,入力配列と同じサイズ,同じ型. :param flags: 変換フラグ,以下の値の組み合わせ: * **CV_DXT_FORWARD** 1次元または2次元の順変換を行います.結果のスケーリングは行われません. * **CV_DXT_INVERSE** 1次元または2次元の逆変換を行います.結果のスケーリングは行われません. ``CV_DXT_FORWARD`` と ``CV_DXT_INVERSE`` は,もちろん同時には指定できません. * **CV_DXT_SCALE** 結果を配列要素数で割ってスケーリングします.通常は ``CV_DXT_INVERSE`` と同時に用います.これのショートカットとして ``CV_DXT_INV_SCALE`` を用いても構いません. * **CV_DXT_ROWS** 入力配列のそれぞれの行に対して独立に,順変換あるいは逆変換を行います.このフラグによって,複数ベクトルの同時変換が可能になります.また,オーバーヘッド(ベクトルが大量にあると,計算自体の何倍も時間がかかることもあります)を減らし,3次以上の高次元に対して変換を行うことができるようになります. * **CV_DXT_INVERSE_SCALE** ``CV_DXT_INVERSE + CV_DXT_SCALE`` と等価です. :param nonzeroRows: 入力配列中の,0 ではない行の数(2 次元順変換の場合),あるいは出力配列中の注目する行の数(2 次元逆変換の場合).値が 0 以下の場合,あるいは行の総数よりも大きい場合,この引数は無視されます.このパラメータを指定すると,DFT を利用して 2 次元の畳み込みや相関演算を高速に行うことができます.詳しくは,以下のサンプルを参照してください この関数は,1 次元あるいは 2 次元浮動小数点型配列に対して,離散フーリエ変換,逆離散フーリエ変換を行います: N 個の要素を持つ 1 次元ベクトルに対するフーリエ変換: .. math:: y = F^{(N)} \cdot x, where F^{(N)}_{jk}=exp(-i \cdot 2 \pi \cdot j \cdot k/N) , .. math:: i=sqrt(-1) N 個の要素を持つ 1 次元ベクトルに対する逆フーリエ変換: .. math:: x'= (F^{(N)})^{-1} \cdot y = conj(F^(N)) \cdot y x = (1/N) \cdot x M :math:`\times` N 個の要素を持つ 2 次元ベクトルに対するフーリエ変換: .. math:: Y = F^{(M)} \cdot X \cdot F^{(N)} M :math:`\times` N 個の要素を持つ 2 次元ベクトルに対する逆フーリエ変換: .. math:: X'= conj(F^{(M)}) \cdot Y \cdot conj(F^{(N)}) X = (1/(M \cdot N)) \cdot X' 実数データ(シングルチャンネル)の場合,フーリエ変換の出力や逆変換の入力を表現するために,IPL 形式の packed フォーマットが用いられます: .. math:: \begin{bmatrix} Re Y_{0,0} & Re Y_{0,1} & Im Y_{0,1} & Re Y_{0,2} & Im Y_{0,2} & \cdots & Re Y_{0,N/2-1} & Im Y_{0,N/2-1} & Re Y_{0,N/2} \\ Re Y_{1,0} & Re Y_{1,1} & Im Y_{1,1} & Re Y_{1,2} & Im Y_{1,2} & \cdots & Re Y_{1,N/2-1} & Im Y_{1,N/2-1} & Re Y_{1,N/2} \\ Im Y_{1,0} & Re Y_{2,1} & Im Y_{2,1} & Re Y_{2,2} & Im Y_{2,2} & \cdots & Re Y_{2,N/2-1} & Im Y_{2,N/2-1} & Im Y_{1,N/2} \\ \hdotsfor{9} \\ Re Y_{M/2-1,0} & Re Y_{M-3,1} & Im Y_{M-3,1} & \hdotsfor{3} & Re Y_{M-3,N/2-1} & Im Y_{M-3,N/2-1}& Re Y_{M/2-1,N/2} \\ Im Y_{M/2-1,0} & Re Y_{M-2,1} & Im Y_{M-2,1} & \hdotsfor{3} & Re Y_{M-2,N/2-1} & Im Y_{M-2,N/2-1}& Im Y_{M/2-1,N/2} \\ Re Y_{M/2,0} & Re Y_{M-1,1} & Im Y_{M-1,1} & \hdotsfor{3} & Re Y_{M-1,N/2-1} & Im Y_{M-1,N/2-1}& Re Y_{M/2,N/2} \end{bmatrix} 注意: ``N`` が偶数ならば最終列が存在し, ``M`` が偶数ならば最終行が存在します. また,1 次元実数データを変換する場合,その結果は上述の行列の 1 行目のようになります. ここでは,DFT を用いた 2 次元畳み込演算の例を示します. .. code-block:: c 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); .. .. index:: DecRefData .. _DecRefData: DecRefData ---------- `id=0.4739091925 Comments from the Wiki `__ .. cfunction:: void cvDecRefData(CvArr* arr) 配列データの参照カウンタをデクリメントします. :param arr: 配列のヘッダへのポインタ. この関数は, :ref:`CvMat` や :ref:`CvMatND` のデータの参照カウンタをデクリメントします.カウンタが 0 になった場合,そのデータは解放されます.現在の実装では,参照カウンタが NULL 以外の値をとるのは,データが関数 :ref:`CreateData` によって確保された場合のみです.その他の場合でカウンタが NULL になるケースは以下のとおりです: :ref:`SetData` によって外部データがヘッダに割り当てられた場合,行列のヘッダがより大きな画像や行列の一部になっている場合,ヘッダが画像や n-次元の行列ヘッダから変換された場合. .. index:: Det .. _Det: Det --- `id=0.65739341282 Comments from the Wiki `__ .. cfunction:: double cvDet(const CvArr* mat) 行列式を返します. :param mat: 入力行列. 関数 ``cvDet`` は,正方行列 ``mat`` の行列式を返します.小さい行列には直接的な方法が,大きい行列にはガウスの消去法が用いられます.正定値対称行列の場合は, :math:`U = V = 0` として :ref:`SVD` を行い, :math:`W` の対角要素の積として行列式を計算することもできます. .. index:: Div .. _Div: Div --- `id=0.47637726973 Comments from the Wiki `__ .. cfunction:: void cvDiv(const CvArr* src1, const CvArr* src2, CvArr* dst, double scale=1) 2 つの配列の要素毎の割り算を行います. :param src1: 1 番目の入力配列.これが NULL の場合,配列は全ての要素が1であると仮定されます. :param src2: 2 番目の入力配列. :param dst: 出力配列. :param scale: オプションであるスケール係数. この関数は,1 つの配列をもう 1 つの配列で割ります: .. math:: \texttt{dst} (I)= \fork{\texttt{scale} \cdot \texttt{src1}(I)/\texttt{src2}(I)}{if \texttt{src1} is not \texttt{NULL}}{\texttt{scale}/\texttt{src2}(I)}{otherwise} すべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: DotProduct .. _DotProduct: DotProduct ---------- `id=0.222828665939 Comments from the Wiki `__ .. cfunction:: double cvDotProduct(const CvArr* src1, const CvArr* src2) 2つの配列のユークリッド内積を計算します. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. この関数は,2 つの配列のユークリッド内積を計算して返します. .. math:: src1 \bullet src2 = \sum _I ( \texttt{src1} (I) \texttt{src2} (I)) マルチチャンネル配列の場合,すべてのチャンネルの結果が足し合わされます.特に, ``cvDotProduct(a,a)`` ( ``a`` は複素ベクトル)の場合は :math:`||\texttt{a}||^2` を返します. この関数は,多次元配列を,行毎,レイヤー毎,に処理することができます. .. index:: EigenVV .. _EigenVV: EigenVV ------- `id=0.211468999835 Comments from the Wiki `__ .. cfunction:: void cvEigenVV( CvArr* mat, CvArr* evects, CvArr* evals, double eps=0, int lowindex = -1, int highindex = -1) 対称行列の固有値と固有ベクトルを求めます. :param mat: 入力となる対称行列,関数の処理中に値が変更されます. :param evects: 固有ベクトルを表す出力行列,ベクトルは連続した行として格納されます. :param evals: 固有値を表す出力ベクトル,値は降順に格納されます(もちろん,固有値と固有ベクトルの順番は一致します). :param eps: 対角化の精度.一般的に, ``DBL_EPSILON`` (約 :math:`10^{-15}` ) で十分です.このパラメータは,現在は無視されます. :param lowindex: オプション.計算される最大の固有値/固有ベクトルのインデックス(下記を参照してください). :param highindex: オプション.計算される最小の固有値/固有ベクトルのインデックス(下記を参照してください). この関数は,行列 ``A`` の固有値と固有ベクトルを求めます: .. code-block:: c mat*evects(i,:)' = evals(i)*evects(i,:)' (in MATLAB notation) .. lowindex あるいは highindex の一方が与えられると,もう片方も必要になります.また,このインデックスは,0 から始まります. 例えば,最大の固有値/固有ベクトルを計算する場合は, ``lowindex=highindex=0`` をセットします. また,すべての固有値を計算する場合は, ``lowindex=highindex=-1`` のままにしておきます. 過去の経緯から,この関数は常に入力行列と同じサイズの正方行列(固有ベクトルから構成)と,入力行列と同じ長さのベクトル(固有値から構成)を返します. インデックスで選択された固有値/固有ベクトルは,常に最初の highindex - lowindex + 1 行目に格納されます. 行列 ``A`` の内容は,この関数によって破壊されます. 今のところ,この関数は :ref:`SVD` よりも遅く,精度も低いです.よって, ``A`` が正定値行列(例えば,分散共分散行列など)であることが既知である場合に,その固有値と固有ベクトルを計算するには(固有ベクトルが必要とされない場合は特に) :ref:`SVD` を用いることが推奨されます. .. index:: Exp .. _Exp: Exp --- `id=0.560790966598 Comments from the Wiki `__ .. cfunction:: void cvExp(const CvArr* src, CvArr* dst) 各配列要素を指数として,自然対数の底(ネイピア数)e のべき乗を求めます. :param src: 入力配列. :param dst: 出力配列, ``double`` 型,あるいは入力配列と同じ型. この関数は,入力配列の各要素に対して,それを指数とする自然対数の底 e のべき乗を求めます: .. math:: \texttt{dst} [I] = e^{ \texttt{src} (I)} 最大誤差は約 :math:`7 \times 10^{-6}` です.現在の実装では,指数表現されない(非正規化)浮動小数点数は 0 に変換されて出力されます. .. index:: FastArctan .. _FastArctan: FastArctan ---------- `id=0.127625717419 Comments from the Wiki `__ .. cfunction:: float cvFastArctan(float y, float x) 2 次元ベクトルの角度を求めます. :param x: 2 次元ベクトルの X 座標. :param y: 2 次元ベクトルの y 座標. 関数 ``cvFastArctan`` は,2 次元ベクトルの角度を求めます.この角度は 0 度から 360 度の間に値をとり,精度は約 0.1 度です. .. index:: Flip .. _Flip: Flip ---- `id=0.469342460508 Comments from the Wiki `__ .. cfunction:: void cvFlip(const CvArr* src, CvArr* dst=NULL, int flipMode=0) 2 次元配列を垂直,水平,または両軸で反転します. :param src: 入力配列. :param dst: 出力配列, :math:`\texttt{dst} = \texttt{NULL}` の場合は,置換モード(処理後の値が入力変数に代入される)で反転されます. :param flipMode: 配列の反転軸の指定:0 は x-軸周りでの反転,正値(例えば,1)は y-軸周りでの反転,負値(例えば,-1)は 両軸周りでの反転を表します.以下の式と説明も参照してください: この関数は,3種の中から1つ選択された方法で配列を反転させます(行と列のインデックスは 0 が基準): .. math:: dst(i,j) = \forkthree{\texttt{src}(rows(\texttt{src})-i-1,j)}{if $\texttt{flipMode} = 0$}{\texttt{src}(i,cols(\texttt{src})-j-1)}{if $\texttt{flipMode} > 0$}{\texttt{src}(rows(\texttt{src})-i-1,cols(\texttt{src})-j-1)}{if $\texttt{flipMode} < 0$} この関数が利用されるケースとして,以下のような場合が考えられます: * 左上原点画像と左下原点画像の変換をするための画像の上下反転(flipMode = 0).これは,Win32 システム環境下のビデオ画像処理でよく利用されます. * 垂直軸に対する線対称性を調べるための左右反転(flipMode :math:`>` 0),反転後に水平シフトして差の絶対値を計算します. * 中心点に対する点対称性を調べるための上下,左右の同時反転(flipMode :math:`<` 0),反転後にシフトして差の絶対値を計算します. * 1 次元配列の順番を逆転(flipMode > 0) .. index:: GEMM .. _GEMM: GEMM ---- `id=0.988907789773 Comments from the Wiki `__ .. cfunction:: void cvGEMM( const CvArr* src1, const CvArr* src2, double alpha, const CvArr* src3, double beta, CvArr* dst, int tABC=0) .. cfunction:: \#define cvMatMulAdd(src1, src2, src3, dst ) cvGEMM(src1, src2, 1, src3, 1, dst, 0 )\#define cvMatMul(src1, src2, dst ) cvMatMulAdd(src1, src2, 0, dst ) 汎用的な行列の乗算を行います. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param src3: 3 番目の入力配列(シフト用).もしシフトしない場合は NULLにできます. :param dst: 出力配列. :param tABC: 操作フラグ.0 あるいは 以下の値の組み合わせ * **CV_GEMM_A_T** src1 を転置. * **CV_GEMM_B_T** src2 を転置. * **CV_GEMM_C_T** src3 を転置. 例えば, ``CV_GEMM_A_T+CV_GEMM_C_T`` は以下に相当します. .. math:: \texttt{alpha} \, \texttt{src1} ^T \, \texttt{src2} + \texttt{beta} \, \texttt{src3} ^T この関数は,汎用的な行列の乗算を行います: .. math:: \texttt{dst} = \texttt{alpha} \, op( \texttt{src1} ) \, op( \texttt{src2} ) + \texttt{beta} \, op( \texttt{src3} ) \quad \text{where $op(X)$ is $X$ or $X^T$} すべての入力行列は,同じデータ型,適切なサイズでなければいけません.実数あるいは複素数の,浮動小数点型の行列がサポートされます. .. index:: Get?D .. _Get?D: Get?D ----- `id=0.000822283930529 Comments from the Wiki `__ .. cfunction:: 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, int* idx) インデックスで指定された配列要素を返します. :param arr: 入力配列 :param idx0: 要素を指定するインデックスの第 1 成分,0 が基準点. :param idx1: 要素を指定するインデックスの第 2 成分,0 が基準点. :param idx2: 要素を指定するインデックスの第 3 成分,0 が基準点. :param idx: 要素を指定するインデックスの配列 この関数は,指定された配列要素の値を返します.疎な配列で,指定したノードが存在しない場合,この関数は 0 を返します(この関数によって新しいノードは生成されません). .. index:: GetCol(s) .. _GetCol(s): GetCol(s) --------- `id=0.389564344878 Comments from the Wiki `__ .. cfunction:: CvMat* cvGetCol(const CvArr* arr, CvMat* submat, int col) 配列中のある1列,または指定範囲内の複数列を返します. .. cfunction:: CvMat* cvGetCols(const CvArr* arr, CvMat* submat, int startCol, int endCol) :param arr: 入力配列. :param submat: 結果として得られる部分配列へのポインタ. :param col: 選択された列のインデックス,0 が基準点. :param startCol: 指定範囲の最初の(この値を含む)列のインデックス,0 が基準点. :param endCol: 指定範囲の最後の(この値を含まない)列のインデックス,0 が基準点. 関数 ``GetCol`` と ``GetCols`` は,入力配列中の指定した 1 列,あるいは指定した範囲内の複数列に対応するヘッダを返します. ``GetCol`` は, :ref:`GetCols` のショートカットであることに注意してください: .. code-block:: c cvGetCol(arr, submat, col); // ~ cvGetCols(arr, submat, col, col + 1); .. .. index:: GetDiag .. _GetDiag: GetDiag ------- `id=0.829888028713 Comments from the Wiki `__ .. cfunction:: CvMat* cvGetDiag(const CvArr* arr, CvMat* submat, int diag=0) 対角要素の配列を返します. :param arr: 入力配列. :param submat: 結果として得られる部分配列へのポインタ. :param diag: 配列の対角を指定.0 は主対角列に対応し,-1 は主対角列の1つ上の斜め列,1 は主対角列の 1 つ下の斜め列,という様に対応します. この関数は,入力配列中の指定された対角要素に対応するヘッダを返します. cvGetDims, cvGetDimSize ----------------------- 配列の次元数と各次元のサイズ,または指定された次元のサイズを返します. .. cfunction:: int cvGetDims(const CvArr* arr, int* sizes=NULL) .. cfunction:: int cvGetDimSize(const CvArr* arr, int index) :param arr: 入力配列. :param sizes: オプション出力.配列の各次元のサイズを表すベクトル.2次元配列の場合,最初の値は行数(高さ),次の値は列数(幅)を表します. :param index: 次元のインデックス指定,0 が基準点(行列では 0 は行数,1 は列数を表します.画像では 0 は高さ, 1 は幅を表します). 関数 ``cvGetDims`` は,配列の次元数と各次元のサイズを返します. ``IplImage`` や :ref:`CvMat` の場合は,画像や行列の幅に関係なく常に 2 が戻り値になります. 関数 ``cvGetDimSize`` は,指定された次元のサイズ(その次元にいくつの要素が含まれるか)を返します.以下のコードでは,配列の要素数を計算する 2 種類の方法を示します: .. code-block:: c // 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); .. .. index:: GetElemType .. _GetElemType: GetElemType ----------- `id=0.78650555212 Comments from the Wiki `__ .. cfunction:: int cvGetElemType(const CvArr* arr) 配列要素の種類を返します. :param arr: 入力配列. この関数は, :ref:`CreateMat` の説明で述べられた配列要素の種類を返します: ``CV_8UC1`` ... ``CV_64FC4`` . .. index:: GetImage .. _GetImage: GetImage -------- `id=0.549262471081 Comments from the Wiki `__ .. cfunction:: IplImage* cvGetImage(const CvArr* arr, IplImage* imageHeader) 任意の配列に対する画像ヘッダを返します. :param arr: 入力配列. :param imageHeader: テンポラリバッファとして利用される ``IplImage`` 構造体へのポインタ. 関数 ``cvGetImage`` は,入力配列を画像とみなした場合の画像ヘッダを返します. 入力配列になり得るものは,行列 - :ref:`CvMat` と,画像 - ``IplImage*`` です. 入力が画像の場合は,単に入力ポインタをそのまま返します.入力が :ref:`CvMat` の場合は, ``imageHeader`` 構造体を入力行列のパラメータで初期化します. ROI が設定された ``IplImage`` から :ref:`CvMat` への変換を行い,再び CvMat から IplImage に戻した場合,異なるヘッダが返される可能性があります. したがって,画像の長さをその幅とアラインメントから計算するような IPL 関数は,この関数の結果として得られる画像に対しては失敗する可能性があります. .. index:: GetImageCOI .. _GetImageCOI: GetImageCOI ----------- `id=0.890146070947 Comments from the Wiki `__ .. cfunction:: int cvGetImageCOI(const IplImage* image) COI のインデックスを返します. :param image: 画像ヘッダへのポインタ. IplImage の COI を返します.この戻り値は, :ref:`SetImageCOI` の引数 ``coi`` に対応します. .. index:: GetImageROI .. _GetImageROI: GetImageROI ----------- `id=0.543416070792 Comments from the Wiki `__ .. cfunction:: CvRect cvGetImageROI(const IplImage* image) 画像の ROI を返します. :param image: 画像ヘッダへのポインタ. ROI が設定されていない場合は,画像全体を表す ``cvRect(0,0,image->width,image->height)`` が返されます. .. index:: GetMat .. _GetMat: GetMat ------ `id=0.82033287154 Comments from the Wiki `__ .. cfunction:: CvMat* cvGetMat(const CvArr* arr, CvMat* header, int* coi=NULL, int allowND=0) 任意の配列に対する行列ヘッダを返します. :param arr: 入力配列. :param header: テンポラリバッファとして利用される :ref:`CvMat` 構造体へのポインタ. :param coi: オプション出力.COIが格納されます. :param allowND: これが 0 でない場合,この関数は多次元の密な配列(CvMatND*)を扱うことが可能で,その場合,2 次元行列(CvMatND が2次元の場合)あるいは 1 次元行列(CvMatNDが 1 次元,あるいは 2 次元より大きい場合)を返します.配列は連続でなければいけません. この関数は,入力配列を行列とみなした場合の行列ヘッダを返します. 入力配列になり得るものは,行列 - :ref:`CvMat` ,画像 - ``IplImage`` ,多次元の密な配列 :ref:`CvMatND` (これは ``allowND != 0`` の場合のみ)です.入力が行列の場合は,単に入力ポインタをそのまま返します. ``IplImage*`` あるいは :ref:`CvMatND` の場合, ``header`` 構造体を現在の画像 ROI のパラメータで初期化し,そのテンポラリ構造体へのポインタを返します. :ref:`CvMat` では COI がサポートされないので,これは別のオプション出力として返されます. この関数によって,2 種類の配列( ``IplImage`` と :ref:`CvMat` )を簡単に同じコードで扱うことができます.また,関数 :ref:`GetImage` を用いることで, :ref:`CvMat` から ``IplImage`` への逆変換が可能です. 入力配列には,内部データが確保されている,あるいは関連付けられている必要があります.そうでない場合,この関数は失敗します. 入力配列が平面データレイアウト(2 次元 RGB 画像など)を持ち,COI が設定されている ``IplImage`` である場合,この関数は,選択された平面(例えば,色平面 R)へのポインタと COI = 0 を返します.OpenCVの関数を用いて,マルチチャンネル画像の各チャンネル(平面)毎に処理を行う事ができるようになります. .. index:: GetNextSparseNode .. _GetNextSparseNode: GetNextSparseNode ----------------- `id=0.617977840974 Comments from the Wiki `__ .. cfunction:: CvSparseNode* cvGetNextSparseNode(CvSparseMatIterator* matIterator) 疎な配列の,次の要素へのポインタを返します. :param matIterator: 疎な配列のイテレータ. この関数は,イテレータを次の要素へ動かし,そこへのポインタを返します.現在のバージョンでは,個々の要素はハッシュテーブルに保存されているので,それらに特別な順番はありません.以下のサンプルで,疎行列内を繰り返し処理する様子を示します: :ref:`InitSparseMatIterator` と :ref:`GetNextSparseNode` を用いた,浮動小数点型疎行列の総和演算. .. code-block:: c 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 = .. .. index:: GetOptimalDFTSize .. _GetOptimalDFTSize: GetOptimalDFTSize ----------------- `id=0.371704616943 Comments from the Wiki `__ .. cfunction:: int cvGetOptimalDFTSize(int size0) 与えられたベクトルサイズに対する最適な DFT サイズを返します. :param size0: ベクトルサイズ. この関数は,DFT サイズ ``N`` を返します.この ``N`` は,DFT を高速に実行できるサイズのうちで ``size0`` 以上の最小値です.現在の実装では,ある :math:`p` , :math:`q` , :math:`r` に対して :math:`N=2^p \times 3^q \times 5^r` となっています. ``size0`` が大きすぎる( ``INT_MAX`` に非常に近い)場合,この関数は負の値を返します. .. index:: GetRawData .. _GetRawData: GetRawData ---------- `id=0.713319292153 Comments from the Wiki `__ .. cfunction:: void cvGetRawData(const CvArr* arr, uchar** data, int* step=NULL, CvSize* roiSize=NULL) 配列に関する低レベルの情報を取得します. :param arr: 配列のヘッダ. :param data: 出力.画像全体の原点へのポインタ,ROI が設定されている場合には ROI 原点へのポインタ. :param step: 出力.バイト単位で表される行の長さ. :param roiSize: 出力.ROI のサイズ. この関数は,配列データに関する低レベル情報を変数に出力します.すべての出力パラメータは任意であり,あるポインタを ``NULL`` にセットしても構いません.配列が ROI をもつ ``IplImage`` である場合,ROI のパラメータが返されます. 以下に,この関数を用いて配列の要素にアクセスする例を示します. ``cvGetRawData`` を用いて,シングルチャンネル,float 型配列の要素の絶対値を計算します. .. code-block:: c 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]); .. .. index:: GetReal1D .. _GetReal1D: GetReal1D --------- `id=0.26507102953 Comments from the Wiki `__ .. cfunction:: double cvGetReal1D(const CvArr* arr, int idx0) シングルチャンネルの 1 次元配列の,指定された要素を返します. :param arr: 入力配列.シングルチャンネルでなければいけません. :param idx0: 要素を指定するインデックスの第 1 成分,0 が基準点. シングルチャンネル配列の指定された要素を返します. また,配列がマルチチャンネルである場合,ランタイムエラーが発生します. 関数 :ref:`Get` は,多少処理が遅いですが,シングルチャンネル配列にもマルチチャンネル配列にも安全に使えることに注意してください. 疎な配列の場合,要求されたノードが存在しなければ,この関数は 0 を返します(この関数によって新たにノードが作成されることはありません). .. index:: GetReal2D .. _GetReal2D: GetReal2D --------- `id=0.472034990819 Comments from the Wiki `__ .. cfunction:: double cvGetReal2D(const CvArr* arr, int idx0, int idx1) シングルチャンネルの 2 次元配列の,指定された要素を返します. :param arr: 入力配列.シングルチャンネルでなければいけません. :param idx0: 要素を指定するインデックスの第 1 成分,0 が基準点. :param idx1: 要素を指定するインデックスの第 2 成分,0 が基準点. シングルチャンネル配列の指定された要素を返します. また,配列がマルチチャンネルである場合,ランタイムエラーが発生します. 関数 :ref:`Get` は,多少処理が遅いですが,シングルチャンネル配列にもマルチチャンネル配列にも安全に使えることに注意してください. 疎な配列の場合,要求されたノードが存在しなければ,この関数は 0 を返します(この関数によって新たにノードが作成されることはありません). .. index:: GetReal3D .. _GetReal3D: GetReal3D --------- `id=0.0686761755381 Comments from the Wiki `__ .. cfunction:: double cvGetReal3D(const CvArr* arr, int idx0, int idx1, int idx2) シングルチャンネルの3次元配列の,指定された要素を返します. :param arr: 入力配列,シングルチャンネルでなければいけません. :param idx0: 要素を指定するインデックスの第 1 成分,0 が基準点. :param idx1: 要素を指定するインデックスの第 2 成分,0 が基準点. :param idx2: 要素を指定するインデックスの第 3 成分,0 が基準点. シングルチャンネル配列の指定された要素を返します. また,配列がマルチチャンネルである場合,ランタイムエラーが発生します. 関数 :ref:`Get` は,多少処理が遅いですが,シングルチャンネル配列にもマルチチャンネル配列にも安全に使えることに注意してください. 疎な配列の場合,要求されたノードが存在しなければ,この関数は 0 を返します(この関数によって新たにノードが作成されることはありません). .. index:: GetRealND .. _GetRealND: GetRealND --------- `id=0.750139008465 Comments from the Wiki `__ .. cfunction:: double cvGetRealND(const CvArr* arr, int* idx)->float シングルチャンネルの配列の,指定された要素を返します. :param arr: 入力配列.シングルチャンネルでなければいけません. :param idx: 要素を指定するインデックスの配列. シングルチャンネル配列の指定された要素を返します. また,配列がマルチチャンネルである場合,ランタイムエラーが発生します. 関数 :ref:`Get` は,多少処理が遅いですが,シングルチャンネル配列にもマルチチャンネル配列にも安全に使えることに注意してください. 疎な配列で,指定したノードが存在しない場合,この関数は 0 を返します(この関数によって新しいノードは生成されません). .. index:: GetRow(s) .. _GetRow(s): GetRow(s) --------- `id=0.853803336438 Comments from the Wiki `__ .. cfunction:: CvMat* cvGetRow(const CvArr* arr, CvMat* submat, int row) 配列中のある1行,または指定範囲内の複数行を返します. .. cfunction:: CvMat* cvGetRows(const CvArr* arr, CvMat* submat, int startRow, int endRow, int deltaRow=1) :param arr: 入力配列. :param submat: 結果として得られる部分配列へのポインタ. :param row: 選択された行のインデックス,0 が基準点. :param startRow: 指定範囲の最初の(この値を含む)行のインデックス,0 が基準点. :param endRow: 指定範囲の最後の(この値を含まない)行のインデックス,0 が基準点. :param deltaRow: 行を範囲指定する際のインデックスの間隔,つまりこの関数は, ``startRow`` から ``endRow`` (この値は含まない)までの範囲で ``delta_row`` 毎に行を抽出します. これらの関数は,入力配列中の指定した 1 行,あるいは指定した範囲内の複数行に対応するヘッダを返します. ``GetRow`` は, :ref:`GetRows` のショートカットであることに注意してください: .. code-block:: c cvGetRow(arr, submat, row ) ~ cvGetRows(arr, submat, row, row + 1, 1); .. .. index:: GetSize .. _GetSize: GetSize ------- `id=0.902683793519 Comments from the Wiki `__ .. cfunction:: CvSize cvGetSize(const CvArr* arr) 行列あるいは画像ROIのサイズを返します. :param arr: 配列のヘッダ. この関数は,入力行列あるいは入力画像の行数(CvSize::height)および列数(CvSize::width)を返します.入力が画像の場合は,ROIのサイズが返されます. .. index:: GetSubRect .. _GetSubRect: GetSubRect ---------- `id=0.0148833044902 Comments from the Wiki `__ .. cfunction:: CvMat* cvGetSubRect(const CvArr* arr, CvMat* submat, CvRect rect) 入力画像または行列の,矩形部分配列に相当するヘッダを返します. :param arr: 入力配列. :param submat: 結果として得られる部分配列へのポインタ. :param rect: 0 を原点とする座標系で表現される注目矩形領域. 関数 ``cvGetSubRect`` は,入力配列中の指定矩形領域に対応するヘッダを返します.つまり,入力配列の一部の矩形領域を独立した配列として扱えるようにします.この関数では ROI を考慮し,実際には ROI の部分配列が取り出されます. .. index:: InRange .. _InRange: InRange ------- `id=0.00337975527968 Comments from the Wiki `__ .. cfunction:: void cvInRange(const CvArr* src, const CvArr* lower, const CvArr* upper, CvArr* dst) 入力配列の要素値が,別の2つの配列要素で表される範囲内にあるかどうかをチェックします. :param src: 入力配列. :param lower: 下界(その値を含む)を表す配列. :param upper: 上界(その値は含まない)を表す配列. :param dst: 出力配列.これは 8u か 8s 型でなければいけません. この関数は,入力配列の要素毎に範囲チェックを行います: シングルチャンネル配列の場合, .. math:: \texttt{dst} (I)= \texttt{lower} (I)_0 <= \texttt{src} (I)_0 < \texttt{upper} (I)_0 2チャンネル配列などの場合, .. math:: \texttt{dst} (I)= \texttt{lower} (I)_0 <= \texttt{src} (I)_0 < \texttt{upper} (I)_0 \land \texttt{lower} (I)_1 <= \texttt{src} (I)_1 < \texttt{upper} (I)_1 ``src(I)`` が範囲内にあれば ``dst(I)`` に 0xff(すべてのビットが ``1`` )がセットされ,そうでなければ 0 がセットされます.出力配列を除くすべての入力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: InRangeS .. _InRangeS: InRangeS -------- `id=0.870619736915 Comments from the Wiki `__ .. cfunction:: void cvInRangeS(const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst) 入力配列の要素値が,2 つのスカラ値で表される範囲内にあるかどうかをチェックします. :param src: 入力配列. :param lower: 下界(その値を含む)を表す配列. :param upper: 上界(その値は含まない)を表す配列. :param dst: 出力配列,8u か 8s 型でなければいけません. この関数は,入力配列の要素毎に範囲チェックを行います: シングルチャンネル配列の場合, .. math:: \texttt{dst} (I)= \texttt{lower} _0 <= \texttt{src} (I)_0 < \texttt{upper} _0 2チャンネル配列などの場合, .. math:: \texttt{dst} (I)= \texttt{lower} _0 <= \texttt{src} (I)_0 < \texttt{upper} _0 \land \texttt{lower} _1 <= \texttt{src} (I)_1 < \texttt{upper} _1 ``src(I)`` が範囲内にあれば ``dst(I)`` に 0xff(すべてのビットが ``1`` )がセットされ,そうでなければ 0 がセットされます.出力配列を除く全ての入力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: IncRefData .. _IncRefData: IncRefData ---------- `id=0.321898171202 Comments from the Wiki `__ .. cfunction:: int cvIncRefData(CvArr* arr) 配列のデータ参照カウンタをインクリメントします. :param arr: 配列のヘッダ. 関数 ``cvIncRefData`` は, :ref:`CvMat` や :ref:`CvMatND` のデータ参照カウンタをインクリメントし,新しいカウンタの値を返します.参照カウンタポインタが NULL の場合は 0 を返します. .. index:: InitImageHeader .. _InitImageHeader: InitImageHeader --------------- `id=0.829438488181 Comments from the Wiki `__ .. cfunction:: IplImage* cvInitImageHeader( IplImage* image, CvSize size, int depth, int channels, int origin=0, int align=4) あらかじめ確保された画像ヘッダを初期化します. :param image: 初期化される画像ヘッダ. :param size: 画像の幅と高さ. :param depth: ビット深度( :ref:`CreateImage` を参照してください). :param channels: チャンネル数( :ref:`CreateImage` を参照してください). :param origin: 左上原点 ``IPL_ORIGIN_TL`` あるいは,左下原点 ``IPL_ORIGIN_BL`` . :param align: 画像の行のアラインメント.通常は 4,あるいは 8 バイト. 戻り値の ``IplImage*`` は,初期化されたヘッダへのポインタです. .. index:: InitMatHeader .. _InitMatHeader: InitMatHeader ------------- `id=0.601107944012 Comments from the Wiki `__ .. cfunction:: CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type, void* data=NULL, int step=CV_AUTOSTEP) あらかじめ確保された行列のヘッダを初期化します. :param mat: 初期化される行列のヘッダへのポインタ. :param rows: 行列の行数. :param cols: 行列の列数. :param type: 行列の要素の種類, :ref:`CreateMat` を参照してください. :param data: オプション.行列のヘッダに割り当てられるデータポインタ. :param step: オプション.割り当てられたデータの行の長さをバイト単位で表します.デフォルトでは,step には可能な限り小さい値が用いられます.つまり,行列の連続する行間にギャップが存在しません. この関数は,OpenCV の行列関数において raw データ を扱うためによく利用されます.例えば,以下のコードは 2 つの行列の積を計算し,通常の配列として格納します: .. code-block:: c 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) の積が入っている .. .. index:: InitMatNDHeader .. _InitMatNDHeader: InitMatNDHeader --------------- `id=0.173627554697 Comments from the Wiki `__ .. cfunction:: CvMatND* cvInitMatNDHeader( CvMatND* mat, int dims, const int* sizes, int type, void* data=NULL) あらかじめ確保された多次元配列のヘッダを初期化します. :param mat: 初期化される配列のヘッダへのポインタ. :param dims: 配列の次元数. :param sizes: 各次元のサイズを表す配列. :param type: 配列の要素の種類, :ref:`CreateMat` を参照してください. :param data: オプション.配列のヘッダに割り当てられるデータへのポインタ. .. index:: InitSparseMatIterator .. _InitSparseMatIterator: InitSparseMatIterator --------------------- `id=0.286043369543 Comments from the Wiki `__ .. cfunction:: CvSparseNode* cvInitSparseMatIterator(const CvSparseMat* mat, CvSparseMatIterator* matIterator) 疎な配列要素のイテレータを初期化します. :param mat: 入力配列 :param matIterator: 初期化されるイテレータ この関数は,疎な配列要素のイテレータを初期化し先頭要素へのポインタを返します.配列が空の場合は NULL を返します. .. index:: InvSqrt .. _InvSqrt: InvSqrt ------- `id=0.484173701228 Comments from the Wiki `__ .. cfunction:: float cvInvSqrt(float value) 平方根の逆数を求めます. :param value: 浮動小数点型の入力値. この関数は,引数で与えられた入力値の平方根の逆数を求めます.この関数は,通常, ``1./sqrt(value)`` よりも高速です.入力値が 0 以下の場合の処理結果は不定です.また,特別な値( :math:`\pm \infty` , NaN )は扱うことができません. .. index:: Inv .. _Inv: Inv --- `id=0.802048866419 Comments from the Wiki `__ :ref:`Invert` .. index:: .. _: `id=0.250598638589 Comments from the Wiki `__ .. cfunction:: double cvInvert(const CvArr* src, CvArr* dst, int method=CV_LU) 逆行列,または擬似逆行列を求めます. :param src: 入力行列. :param dst: 出力行列. :param method: 逆行列を求める方法 * **CV_LU** 最適ピボット選択によるガウスの消去法. * **CV_SVD** 特異値分解法(SVD). * **CV_SVD_SYM** 正定値対称行列用の特異値分解法. この関数は, ``src1`` の逆行列を求め,それを ``src2`` に格納します. ``LU`` (ガウスの消去法)を用いた場合,この関数は ``src1`` の行列式を返します(もちろん,src1 は正方でなければいけません).この戻り値が 0 の場合,逆行列が計算できなかったという事であり, ``src2`` の要素は 0 で埋められます. ``SVD`` を用いた場合,この関数は ``src1`` の条件数の逆数(最大の特異値に対する最小の特異値の比)を返します. ``src1`` が 0 ならば,この戻り値も 0 になります.また,SVD を用いた場合, ``src1`` が非正則な行列ならば,その擬似逆行列を求めます. .. index:: IsInf .. _IsInf: IsInf ----- `id=0.825952346514 Comments from the Wiki `__ .. cfunction:: int cvIsInf(double value) 無限大であるか否かを判定します. :param value: 浮動小数点型の入力値. この関数は,引数で与えられた入力値が :math:`\pm \infty` (無限大;IEEE754 で定義されています)の場合は 1 を返し,そうでなければ 0 を返します. .. index:: IsNaN .. _IsNaN: IsNaN ----- `id=0.0212884674581 Comments from the Wiki `__ .. cfunction:: int cvIsNaN(double value) NaN であるか否かを判定します. :param value: 浮動小数点型の入力値. この関数は,引数で与えられた入力値が NaN(非数値;IEEE754 で定義されている)の場合は 1 を返し,そうでなければ 0 を返します. .. index:: LUT .. _LUT: LUT --- `id=0.958442959202 Comments from the Wiki `__ .. cfunction:: void cvLUT(const CvArr* src, CvArr* dst, const CvArr* lut) ルックアップテーブルを用いて配列を変換します. :param src: 各要素が 8 ビットの入力配列. :param dst: 任意のビット深度,入力配列と等しいチャンネル数の出力配列. :param lut: 出力配列と等しいビット深度の 256 要素で構成されるルックアップテーブル.入出力配列がマルチチャンネルの場合,ルックアップテーブルは,シングルチャンネル(この場合は,各チャンネルに対して同じテーブルを使います),あるいは入出力配列と同じチャンネル数である必要があります. この関数は,ルックアップテーブルから取り出した値で出力配列を埋めます.テーブルの要素を指定するインデックスには,入力配列の値が用いられます.つまり,この関数は ``src`` の各要素を以下のように処理します: .. math:: \texttt{dst} _i \leftarrow \texttt{lut} _{ \texttt{src} _i + d} ここで, .. math:: d = \fork{0}{if \texttt{src} has depth \texttt{CV\_8U}}{128}{if \texttt{src} has depth \texttt{CV\_8S}} です. .. index:: Log .. _Log: Log --- `id=0.286191871658 Comments from the Wiki `__ .. cfunction:: void cvLog(const CvArr* src, CvArr* dst) 各配列要素の絶対値の自然対数を求めます. :param src: 入力配列. :param dst: 出力配列. ``double`` 型,あるいは入力配列と同じ型. この関数は,入力配列の各要素に対して自然対数を求めます: .. math:: \texttt{dst} [I] = \fork{\log{|\texttt{src}(I)}}{if $\texttt{src}[I] \ne 0$ }{\texttt{C}}{otherwise} ここで ``C`` は,大きな負の値です(現在の実装では,およそ -700). .. index:: Mahalanobis .. _Mahalanobis: Mahalanobis ----------- `id=0.703449193514 Comments from the Wiki `__ .. cfunction:: double cvMahalanobis( const CvArr* vec1, const CvArr* vec2, CvArr* mat) 2 つのベクトル間のマハラノビス距離を求めます. :param vec1: 1 番目の 1 次元入力ベクトル. :param vec2: 2 番目の 1 次元入力ベクトル. :param mat: 分散共分散行列の逆行列. この関数は,2 つのベクトル間の重み付き距離を計算して返します: .. math:: d( \texttt{vec1} , \texttt{vec2} )= \sqrt{\sum_{i,j}{\texttt{icovar(i,j)}\cdot(\texttt{vec1}(I)-\texttt{vec2}(I))\cdot(\texttt{vec1(j)}-\texttt{vec2(j)})} } 共分散行列は,関数 :ref:`CalcCovarMatrix` によって求められ,その逆行列は,関数 :ref:`Invert` (行列は非正則であるかもしれないので CV _ SVD フラグを指定するのが望ましいです)によって求められます. .. index:: Mat .. _Mat: Mat --- `id=0.058739823452 Comments from the Wiki `__ .. cfunction:: CvMat cvMat( int rows, int cols, int type, void* data=NULL) 行列のヘッダを初期化します(軽量版). :param rows: 行列の行数. :param cols: 行列の列数. :param type: 行列の要素の種類, :ref:`CreateMat` を参照してください. :param data: オプション.行列のヘッダに割り当てられるデータポインタ. 行列のヘッダを初期化し,それにデータを割り当てます.行列は, *row* -ワイズ (データ先頭から ``cols`` 個の要素が,行列の最初の行に入ります)で埋められます. この関数は, :ref:`InitMatHeader` の高速なインライン展開であり,以下と等価です: .. code-block:: c CvMat mat; cvInitMatHeader(&mat, rows, cols, type, data, CV_AUTOSTEP); .. .. index:: Max .. _Max: Max --- `id=0.494687385002 Comments from the Wiki `__ .. cfunction:: void cvMax(const CvArr* src1, const CvArr* src2, CvArr* dst) 2つの配列の要素同士で大きい方を求めます. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param dst: 出力配列. この関数は,2 つの配列の各要素を比較して大きい方を求めます: .. math:: \texttt{dst} (I)= \max ( \texttt{src1} (I), \texttt{src2} (I)) すべての入力配列は シングルチャンネルで,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: MaxS .. _MaxS: MaxS ---- `id=0.987655320471 Comments from the Wiki `__ .. cfunction:: void cvMaxS(const CvArr* src, double value, CvArr* dst) 配列の各要素とスカラ値を比較して大きい方を求めます. :param src: 入力配列. :param value: スカラ値. :param dst: 出力配列. この関数は,配列の各要素とスカラ値を比較して大きい方を求めます: .. math:: \texttt{dst} (I)= \max ( \texttt{src} (I), \texttt{value} ) すべての入力配列は シングルチャンネルで,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: Merge .. _Merge: Merge ----- `id=0.580143059739 Comments from the Wiki `__ .. cfunction:: void cvMerge(const CvArr* src0, const CvArr* src1, const CvArr* src2, const CvArr* src3, CvArr* dst) 複数のシングルチャンネル配列を用いて 1 つのマルチチャンネル配列を構成します.または,配列に 1 つのチャンネルを挿入します. .. code-block:: c #define cvCvtPlaneToPix cvMerge .. :param src0: 入力チャンネル 0. :param src1: 入力チャンネル 1. :param src2: 入力チャンネル 2. :param src3: 入力チャンネル 3. :param dst: 最終的に作成される出力配列. 関数 ``cvMerge`` は, :ref:`Split` とは逆の操作を行います.出力配列が N チャンネルを持ち,引数の最初の N 個のチャンネルが NULL ではない場合,すべてのチャンネルがコピーされます.引数の最初の N 個のチャンネルのうち1つだけが NULL ではない場合,そのチャンネルだけが出力配列にコピーされます.そのどちらでもない場合([NULL,NULL,NULL,NULL],[NULL,notNULL,notNULL,NULL]など),エラーとなります.残りの(N 番目以降の)入力チャンネルは,常に NULL でなければいけません.COI を設定した IplImage 画像に 1 つのチャンネルを挿入するためには, :ref:`Copy` を利用することもできます. .. index:: Min .. _Min: Min --- `id=0.175918032993 Comments from the Wiki `__ .. cfunction:: void cvMin(const CvArr* src1, const CvArr* src2, CvArr* dst) 2 つの配列の要素同士で小さい方を求めます. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param dst: 出力配列. この関数は,2 つの配列の各要素を比較して小さい方を求めます: .. math:: \texttt{dst} (I)= \min ( \texttt{src1} (I), \texttt{src2} (I)) すべての入力配列は シングルチャンネルで,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: MinMaxLoc .. _MinMaxLoc: MinMaxLoc --------- `id=0.113191779588 Comments from the Wiki `__ .. cfunction:: void cvMinMaxLoc(const CvArr* arr, double* minVal, double* maxVal, CvPoint* minLoc=NULL, CvPoint* maxLoc=NULL, const CvArr* mask=NULL) 配列(部分配列)の要素の最大値と最小値を求めます. :param arr: シングルチャンネルの配列,あるいは COI が設定されたマルチチャンネル画像. :param minVal: 最小値が出力される変数へのポインタ. :param maxVal: 最大値が出力される変数へのポインタ. :param minLoc: 最小値の位置が出力される変数へのポインタ. :param maxLoc: 最大値の位置が出力される変数へのポインタ. :param mask: 部分配列を選択するためのオプションマスク. この関数は,配列の要素の最大・最小値とその位置を求めます.それぞれの値を求めるためにスキャンされる領域は,画像全体あるいはセットされた ``ROI`` ( ``IplImage`` の場合), また ``mask`` が ``NULL`` ではない場合は,指定された部分配列領域です.もし,入力がマルチチャンネル配列ならば,それは ``COI`` が設定された ``IplImage`` 型でなければいけません. 入力が 2 次元配列の場合,極値の座標が ``minLoc->x`` と ``maxLoc->x`` に格納されます. .. index:: MinS .. _MinS: MinS ---- `id=0.289545497651 Comments from the Wiki `__ .. cfunction:: void cvMinS(const CvArr* src, double value, CvArr* dst) 配列の各要素とスカラ値を比較して小さい方を求めます. :param src: 1 番目の入力配列. :param value: スカラ値. :param dst: 出力配列. この関数は,配列の各要素とスカラ値を比較して大きい方を求めます: .. math:: \texttt{dst} (I)= \min ( \texttt{src} (I), \texttt{value} ) すべての入力配列は シングルチャンネルで,同じデータ型,同じサイズ(または ROI サイズ)でなければいけません. Mirror ------ :ref:`Flip` と同義です. .. index:: MixChannels .. _MixChannels: MixChannels ----------- `id=0.897758773931 Comments from the Wiki `__ .. cfunction:: void cvMixChannels(const CvArr** src, int srcCount, CvArr** dst, int dstCount, const int* fromTo, int pairCount) 入力配列から出力配列へ,指定された(複数の)チャンネルをコピーします. :param src: 入力配列(の配列). :param srcCount: 入力配列の個数 . :param dst: 出力配列(の配列). :param dstCount: 出力配列の個数 . :param fromTo: コピーされる平面を示すインデックスのペア(入出力)の配列. ``fromTo[k*2]`` は,0 から始まるインデックスであり ``src`` の入力チャンネルを表します. また, ``fromTo[k*2+1]`` は, ``dst`` の出力チャンネルを表すインデックスです.ここでは,連続したチャンネル番号が用いられます. つまり,1 番目の入力画像チャンネルは, ``0`` から ``channels(src[0])-1`` までのインデックスで表され, 2 番目の入力画像チャンネルは, ``channels(src[0])`` から ``channels(src[0]) + channels(src[1])-1`` までのインデックスで表されます.また,出力画像チャンネルも同様です. 特別なケースとして, ``fromTo[k*2]`` が負の値の場合は,対応する出力チャンネルが 0 で埋められます この関数は, :ref:`Split` , :ref:`Merge` および :ref:`CvtColor` などの形式を一般化したものです. 色平面の順番の変更,アルファチャンネルの追加や削除,1 つあるいは複数の色平面の挿入や抽出,などに利用することができます. 例として,4 チャンネル RGBA 画像を,3チャンネル BGR 画像(つまり,R と B の交換)とアルファチャンネル画像の 2 つに分離するコードを示します: .. code-block:: c 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); .. MulAddS ------- :ref:`ScaleAdd` と同義です. .. index:: Mul .. _Mul: Mul --- `id=0.916003715455 Comments from the Wiki `__ .. cfunction:: void cvMul(const CvArr* src1, const CvArr* src2, CvArr* dst, double scale=1) 2 つの配列の要素毎の積を求めます. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param dst: 出力配列. :param scale: オプションであるスケール係数. この関数は,2 つの配列要素毎の積を計算します: .. math:: \texttt{dst} (I)= \texttt{scale} \cdot \texttt{src1} (I) \cdot \texttt{src2} (I) すべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します. .. index:: MulSpectrums .. _MulSpectrums: MulSpectrums ------------ `id=0.760718299829 Comments from the Wiki `__ .. cfunction:: void cvMulSpectrums( const CvArr* src1, const CvArr* src2, CvArr* dst, int flags) 2つのフーリエ・スペクトルの,要素毎の積を求めます. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param dst: 入力配列と同じサイズ,同じ型である出力配列. :param flags: 以下の値の組み合わせ: * **CV_DXT_ROWS** 配列の各行を個別のスペクトルとして扱います( :ref:`DFT` のパラメータ説明を参照してください). * **CV_DXT_MUL_CONJ** 積を計算する前に,2 番目の入力配列の共役を求めます. この関数は,2つの CCS-packed 形式の配列 または 複素行列の,要素毎の掛け算を行います. この 2 つの行列は,実数あるいは複素数のフーリエ変換の結果です. この関数と関数 :ref:`DFT` を利用することで,2 つの配列の畳み込みを高速に計算することができます. .. index:: MulTransposed .. _MulTransposed: MulTransposed ------------- `id=0.561598313109 Comments from the Wiki `__ .. cfunction:: void cvMulTransposed(const CvArr* src, CvArr* dst, int order, const CvArr* delta=NULL, double scale=1.0) 行列とその行列の転置行列の積を求めます. :param src: 入力行列. :param dst: 出力行列. ``CV_32F`` あるいは ``CV_64F`` でなければいけません. :param order: 転置した行列をかける順番. :param delta: オプション.乗算の前に行列 ``src`` から差し引かれる行列. :param scale: オプション.スケール係数. この関数は,src とその転置行列の積を求めます: この関数は,以下のように計算を行います.もし :math:`\texttt{order}=0` の場合は, .. math:: \texttt{dst} = \texttt{scale} ( \texttt{src} - \texttt{delta} ) ( \texttt{src} - \texttt{delta} )^T そうでない場合は, .. math:: \texttt{dst} = \texttt{scale} ( \texttt{src} - \texttt{delta} )^T ( \texttt{src} - \texttt{delta} ) .. index:: Norm .. _Norm: Norm ---- `id=0.646377034123 Comments from the Wiki `__ .. cfunction:: double cvNorm(const CvArr* arr1, const CvArr* arr2=NULL, int normType=CV_L2, const CvArr* mask=NULL) 配列の絶対値ノルム,絶対値差分ノルム,相対値差分ノルムを求めます. :param arr1: 1 番目の入力画像. :param arr2: 2 番目の入力画像.NULLの場合は ``arr1`` の絶対値ノルムが求められ,そうでなければ ``arr1`` - ``arr2`` の絶対値ノルムあるいは相対値ノルムが求められます. :param normType: ノルムの種類,以下の説明を参照してください. :param mask: オプションである処理マスク. この関数は, ``arr2`` が NULL の場合は ``arr1`` の絶対値ノルムを計算します: .. math:: norm = \forkthree{||\texttt{arr1}||_C = \max_I |\texttt{arr1}(I)|}{if $\texttt{normType} = \texttt{CV\_C}$}{||\texttt{arr1}||_{L1} = \sum_I |\texttt{arr1}(I)|}{if $\texttt{normType} = \texttt{CV\_L1}$}{||\texttt{arr1}||_{L2} = \sqrt{\sum_I \texttt{arr1}(I)^2}}{if $\texttt{normType} = \texttt{CV\_L2}$} ``arr2`` が NULL でない場合は,絶対値差分ノルムが計算されます: .. math:: norm = \forkthree{||\texttt{arr1}-\texttt{arr2}||_C = \max_I |\texttt{arr1}(I) - \texttt{arr2}(I)|}{if $\texttt{normType} = \texttt{CV\_C}$}{||\texttt{arr1}-\texttt{arr2}||_{L1} = \sum_I |\texttt{arr1}(I) - \texttt{arr2}(I)|}{if $\texttt{normType} = \texttt{CV\_L1}$}{||\texttt{arr1}-\texttt{arr2}||_{L2} = \sqrt{\sum_I (\texttt{arr1}(I) - \texttt{arr2}(I))^2}}{if $\texttt{normType} = \texttt{CV\_L2}$} または, ``arr2`` が NULL でなく,かつ ``(normType & CV_RELATIVE) != 0`` である場合は相対値差分ノルムが計算されます: .. math:: norm = \forkthree{\frac{||\texttt{arr1}-\texttt{arr2}||_C }{||\texttt{arr2}||_C }}{if $\texttt{normType} = \texttt{CV\_RELATIVE\_C}$}{\frac{||\texttt{arr1}-\texttt{arr2}||_{L1} }{||\texttt{arr2}||_{L1}}}{if $\texttt{normType} = \texttt{CV\_RELATIVE\_L1}$}{\frac{||\texttt{arr1}-\texttt{arr2}||_{L2} }{||\texttt{arr2}||_{L2}}}{if $\texttt{normType} = \texttt{CV\_RELATIVE\_L2}$} この関数は,求めたノルムを返します.マルチチャンネル配列は,シングルチャンネル配列として扱われます.つまり,すべてのチャンネルに対する処理結果が合計されます. .. index:: Not .. _Not: Not --- `id=0.182257376156 Comments from the Wiki `__ .. cfunction:: void cvNot(const CvArr* src, CvArr* dst) 配列の各要素をビット単位で反転します. :param src: 入力配列. :param dst: 出力配列. この関数は,配列の各要素の各ビットを反転します: .. code-block:: c dst(I)=~src(I) .. .. index:: Or .. _Or: Or -- `id=0.725749481852 Comments from the Wiki `__ .. cfunction:: void cvOr(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL) 2 つの配列の要素毎に,ビット単位の論理和を計算します. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param dst: 出力配列. :param mask: 8 ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,2 つの配列の要素毎にビット単位の論理和を計算します: .. code-block:: c dst(I)=src1(I)|src2(I) .. 浮動小数点型配列の場合は,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ種類,同じサイズ(または ROI サイズ)でなければいけません. .. index:: OrS .. _OrS: OrS --- `id=0.807847201211 Comments from the Wiki `__ .. cfunction:: void cvOrS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL) スカラ値と配列の要素毎に,ビット単位の論理和を計算します. :param src: 入力配列. :param value: スカラ値. :param dst: 出力配列. :param mask: 8 ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,スカラ値と配列要素ごとに,ビット単位の論理和を計算します: .. code-block:: c dst(I)=src(I)|value if mask(I)!=0 .. 実際の計算の前に,スカラ値は配列と同じ型に変換されます.また,浮動小数点型配列の場合は,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ種類,同じサイズ(または ROI サイズ)でなければいけません. .. index:: PerspectiveTransform .. _PerspectiveTransform: PerspectiveTransform -------------------- `id=0.108800484629 Comments from the Wiki `__ .. cfunction:: void cvPerspectiveTransform(const CvArr* src, CvArr* dst, const CvMat* mat) ベクトルの透視投影変換を行います. :param src: 3 チャンネル,浮動小数点型の入力配列. :param dst: 3 チャンネル,浮動小数点型の出力配列. :param mat: :math:`3\times 3` あるいは :math:`4 \times 4` の変換行列. この関数は,配列 ``src`` の各要素(2 次元,あるいは 3 次元のベクトルとして扱われます)を以下のように変換します: .. math:: (x, y, z) \rightarrow (x'/w, y'/w, z'/w) ここで, .. math:: (x', y', z', w') = \texttt{mat} \cdot \begin{bmatrix} x & y & z & 1 \end{bmatrix} また, .. math:: w = \fork{w'}{if $w' \ne 0$}{\infty}{otherwise} となります. .. index:: PolarToCart .. _PolarToCart: PolarToCart ----------- `id=0.0860942356815 Comments from the Wiki `__ .. cfunction:: void cvPolarToCart( const CvArr* magnitude, const CvArr* angle, CvArr* x, CvArr* y, int angleInDegrees=0) 極座標系で表現された 2 次元ベクトルを,カーテシアン(デカルト)座標系表現に変換します. :param magnitude: 各2次元ベクトル大きさを表す配列.NULL ならば,すべてのベクトルの大きさが 1 とみなされます. :param angle: 各2次元ベクトルの角度を表す配列.単位は,ラジアンあるいは度です. :param x: 変換後の x 座標を表す出力配列.結果が必要なければ,NULLでも構いません. :param y: 変換後の y 座標を表す出力配列.結果が必要なければ,NULLでも構いません. :param angleInDegrees: 出力である角度をデフォルトの「ラジアン」で表現するか,あるいは「度」で表現するかを指定するフラグ. この関数は,各ベクトル ``magnitude(I)*exp(angle(I)*j), j=sqrt(-1)`` の x 座標,y 座標 を求めます: .. code-block:: c x(I)=magnitude(I)*cos(angle(I)), y(I)=magnitude(I)*sin(angle(I)) .. .. index:: Pow .. _Pow: Pow --- `id=0.202771702774 Comments from the Wiki `__ .. cfunction:: void cvPow( const CvArr* src, CvArr* dst, double power) 各配列要素をそれぞれ指定された値で累乗します. :param src: 入力配列. :param dst: 出力配列,入力と同じ型である必要があります. :param power: 累乗の指数. この関数は,入力配列の各要素を ``power`` 乗します: .. math:: \texttt{dst} [I] = \fork{\texttt{src}(I)^p}{if \texttt{p} is integer}{|\texttt{src}(I)|^p}{otherwise} つまり,指数 ``power`` が整数ではない場合は,入力配列要素の絶対値が計算に用いられます.しかし,入力要素が負の場合でも,いくつか処理を追加すると正しい結果を得ることができます.以下に,配列要素それぞれの立方根を求めるサンプルを示します: .. code-block:: c 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 などの特別な値の場合は,より高速なアルゴリズムが用いられます. .. index:: Ptr?D .. _Ptr?D: Ptr?D ----- `id=0.348935788866 Comments from the Wiki `__ .. cfunction:: uchar* cvPtr1D(const CvArr* arr, int idx0, int* type=NULL) .. cfunction:: uchar* cvPtr2D(const CvArr* arr, int idx0, int idx1, int* type=NULL) .. cfunction:: uchar* cvPtr3D(const CvArr* arr, int idx0, int idx1, int idx2, int* type=NULL) .. cfunction:: uchar* cvPtrND(const CvArr* arr, int* idx, int* type=NULL, int createNode=1, unsigned* precalcHashval=NULL) インデックスで指定された配列要素へのポインタを返します. :param arr: 入力配列. :param idx0: 要素を指定するインデックスの第 1 成分,0 が基準点. :param idx1: 要素を指定するインデックスの第 2 成分,0 が基準点. :param idx2: 要素を指定するインデックスの第 3 成分,0 が基準点. :param idx: 要素を指定するインデックスの配列. :param type: オプション出力.行列要素の種類. :param createNode: オプション入力.疎な行列に対するパラメータ.これが 0 でない場合,指定されたインデックスに値が存在しなければ新たに要素を作成します. :param precalcHashval: オプション入力.このポインタが NULL でない場合,ノードのハッシュ値を再計算せずに,このハッシュ値で指定された場所の値を取得します.これにより,pair-ワイズ操作が高速化されます. この関数は,指定された配列要素へのポインタを返します.配列の次元数は,関数に渡されるインデックスの個数と一致していなければいけません.ただし,関数 ``cvPtr1D`` は,1次元,2次元,...,N次元の密な配列に対しても(シーケンシャルアクセスするために)利用できます. この関数は,疎な配列に対しても同様に利用できます.指定したノードが存在しない場合,新たにノードを生成し 0 をセットします. また,配列要素にアクセスする他の関数( :ref:`Get` , :ref:`GetReal` , :ref:`Set` , :ref:`SetReal` )と同様に,要素インデックスが範囲外であればエラーになります. .. index:: RNG .. _RNG: RNG --- `id=0.761551024024 Comments from the Wiki `__ .. cfunction:: CvRNG cvRNG(int64 seed=-1) 乱数生成器を初期化します. :param seed: 乱数列を初期化するための 64 ビットの数値. この関数は乱数生成器を初期化し,その状態を表す構造体を返します.その状態構造体へのポインタが,関数 :ref:`RandInt` , :ref:`RandReal` , :ref:`RandArr` に渡されます.現在の実装では,繰り上げ付き乗算アルゴリズム(multiply-with-carry)が利用されています. .. index:: RandArr .. _RandArr: RandArr ------- `id=0.339313697566 Comments from the Wiki `__ .. cfunction:: void cvRandArr( CvRNG* rng, CvArr* arr, int distType, CvScalar param1, CvScalar param2) 配列を乱数で埋め,RNG の状態を更新します. :param rng: :ref:`RNG` によって初期化された RNG 状態構造体へのポインタ. :param arr: 出力配列. :param distType: 乱数分布の種類 * **CV_RAND_UNI** 一様分布. * **CV_RAND_NORMAL** 正規分布(ガウス分布). :param param1: 1番目の分布パラメータ.一様分布の場合,発生する乱数の下界(この値を含みます)を表します.正規分布の場合,分布の平均値を表します. :param param2: 2番目の分布パラメータ.一様分布の場合,発生する乱数の上界(この値を含みません)を表します.正規分布の場合,分布の標準偏差を表します. この関数は,一様分布した乱数,あるいは正規分布した乱数を用いて出力配列を埋めます. 以下の例では,この関数を利用して,正規分布した浮動小数点の値を,2 次元配列内のランダム位置にある値に足し合わせています. .. code-block:: c /* 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 状態構造体は解放する必要がありません */ .. .. index:: RandInt .. _RandInt: RandInt ------- `id=0.182076298038 Comments from the Wiki `__ .. cfunction:: unsigned cvRandInt(CvRNG* rng) 32 ビット符号なし整数型の乱数を返し,RNG の状態を更新します. :param rng: ``RandInit`` によって初期化され,オプションで ``RandSetRange`` によってカスタマイズされる RNG 状態構造体へのポインタ(後者の関数は,この関数の結果に影響しません). この関数は,一様分布に従う 32 ビット符号なし整数型の乱数を返し,RNG の状態を更新します.これは,C言語のランタイムライブラリの rand() 関数に類似しています.しかし,rand() が 0 から ``RAND_MAX`` ( :math:`2^{16}` または :math:`2^{32}` ,プラットホームに依存)までの値を返すの対して,この関数では常に 32 ビットの値を生成します. この関数は,点座標,領域サイズ,テーブルインデックスなどの乱数値を生成するのに用いることができます.特定範囲内の整数は剰余演算によって生成でき,特定範囲内の浮動小数点数は,値の範囲を 0...1 にスケーリングするように割算することで生成できます. :ref:`RandInt` を利用して,前述の例を書き直したものを以下に示します: .. code-block:: c /* 入力値と内容は以前のサンプルと同じです */ 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 を 解放する必要はありません.これは小さい固定サイズの行列を扱う際の, 効果的で有名な手法です */ .. .. index:: RandReal .. _RandReal: RandReal -------- `id=0.21737668534 Comments from the Wiki `__ .. cfunction:: double cvRandReal(CvRNG* rng) 浮動小数点型の乱数を返し,RNG の状態を更新します. :param rng: :ref:`RNG` によって初期化された RNG 状態構造体へのポインタ. この関数は,0 から 1 の範囲(1自身は含まれない)の一様分布に従う浮動小数点型の乱数を返します. .. index:: Reduce .. _Reduce: Reduce ------ `id=0.200141765094 Comments from the Wiki `__ .. cfunction:: void cvReduce(const CvArr* src, CvArr* dst, int dim = -1, int op=CV_REDUCE_SUM) 行列をベクトルに変換します. :param src: 入力行列 :param dst: 入力行列のすべての行または列を指定された方法で累積する,1 行または 1 列の出力ベクトル. :param dim: 配列の縮小方法を示す次元インデックス.0 の場合は,行列を 1行ベクトルに変換します.1 の場合は,行列を 1 列ベクトルに変換します.-1の場合は, ``dst`` サイズを解析して自動的に次元を選択します. :param op: 変換処理.以下の値をとります: * **CV_REDUCE_SUM** 出力ベクトルは,各行(あるいは各列)の総和. * **CV_REDUCE_AVG** 出力ベクトルは,各行(あるいは各列)の平均. * **CV_REDUCE_MAX** 出力ベクトルは,各行(あるいは各列)の最大値. * **CV_REDUCE_MIN** 出力ベクトルは,各行(あるいは各列)の最小値. この関数は,入力行列の各行(あるいは各列)を 1 次元ベクトルの集合として扱い,その集合に対して指定された処理を行うことで行列をベクトルに変換します.例えば,ラスタ画像の水平,垂直方向への射影を計算することができます. ``CV_REDUCE_SUM`` や ``CV_REDUCE_AVG`` の場合は,計算精度を保つために(桁溢れしないように)出力ベクトル要素のビット深度を入力よりも大きくとるべきです.また,これらの 2 つのモードの場合は,マルチチャンネル画像を扱うこともできます. .. index:: ReleaseData .. _ReleaseData: ReleaseData ----------- `id=0.49437599061 Comments from the Wiki `__ .. cfunction:: void cvReleaseData(CvArr* arr) 配列データを解放します. :param arr: 配列のヘッダ. この関数は,配列データを解放します.配列が :ref:`CvMat` や :ref:`CvMatND` の場合は,単に cvDecRefData() が呼ばれます.つまり,この関数は外部のデータを解放することはできません. :ref:`CreateData` の注意事項も参照してください. .. index:: ReleaseImage .. _ReleaseImage: ReleaseImage ------------ `id=0.401833594601 Comments from the Wiki `__ .. cfunction:: void cvReleaseImage(IplImage** image) 画像ヘッダとデータを解放します. :param image: 画像ヘッダへのダブルポインタ. この関数呼び出しは,以下の形式を短縮したものです. .. code-block:: c if(*image ) { cvReleaseData(*image); cvReleaseImageHeader(image); } .. .. index:: ReleaseImageHeader .. _ReleaseImageHeader: ReleaseImageHeader ------------------ `id=0.182761493157 Comments from the Wiki `__ .. cfunction:: void cvReleaseImageHeader(IplImage** image) 画像ヘッダを解放します. :param image: 画像ヘッダへのダブルポインタ. この関数呼び出しは,以下の形式に似ています. .. code-block:: c if(image ) { iplDeallocate(*image, IPL_IMAGE_HEADER | IPL_IMAGE_ROI); *image = 0; } .. しかし,この関数はデフォルトでは IPL の関数を利用しません(マクロ ``CV_TURN_ON_IPL_COMPATIBILITY`` を参照してください). .. index:: ReleaseMat .. _ReleaseMat: ReleaseMat ---------- `id=0.192897480881 Comments from the Wiki `__ .. cfunction:: void cvReleaseMat(CvMat** mat) 行列を解放します. :param mat: 行列へのダブルポインタ. この関数は,行列データの参照カウンタをデクリメントし,行列ヘッダを解放します.データの参照カウンタが 0 になった場合は,そのデータも解放されます. .. code-block:: c if(*mat ) cvDecRefData(*mat); cvFree((void**)mat); .. .. index:: ReleaseMatND .. _ReleaseMatND: ReleaseMatND ------------ `id=0.218215154921 Comments from the Wiki `__ .. cfunction:: void cvReleaseMatND(CvMatND** mat) 多次元の配列を解放します. :param mat: 配列へのダブルポインタ. この関数は,配列データの参照カウンタをデクリメントし,配列ヘッダを解放します.データの参照カウンタが 0 になった場合は,そのデータも解放されます. .. code-block:: c if(*mat ) cvDecRefData(*mat); cvFree((void**)mat); .. .. index:: ReleaseSparseMat .. _ReleaseSparseMat: ReleaseSparseMat ---------------- `id=0.187328763741 Comments from the Wiki `__ .. cfunction:: void cvReleaseSparseMat(CvSparseMat** mat) 疎な配列を解放します. :param mat: 配列へのダブルポインタ. この関数は,疎な配列を解放し,関数の終了時に配列ポインタをクリアします. .. index:: Repeat .. _Repeat: Repeat ------ `id=0.0615116879355 Comments from the Wiki `__ .. cfunction:: void cvRepeat(const CvArr* src, CvArr* dst) コピー元配列を用いて,コピー先配列をタイル状に埋めます. :param src: コピー元配列,画像または行列. :param dst: コピー先配列,画像または行列. この関数は,コピー元配列を繰り返しコピーして,コピー先配列を埋めます: .. code-block:: c dst(i,j)=src(i mod rows(src), j mod cols(src)) .. コピー先配列は,コピー元配配列より大きくても小さくても構いません. .. index:: ResetImageROI .. _ResetImageROI: ResetImageROI ------------- `id=0.0576362677154 Comments from the Wiki `__ .. cfunction:: void cvResetImageROI(IplImage* image) 画像全体が操作対象となるように ROI をリセットして,ROI 構造体を解放します. :param image: 画像ヘッダへのポインタ. これは,以下の操作に似ています. しかし,この関数ではさらに ROI 構造体を解放することができます. .. code-block:: c cvSetImageROI(image, cvRect(0, 0, image->width, image->height )); cvSetImageCOI(image, 0); .. .. index:: Reshape .. _Reshape: Reshape ------- `id=0.579352732702 Comments from the Wiki `__ .. cfunction:: CvMat* cvReshape(const CvArr* arr, CvMat* header, int newCn, int newRows=0) データをコピーせずに行列/画像の形状を変更します. :param arr: 入力配列. :param header: 出力される新しいヘッダ. :param newCn: 新しいチャンネル数. 'newCn = 0' の場合は,チャンネル数は変更されません. :param newRows: 新しい行数. 'newRows = 0' の場合は, ``newCn`` の値によって変更の必要がでてくる場合を除いて,行数は変更されません. この関数は,与えられた配列を元に CvMat ヘッダを初期化します.これは,元の配列とは異なる形状(チャンネル数や行数が異なる)で,元の配列と同じデータへのポインタを持つ新しい配列ヘッダとなります. 例えば,次のコードでは,1 つの画像とそれに対する 2 つの画像ヘッダ(320x240x3,960x240x1)を作成します: .. code-block:: c 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 のベクトルに変換しています: .. code-block:: c CvMat* mat = cvCreateMat(3, 3, CV_32F); CvMat row_header, *row; row = cvReshape(mat, &row_header, 0, 1); .. .. index:: ReshapeMatND .. _ReshapeMatND: ReshapeMatND ------------ `id=0.695475379287 Comments from the Wiki `__ .. cfunction:: CvArr* cvReshapeMatND(const CvArr* arr, int sizeofHeader, CvArr* header, int newCn, int newDims, int* newSizes) データをコピーせずに多次元配列の形状を変更します. .. code-block:: c #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: 新しいチャンネル数. :math:`\texttt{newCn} = 0` の場合は,チャンネル数は変更されません. :param newDims: 新しい次元数. :math:`\texttt{newDims} = 0` の場合は,次元数は変更されません. :param newSizes: 新しい次元数,を要素とする配列.要素の総数は変化してはいけないので, :math:`\texttt{newDims}-1` 個の値のみが利用されます.したがって, :math:`\texttt{newDims} = 1` の場合は,配列 ``newSizes`` は利用されません. この関数は, :ref:`Reshape` の拡張バージョンです.この関数は,多次元配列を扱うことができ(普通の画像と行列も扱えます),次元数を変更する事も可能です. :ref:`Reshape` の項で説明した2つのサンプルを, :ref:`ReshapeMatND` を用いて書き直すと次のようになります: .. code-block:: c 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); .. .. index:: cvRound, cvFloor, cvCeil .. _cvRound, cvFloor, cvCeil: cvRound, cvFloor, cvCeil ------------------------ `id=0.457572533364 Comments from the Wiki `__ .. cfunction:: int cvRound(double value) int cvFloor(double value) int cvCeil(double value) 浮動小数点型の値を整数型の値に変換します. :param value: 浮動小数点型の入力値. 関数 ``cvRound`` , ``cvFloor`` , ``cvCeil`` は,それぞれの丸め方を用いて,浮動小数点型の入力値を整数型に変換します. ``cvRound`` は,入力値に最も近い整数値を返します. ``cvFloor`` は,入力値より大きくない最大の整数値を返します. ``cvCeil`` は,入力値より小さくない最小の整数値を返します. これらの関数は,(処理系によっては)C言語の標準キャスト関数よりも大幅に高速に動作します. 入力値の絶対値が :math:`2^{31}` よりも大きければ,処理結果は不定です.また,特別な値( :math:`\pm \infty` , NaN )は扱うことができません. .. index:: ScaleAdd .. _ScaleAdd: ScaleAdd -------- `id=0.84653850989 Comments from the Wiki `__ .. cfunction:: void cvScaleAdd(const CvArr* src1, CvScalar scale, const CvArr* src2, CvArr* dst) スケーリングされた配列ともう1つの配列の和を求めます. :param src1: 1 番目の入力配列. :param scale: 1 番目の入力配列を定数倍するスケール係数. :param src2: 2 番目の入力配列. :param dst: 出力配列. この関数は,スケーリングされた配列ともう 1 つの配列の和を求めます: .. math:: \texttt{dst} (I)= \texttt{scale} \, \texttt{src1} (I) + \texttt{src2} (I) すべての入出力配列は,同じ型,同じサイズでなければいけません. .. index:: Set .. _Set: Set --- `id=0.244169590523 Comments from the Wiki `__ .. cfunction:: void cvSet(CvArr* arr, CvScalar value, const CvArr* mask=NULL) 配列の各要素に与えられた値をセットします. :param arr: 値をセットする配列. :param value: セットされる値. :param mask: 8 ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,スカラ値 ``value`` を,配列の指定された要素すべてにコピーします: .. math:: \texttt{arr} (I)= \texttt{value} \quad \text{if} \quad \texttt{mask} (I) \ne 0 配列 ``arr`` が, ``IplImage`` 型である場合,ROI は利用されますが COI を設定してはいけません. .. index:: Set?D .. _Set?D: Set?D ----- `id=0.927763302738 Comments from the Wiki `__ .. cfunction:: void cvSet1D(CvArr* arr, int idx0, CvScalar value) .. cfunction:: void cvSet2D(CvArr* arr, int idx0, int idx1, CvScalar value) .. cfunction:: void cvSet3D(CvArr* arr, int idx0, int idx1, int idx2, CvScalar value) .. cfunction:: void cvSetND(CvArr* arr, int* idx, CvScalar value) インデックスで指定された配列要素を変更します. :param arr: 入力配列 :param idx0: 要素を指定するインデックスの第 1 成分,0 が基準点. :param idx1: 要素を指定するインデックスの第 2 成分,0 が基準点. :param idx2: 要素を指定するインデックスの第 3 成分,0 が基準点. :param idx: 要素を指定するインデックスの配列. :param value: 新しい値. これらの関数は,指定した配列要素に新しい値を割り当てて変更します.疎な配列の場合に指定ノードが存在しなければ,新たにノードを生成します. .. index:: SetData .. _SetData: SetData ------- `id=0.262732185632 Comments from the Wiki `__ .. cfunction:: void cvSetData(CvArr* arr, void* data, int step) ユーザデータを配列のヘッダに割り当てます. :param arr: 配列のヘッダ. :param data: ユーザデータ. :param step: バイト単位で表される行の長さ. この関数は,ユーザデータを配列のヘッダに割り当てます.このヘッダは,関数 ``cvCreate*Header`` , ``cvInit*Header`` あるいは :ref:`Mat` (行列の場合)を用いて,あらかじめ初期化しておく必要があります. .. index:: SetIdentity .. _SetIdentity: SetIdentity ----------- `id=0.802290229405 Comments from the Wiki `__ .. cfunction:: void cvSetIdentity(CvArr* mat, CvScalar value=cvRealScalar(1)) 行列をスカラ倍された単位行列として初期化します. :param mat: 初期化される行列(正方である必要はありません). :param value: 対角要素に割り当てられる値. この関数は,行列をスカラ倍された単位行列として初期化します: .. math:: \texttt{arr} (i,j)= \fork{\texttt{value}}{ if $i=j$}{0}{otherwise} .. index:: SetImageCOI .. _SetImageCOI: SetImageCOI ----------- `id=0.27872162158 Comments from the Wiki `__ .. cfunction:: void cvSetImageCOI( IplImage* image, int coi) IplImage に COI を設定します. :param image: 画像ヘッダへのポインタ. :param coi: 注目チャンネル.0 - すべてのチャンネルを選択,1 - 1番目のチャンネルを選択,2以下も同様です.チャンネルは,1 から始まることに注意してください. ROI が ``NULL`` に設定されており,COI が 0 *ではない* 場合,COIが確保されます. ほとんどの OpenCV の関数は,COI をサポート *しません* .よって,画像や行列のそれぞれのチャンネルを処理する場合, チャンネルを( :ref:`Copy` や :ref:`Split` によって)別々の画像や行列にコピーしてから処理を行い, 必要ならばその結果を( :ref:`Copy` や :ref:`Merge` によって)再びコピーして戻します. .. index:: SetImageROI .. _SetImageROI: SetImageROI ----------- `id=0.480970516243 Comments from the Wiki `__ .. cfunction:: void cvSetImageROI( IplImage* image, CvRect rect) 与えられた矩形領域を,画像の ROI として設定します. :param image: 画像ヘッダへのポインタ. :param rect: ROI を表す矩形領域. 元の画像の ROI が ``NULL`` であり ``rect`` が画像全体ではない場合,ROI 構造体が確保されます. ほとんどの OpenCV の関数が ROI をサポートしており,矩形の部分画像を別の画像として扱うことができます.例えば,すべてのピクセル座標は,元画像の原点からではなく,ROI の原点(左上あるいは左下)からカウントされます. .. index:: SetReal?D .. _SetReal?D: SetReal?D --------- `id=0.229908538208 Comments from the Wiki `__ .. cfunction:: void cvSetReal1D(CvArr* arr, int idx0, double value) .. cfunction:: void cvSetReal2D(CvArr* arr, int idx0, int idx1, double value) .. cfunction:: void cvSetReal3D(CvArr* arr, int idx0, int idx1, int idx2, double value) .. cfunction:: void cvSetRealND(CvArr* arr, int* idx, double value) インデックスで指定された配列要素を変更します. :param arr: 入力配列. :param idx0: 要素を指定するインデックスの第 1 成分,0 が基準点. :param idx1: 要素を指定するインデックスの第 2 成分,0 が基準点. :param idx2: 要素を指定するインデックスの第 3 成分,0 が基準点. :param idx: 要素を指定するインデックスの配列. :param value: 新しい値. この関数は,シングルチャンネル配列の指定した要素に新しい値を割り当てて変更します.配列がマルチチャンネルのときは,ランタイムエラーが発生します.関数 :ref:`Set*D` は,シングルチャンネルとマルチチャンネルの配列に対して安全に使用することができますが,若干処理速度が遅いことに注意してください. 疎な配列の場合に指定ノードが存在しなければ,新たにノードを生成します. .. index:: SetZero .. _SetZero: SetZero ------- `id=0.0061333598483 Comments from the Wiki `__ .. cfunction:: void cvSetZero(CvArr* arr) 配列をクリアします. .. code-block:: c #define cvZero cvSetZero .. :param arr: クリアされる配列. この関数は,配列をクリアします.密な配列(CvMat,CvMatND,IplImage)に対する cvZero(array) は,cvSet(array,cvScalarAll(0),0) と等価です. 疎な配列の場合は,すべての要素が削除されます. .. index:: Solve .. _Solve: Solve ----- `id=0.948919571324 Comments from the Wiki `__ .. cfunction:: int cvSolve(const CvArr* src1, const CvArr* src2, CvArr* dst, int method=CV_LU) 連立一次方程式,あるいは最小二乗問題を解きます. :param A: 入力行列. :param B: 連立一次方程式の右辺. :param X: 出力解 :param method: 逆行列を求める方法 * **CV_LU** 最適ピボット選択によるガウスの消去法. * **CV_SVD** 特異値分解法(SVD). * **CV_SVD_SYM** 正定値対称行列用の特異値分解法. この関数は,連立一次方程式あるいは最小二乗問題を解きます(後者は,SVD によって求められます): .. math:: \texttt{dst} = argmin_X|| \texttt{src1} \, \texttt{X} - \texttt{src2} || ``CV_LU`` の手法が用いられる場合, ``src1`` が正則行列であれば 1 を返し,そうでなければ 0 を返します. 後者の場合, ``dst`` の値は有効なものではありません. .. index:: SolveCubic .. _SolveCubic: SolveCubic ---------- `id=0.865904878103 Comments from the Wiki `__ .. cfunction:: void cvSolveCubic(const CvArr* coeffs, CvArr* roots) 三次方程式の実根を求めます. :param coeffs: 3 個あるいは 4 個の値をもつ,方程式の係数配列. :param roots: 実根の出力配列.3 個の要素をもちます. この関数は,3 次方程式の実根を求めます: coeffs が 4 要素のベクトルである場合: .. math:: \texttt{coeffs} [0] x^3 + \texttt{coeffs} [1] x^2 + \texttt{coeffs} [2] x + \texttt{coeffs} [3] = 0 coeffs が 3 要素のベクトルである場合: .. math:: x^3 + \texttt{coeffs} [0] x^2 + \texttt{coeffs} [1] x + \texttt{coeffs} [2] = 0 この関数は,求めた実根の個数を返し,その実根は ``root`` 配列に格納されます.実根が1つだけの場合,配列の残りの要素は 0 で埋められます. .. index:: Split .. _Split: Split ----- `id=0.395096299462 Comments from the Wiki `__ .. cfunction:: void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3) マルチチャンネル配列を複数のシングルチャンネル配列に分割します.または,配列から 1 つのチャンネルだけを抜き出します. :param src: 入力配列. :param dst0: 出力チャンネル 0. :param dst1: 出力チャンネル 1. :param dst2: 出力チャンネル 2. :param dst3: 出力チャンネル 3. この関数は,マルチチャンネル配列を複数のシングルチャンネル配列に分割します.この操作には 2 つのモードが存在します. 入力配列が N チャンネルで,引数の最初の N 個のチャンネルが NULL ではない場合,すべてのチャンネルが抜き出されます. 引数の最初の N 個のチャンネルのうち1つだけが NULL ではない場合,そのチャンネルだけが抜き出されます. そのどちらでもない場合([NULL,NULL,NULL,NULL],[NULL,notNULL,notNULL,NULL]など),エラーとなります. 残りの出力チャンネル(最初のN個より後ろ)は,常にNULLでなければいけません. COI を設定した IplImage 画像から1つのチャンネルを抜き出すためには, :ref:`Copy` を利用することもできます. .. index:: Sqrt .. _Sqrt: Sqrt ---- `id=0.639510477766 Comments from the Wiki `__ .. cfunction:: float cvSqrt(float value) 平方根を求めます. :param value: 浮動小数点型の入力値. この関数は,引数で与えられた入力値の平方根を求めます.入力値が負の場合は,処理結果は不定です. .. index:: Sub .. _Sub: Sub --- `id=0.150261608157 Comments from the Wiki `__ .. cfunction:: void cvSub(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL) 2 つの配列の要素毎の差を求めます. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param dst: 出力配列. :param mask: 8 ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,1 つの配列からもう 1 つの配列を引きます: .. code-block:: c dst(I)=src1(I)-src2(I) if mask(I)!=0 .. マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します. .. index:: SubRS .. _SubRS: SubRS ----- `id=0.589663811514 Comments from the Wiki `__ .. cfunction:: void cvSubRS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL) スカラ値から配列要素を引きます. :param src: 入力配列. :param value: 引き算されるスカラ. :param dst: 出力配列. :param mask: 8ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,スカラ値から入力配列の各要素を引きます: .. code-block:: c dst(I)=value-src(I) if mask(I)!=0 .. マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します. .. index:: SubS .. _SubS: SubS ---- `id=0.329270513266 Comments from the Wiki `__ .. cfunction:: void cvSubS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL) 配列からスカラ値を引きます. :param src: 入力配列. :param value: 引き算するスカラ. :param dst: 出力配列. :param mask: 8ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,入力配列の各要素からスカラ値を引きます: .. code-block:: c dst(I)=src(I)-value if mask(I)!=0 .. マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. また,有限の範囲に値をとる型は,この処理により飽和します. .. index:: Sum .. _Sum: Sum --- `id=0.522973694858 Comments from the Wiki `__ .. cfunction:: CvScalar cvSum(const CvArr* arr) 配列の要素値の総和を求めます. :param arr: 配列. 関数 ``cvSum`` は,各チャンネルごとに配列要素値の総和 ``S`` を求めます: .. math:: \sum _I \texttt{arr} (I)_c 配列が ``IplImage`` で COI が設定されている場合,この関数は指定されたチャンネルのみを処理し,その結果を戻り値の ``CvScalar`` の 1 番目の要素 :math:`S_0` に格納します. .. index:: SVBkSb .. _SVBkSb: SVBkSb ------ `id=0.943602805723 Comments from the Wiki `__ .. cfunction:: void cvSVBkSb( const CvArr* W, const CvArr* U, const CvArr* V, const CvArr* B, CvArr* X, int flags) 特異値の後退代入を行います. :param W: 特異値を対角要素とする行列,あるいは要素とするベクトル. :param U: (左)直交行列(転置されている場合もあります). :param V: (右)直交行列(転置されている場合もあります). :param B: 元の行列 ``A`` の擬似逆行列に乗ずるための行列.これは,オプションです.これが省略された場合,適切なサイズの単位行列であるとみなされます(その場合は, ``X`` は ``A`` の擬似逆行列となります). :param X: 出力行列.後退代入の結果. :param flags: オプションである処理フラグ. :ref:`SVD` に渡された ``flags`` と一致していなければいけません. この関数は,特異値分解された行列 ``A`` ( :ref:`SVD` の説明を参照してください)と行列 ``B`` に対して後退代入を行います: .. math:: \texttt{X} = \texttt{V} \texttt{W} ^{-1} \texttt{U} ^T \texttt{B} ここで, .. math:: W^{-1}_{(i,i)}= \fork{1/W_{(i,i)}}{if $W_{(i,i)} > \epsilon \sum_i{W_{(i,i)}}$ }{0}{otherwise} なお, :math:`\epsilon` は,行列のデータ型に依存する微小な値です. この関数は, :ref:`Invert` や :ref:`Solve` の内部で :ref:`SVD` と共に用いられます.これらの「低レベルな」関数( ``SVD`` と ``SVBkSb`` )を用いる状況があるとすれば,これらに対応する高レベルな関数( :ref:`Invert` と :ref:`Solve` )内部でのテンポラリな行列の確保を避けるためでしょう. .. index:: SVD .. _SVD: SVD --- `id=0.292965186717 Comments from the Wiki `__ .. cfunction:: void cvSVD( CvArr* A, CvArr* W, CvArr* U=NULL, CvArr* V=NULL, int flags=0) 浮動小数点型の実数行列の特異値分解を行います. :param A: :math:`\texttt{M} \times \texttt{N}` の入力行列. :param W: 特異値分解の結果得られる対角行列( :math:`\texttt{M} \times \texttt{N}` または :math:`\min(\texttt{M}, \texttt{N}) \times \min(\texttt{M}, \texttt{N})` ) あるいは,特異値のベクトル( :math:`\min(\texttt{M},\texttt{N}) \times 1` ). :param U: オプション.(左)直交行列 :math:`\texttt{M} \times \min(\texttt{M}, \texttt{N})` ( ``CV_SVD_U_T`` が設定されていない場合),または :math:`\min(\texttt{M},\texttt{N}) \times \texttt{M}` ( ``CV_SVD_U_T`` が指定されている場合),または :math:`\texttt{M} \times \texttt{M}` ( ``CV_SVD_U_T`` フラグには無関係). :param V: オプション.(右)直交行列( :math:`\texttt{N} \times \texttt{N}` ). :param V: オプション.(右)直行行列 :math:`\texttt{N} \times \min(\texttt{M}, \texttt{N})` ( ``CV_SVD_V_T`` が設定されてない場合),または :math:`\min(\texttt{M},\texttt{N}) \times \texttt{N}` ( ``CV_SVD_V_T`` が設定されている場合),または :math:`\texttt{N} \times \texttt{N}` ( ``CV_SVD_V_T`` フラグには無関係). :param flags: 処理フラグ,0 あるいは以下の値の組み合わせ: * **CV_SVD_MODIFY_A** 計算中に ``A`` の値を変更できるようになり,計算が高速化されます. * **CV_SVD_U_T** ``U`` の転置行列が返されるようになり,計算が高速化されます. * **CV_SVD_V_T** ``V`` の転置行列が返されるようになり,計算が高速化されます. この関数は,行列 ``A`` を 1 つの対角行列と 2 つの直交行列の積に分解します: .. math:: A=U \, W \, V^T ここで :math:`W` は,特異値を対角要素にもつ対角行列であり,特異値を要素とする1次元ベクトルとして表現する事もできます. すべての特異値は非負であり,( :math:`U` と :math:`V` の列と共に)降順にソートされます. SVD アルゴリズムは,数値的に安定しており,その典型的な応用例には以下のものがあります: * 行列 ``A`` が正方かつ正定値対称である場合(例えば,分散共分散行列など)の固有値問題の厳密な解法.この場合の :math:`W` は,固有値を要素とするベクトル/行列となり, :math:`U = V` は固有ベクトルの行列となります. * 劣決定(方程式よりも未知数が多い)連立1次方程式における厳密な解法. * 優決定(未知数よりも方程式が多い)連立1次方程式における最小2乗法による解法.これらの場合は, ``CV_SVD`` フラグが指定された :ref:`Solve` が実行されます. * 行列のランク(0 ではない特異値の個数),条件数(最大の特異値と最小の特異値との比),行列式(行列式の絶対値は特異値の直積に等しい)などの様々な特徴量の高精度な計算. .. index:: Trace .. _Trace: Trace ----- `id=0.23233084291 Comments from the Wiki `__ .. cfunction:: CvScalar cvTrace(const CvArr* mat) 行列のトレースを求めます. :param mat: 入力行列. この関数は,入力行列 ``src1`` の対角要素の和を返します. .. math:: tr( \texttt{mat} ) = \sum _i \texttt{mat} (i,i) .. index:: Transform .. _Transform: Transform --------- `id=0.263612628876 Comments from the Wiki `__ .. cfunction:: void cvTransform(const CvArr* src, CvArr* dst, const CvMat* transmat, const CvMat* shiftvec=NULL) 各配列要素に対して,行列変換を行います. :param src: 1 番目の入力配列. :param dst: 出力配列. :param transmat: 変換行列. :param shiftvec: オプションである並進ベクトル. この関数は,配列 ``src`` の各要素に行列変換を施し,その結果を ``dst`` に代入します: .. math:: dst(I) = transmat \cdot src(I) + shiftvec つまり, ``N`` チャンネル配列 ``src`` の各要素を ``N`` 個の要素を持つベクトルとして扱い, :math:`\texttt{M} \times \texttt{N}` の変換行列 ``transmat`` と並進ベクトル ``shiftvec`` によって変換した結果を, ``M`` チャンネル配列 ``dst`` の要素に格納します. 同次座標系の場合, ``transmat`` は :math:`\texttt{M} \times (N+1)` の行列であり,最右列は並進ベクトルとして扱われます. 入出力配列は共に,同じビット深度,同じサイズ(同じ ROI サイズ)でなければいけません.また, ``transmat`` と ``shiftvec`` は,その要素が浮動小数点型実数でなくていけません. この関数は,n-次元の点群の幾何学変換,色空間における任意の線形変換,チャンネルの入れ替えなどに利用できます. .. index:: Transpose .. _Transpose: Transpose --------- `id=0.180212837109 Comments from the Wiki `__ .. cfunction:: void cvTranspose(const CvArr* src, CvArr* dst) 行列を転置します. :param src: 入力行列. :param dst: 出力行列. この関数は,入力行列 ``src1`` を転置します: .. math:: \texttt{dst} (i,j) = \texttt{src} (j,i) 複素行列の場合,複素数の共役化は行われないので,これとは別に行う必要があることに注意してください:この例として, :ref:`XorS` のサンプルコードを参照してください. .. index:: Xor .. _Xor: Xor --- `id=0.28120867323 Comments from the Wiki `__ .. cfunction:: void cvXor(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL) 2つの配列の要素毎に,ビット単位の排他的論理和を計算します. :param src1: 1 番目の入力配列. :param src2: 2 番目の入力配列. :param dst: 出力配列. :param mask: 8ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,2つの配列の要素毎にビット単位の排他的論理和を計算します: .. code-block:: c dst(I)=src1(I)^src2(I) if mask(I)!=0 .. 実際の計算の前に,スカラ値は配列と同じ型に変換されます.また,浮動小数点型配列の場合は,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. .. index:: XorS .. _XorS: XorS ---- `id=0.480989433931 Comments from the Wiki `__ .. cfunction:: void cvXorS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL) スカラ値と配列の要素毎に,ビット単位の排他的論理和を計算します. :param src: 入力配列. :param value: スカラ値. :param dst: 出力配列. :param mask: 8 ビットシングルチャンネル配列で表されるオプションマスク.指定された配列要素のみが変更されます. この関数は,スカラ値と配列要素毎に,ビット単位の論理和を計算します: .. code-block:: c dst(I)=src(I)^value if mask(I)!=0 .. 実際の計算の前に,スカラ値は配列と同じ型に変換されます.また,浮動小数点型配列の場合は,それらのビット表現が処理に用いられます.マスクを除くすべての入出力配列は,同じ型,同じサイズ(または ROI サイズ)でなければいけません. 以下のサンプルは,虚部の最上位ビットを反転することで共役複素ベクトルを求める方法を示しています: .. code-block:: c 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]); .. このコードは,次のような結果を出力します: .. code-block:: c (1.0,0.0) (0.0,-1.0) (-1.0,0.0) (0.0,1.0) .. .. index:: mGet .. _mGet: mGet ---- `id=0.463284217994 Comments from the Wiki `__ .. cfunction:: double cvmGet(const CvMat* mat, int row, int col) シングルチャンネルの浮動小数点型行列の指定された要素を返します. :param mat: 入力行列. :param row: 行を指定するインデックス,0 が基準点. :param col: 列を指定するインデックス,0 が基準点. この関数は, :ref:`GetReal2D` の高速バージョンで,シングルチャンネルの浮動小数点型行列に対してのみ利用できます.これは,インライン展開,配列や要素の種類チェックが最小限,行と列の範囲チェックはデバックモード時のみ,といった理由で高速に動作します. .. index:: mSet .. _mSet: mSet ---- `id=0.478524113846 Comments from the Wiki `__ .. cfunction:: void cvmSet(CvMat* mat, int row, int col, double value) シングルチャンネル,浮動小数点型行列の指定された要素を変更します. :param mat: 行列. :param row: 行を指定するインデックス,0 が基準点. :param col: 列を指定するインデックス,0 が基準点. :param value: 行列の要素に指定する新しい値. この関数は, :ref:`SetReal2D` の高速バージョンで,シングルチャンネルの浮動小数点型行列に対してのみ利用できます.これは,インライン展開,配列や要素の種類チェックが最小限,行と列の範囲チェックはデバックモード時のみ,といった理由で高速に動作します.