私はEmguCVで作業していますが、文書番号hereのようなイメージポイントの2xN、Nx2,3xN、Nx3または1xN(Nはポイント数)の配列をどのように渡すことができるのか分かりません。List of PointFをIntPtrに変換するにはどうすればよいですか?
私はfloat [N、2]の配列を作成する方法を持っていますが、Marshal.Copyには多次元配列のオーバーロードはなく、XとYの値をどのように渡すことはできません。
私はEmguCVで作業していますが、文書番号hereのようなイメージポイントの2xN、Nx2,3xN、Nx3または1xN(Nはポイント数)の配列をどのように渡すことができるのか分かりません。List of PointFをIntPtrに変換するにはどうすればよいですか?
私はfloat [N、2]の配列を作成する方法を持っていますが、Marshal.Copyには多次元配列のオーバーロードはなく、XとYの値をどのように渡すことはできません。
これらの行列を作成するには、単に関数cvCreateMat
を呼び出します。 documentation of the native interfaceには、これを行う方法を示す良い例が含まれています。
データを設定するにはcvSet2D
を使用できます。これは、直接ポインターアクセスほど効率的ではありませんが、管理されたコードから達成するのはかなり困難です。
このお試しください:
float[,] floats = new float[2,3];
IntPtr intPtr = Marshal.UnsafeAddrOfPinnedArrayElement(floats, 0);
次のような方法がうまくいくかもしれないが、GCで可能な問題が発生しますので、慎重にそれを使用します。
float[,] floats = new float[3, 2];
fixed (void* pt = array)
{
IntPtr intPtr = new IntPtr(pt);
CallMethod(intPtr, other parameters...);
}
をしかし、呼び出されたメソッドは何とか何寸法を知っている必要がありますあります。たぶん名前(DoSomething2x3、DoSomething3x2など)またはパラメータ(DoSomething(IntPtr ptr、int幅、int高さ))
ありがとうございました。もう一度簡単な質問:MCvScalarをどのように新しくする必要がありますか?そのコンストラクタは倍精度だけを持ちます。 –
それは別の質問です。今私は答えを知らない。私の推測では、あなたが選択したスカラー型に何か変換される途中でどこか二重で使用することが予想されるだけです。 –