[32/64bit] 行列が連続しているかどうかを報告します.
core_Mat_isContinuous p1,p2
p1 = sptr : IntPtr self p2 = var : out int returnValue
(プラグイン / モジュール : OpenCvSharpExtern.dll)
このメソッドは,行列の要素が各行の終わりに隙間なく連続して格納されている場合は true を返します.そうでない場合は,false を返します。明らかに,1x1 や 1xN の行列は常に連続しています.Mat::create で作成された行列は,常に連続しています.しかし, Mat::col や Mat::diag などを用いて行列の一部を抽出したり,外部から割り当てられたデータのために行列ヘッダを作成したりすると,そのような行列はもはやこの特性を持たないかもしれません.連続性フラグは Mat::flags フィールドのビットとして保存され,行列ヘッダを作成する際に自動的に計算されます.連続性フラグは Mat::flags フィールドのビットとして保存され,行列のヘッダを作成する際に自動的に計算されます.したがって,連続性チェックは非常に高速な処理ですが,理論的には以下のように行うこともできます: // Mat::isContinuous()の代替実装 bool myCheckMatContinuity(const Mat& m){ //return (m.flags & Mat::CONTINUOUS_FLAG) != 0; return m.rows == 1 || m.step == m.cols*m.elemSize();}fragmentこのメソッドは,OpenCV のかなり多くの関数で利用されています.ポイントは,要素単位の演算(算術演算や論理演算,数学関数,アルファブレンディング,色空間変換など)は,画像の形状に依存しないということです.したがって,入出力配列がすべて連続している場合,関数はそれらを非常に長い1列のベクトルとして処理することができます.以下の例は,アルファブレンディング関数がどのように実装されるかを示しています: template<typename T>void alphaBlendRGBA(const Mat& src1, const Mat& src2, Mat& dst){ const float alpha_scale = (float)std::numeric_limits<T>::max(), inv_scale = 1.f/alpha_scale; CV_Assert( src1.type() == src2.type() && src1.type() == CV_MAKETYPE(traits::Depth<T>::value, 4) && src1.size() == src2.size()); Size size = src1.size(); dst.create(size, src1.type()); // ここでイディオムですが,配列が連続しているかどうかをチェックし, // 連続している場合は, // 配列を 1 次元のベクトルとして扱う if( src1.isContinuous() && src2.isContinuous() && dst.isContinuous() ) { size.width *= size.height; size.height = 1; } size.width *= 4; for( int i = 0; i < size.height; i++ ) { // 配列が連続している場合, // 外側のループは一度だけ実行されます const T* ptr1 = src1.ptr<T>(i); const T* ptr2 = src2.ptr<T>(i); T* dptr = dst.ptr<T>(i); for( int j = 0; j < size.width; j += 4 ) { float alpha = ptr1[j+3]*inv_scale, beta = ptr2[j+3]*inv_scale; dptr[j] = saturate_cast<T>(ptr1[j]*alpha + ptr2[j]*beta); dptr[j+1] = saturate_cast<T>(ptr1[j+1]*alpha + ptr2[j+1]*beta); dptr[j+2] = saturate_cast<T>(ptr1[j+2]*alpha + ptr2[j+2]*beta); dptr[j+3] = saturate_cast<T>((1 - (1-alpha)*(1-beta))*alpha_scale); }。 この関数に含まれるもう1つの OpenCV のイディオムである,出力配列に対する Mat::create の呼び出しは,出力配列が既に適切なサイズと型を持っている場合を除いて,その出力配列を確保します.また,新たに確保された配列は常に連続していますが, Mat::create が常に新しい行列を確保するとは限らないので,出力配列をチェックする必要があります. 元関数名(C#): core_Mat_isContinuous 元DLLエクスポート名: core_Mat_isContinuous 参照元CSファイル: Internal\PInvoke\NativeMethods\core\NativeMethods_core_Mat.cs ▼ C言語側関数定義
CVAPI(ExceptionStatus) core_Mat_isContinuous(cv::Mat *self, int *returnValue) { BEGIN_WRAP *returnValue = self->isContinuous() ? 1 : 0; END_WRAP }
プラグイン / モジュール | OpenCvSharpExtern.dll |
バージョン | 1.00 |
作成日 | 2021/11/30 |
著作者 | inovia |
URL | https://hsp.moe/ |
備考 | #include "OpenCvSharpExtern32.as"
#include "OpenCvSharpExtern64.as" 使用するHSPランタイムのビット数に合わせたインクルードファイルを使用すること |
タイプ | OpenCVSharpラッパーDLL |
グループ | NativeMethods_core_Mat |
対応環境 |
|
hs ファイル | hsphelp\OpenCvSharpExtern.hs |