私は EmguCV を使用していますが、ここに記載されているようなイメージ ポイントに 2xN、Nx2、3xN、Nx3、または 1xN (N はポイントの数) の配列を渡す方法がわかりません。
float[N,2] の配列を作成する方法がありますが、Marshal.Copy には多次元配列のオーバーロードがなく、X 値と Y 値を 1 つとして渡す方法がわかりません。
私は EmguCV を使用していますが、ここに記載されているようなイメージ ポイントに 2xN、Nx2、3xN、Nx3、または 1xN (N はポイントの数) の配列を渡す方法がわかりません。
float[N,2] の配列を作成する方法がありますが、Marshal.Copy には多次元配列のオーバーロードがなく、X 値と Y 値を 1 つとして渡す方法がわかりません。
関数を呼び出すだけで、cvCreateMat
これらの行列を作成できます。ネイティブ インターフェイスのドキュメントには、これを行う方法を示す良い例が含まれています。
データを設定するには、 を使用できます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 width, int height)) による可能性があります。