core_InputArray_new_byMat

[32/64bit] cv::_InputArray のインスタンスを生成します

core_InputArray_new_byMat p1,p2

p1 = sptr : IntPtr mat
p2 = var : out IntPtr returnValue

(プラグイン / モジュール : OpenCvSharpExtern.dll)

解説

これは,OpenCVの関数に読み取り専用の入力配列を渡すための,プロキシクラスです.


これは次のように定義されます: typedef const _InputArray& InputArray; ここで _InputArray は, Mat, Mat_<T>, Matx<T, m, n>, std::vector<T>, std::vector<std::vector<T> >, std::vector<Mat>, std::vector<Mat_<T> >, UMat, std::vector<UMat> または double から構成されるクラスです.また,行列式から構築することもできます.


これはほとんどが実装レベルのクラスであり,そのインターフェースは将来のバージョンで変更される可能性があるので,ここでは詳細な説明を省略します.しかし、いくつかの重要な点を覚えておく必要があります。





リファレンスマニュアルや OpenCV のソースコードで,InputArray を受け取る関数を見かけることがありますが,これは,実際に Mat, Matx, vector<T> などを渡すことができることを意味します(上記の完全なリストを参照してください).(完全なリストは上を参照してください).


オプションの入力引数.入力配列の一部が空の場合は, cv::noArray() を渡してください(あるいは,以前のように単に cv::Mat() を渡しても構いません).


このクラスは,パラメータを渡すためだけに設計されています.つまり,通常は,クラスのメンバやローカル変数,グローバル変数をこの型で宣言してはいけません.


複数の型の配列を操作できる独自の関数やクラスメソッドを設計したい場合は,それぞれのパラメータに InputArray(または OutputArray)を利用します.関数内では _InputArray::getMat() メソッドを使用して、(データをコピーせずに)配列の行列ヘッダを作成する必要があります。_InputArray::kind() は、Mat と vector<> などを区別するために利用できますが、通常は必要ありません。





ここでは,InputArray : std::vector<Point2f> vec;// 点または円for( int i = 0; i < 30; i++ ) vec.push_back(Point2f((float)(100 + 30*cos(i*CV_PI*2/5)), (float)(100 - 30*sin(i*CV_PI*2/5))));cv::transform(vec, vec, cv::Matx23f(0.707, -0.707, 10, 0.707, 0.707, 20)); つまり,点を含む STL ベクトルを作成し,Matx<float, 2, 3> インスタンスとしてインラインで作成された 2x3 行列を用いて,そのベクトルにインプレースのアフィン変換を行います.


以下は,このような関数の実装方法です(簡単にするために,内部のアサーション文に従って,非常に特殊なケースを実装しています): void myAffineTransform(InputArray _src, OutputArray _dst, InputArray _m){ // 入力配列に対する Mat ヘッダを取得します.これは, _src や _m が行列表現でない限り, // O(1) の処理です.    Mat src = _src.getMat(), m = _m.getMat(); CV_Assert( src.type() == CV_32FC2 && m.type() == CV_32F && m.size() == Size(3, 2) ); // 出力配列を適切なサイズと型になるように [再]作成します.    // Mat の場合は Mat::create を,STL vector の場合は vector::resize を呼び出します.    _dst.create(src.size(), src.type()); Mat dst = _dst.getMat(); for( int i = 0; i < src.rows; i++ ) for( int j = 0; j < src.cols; j++ ) { Point2f pt = src.at<Point2f>(i, j); dst.at<Point2f>(i, j) = Point2f(m.at<float>(0, 0)*pt.x + m.at<float>(0, 1)*pt.y + m.at<float>(0, 2), m.at<float>(1, 0)*pt.x + m.at<float>(1, 1)*pt.y + m.at<float>(1, 2)); }}。typedef InputArray InputArrayOfArrays; これは、ベクトルのベクトル、または行列のベクトルのいずれかである関数の引数を表します。Python/Javaなどのラッパーを適切に生成するためには、別のシノニムが必要です。関数の実装レベルでは、これらの使用方法は似ていますが、_InputArray::getMat(idx)は、外側のベクトルの idx 番目のコンポーネントのヘッダを取得するために使用し、_InputArray::size().area() は、外側のベクトルのコンポーネント(ベクトル/行列)の数を求めるために使用します。


一般に,サポートされる型は cv::Mat 型に限られます.それ以外の型は禁止されています.しかし,場合によっては, cv::KeyPoint や cv::DMatch などの配列のような,一般的ではないカスタムの Mat 型の受け渡しをサポートする必要があります.このデータは,画像データとして解釈されたり,通常の cv::Mat のように何らかの処理が行われたりすることはありません.このようなカスタムタイプを渡すには, rawIn() / rawOut() / rawInOut() ラッパーを利用してください.カスタムタイプは,Mat と互換性のある CV_8UC<N> 個の値(N = sizeof(T), N <= CV_CN_MAX)としてラッピングされます.


例:samples/cpp/pca.cpp,samples/cpp/peopledetect.cpp.


元関数名(C#): core_InputArray_new_byMat
元DLLエクスポート名: core_InputArray_new_byMat
参照元CSファイル: Internal\PInvoke\NativeMethods\core\NativeMethods_core_InputArray.cs
▼ C言語側関数定義
CVAPI(ExceptionStatus) core_InputArray_new_byMat(cv::Mat *mat, cv::_InputArray **returnValue)
{
    BEGIN_WRAP
    *returnValue = new cv::_InputArray(*mat);
    END_WRAP
}

情報

プラグイン / モジュールOpenCvSharpExtern.dll
バージョン1.00
作成日2021/11/30
著作者inovia
URLhttps://hsp.moe/
備考#include "OpenCvSharpExtern32.as"
#include "OpenCvSharpExtern64.as"
使用するHSPランタイムのビット数に合わせたインクルードファイルを使用すること
タイプOpenCVSharpラッパーDLL
グループNativeMethods_core_InputArray
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\OpenCvSharpExtern.hs