2012-04-29 3 views
0

私はEmguCVで作業していますが、文書番号hereのようなイメージポイントの2xN、Nx2,3xN、Nx3または1xN(Nはポイント数)の配列をどのように渡すことができるのか分かりません。List of PointFをIntPtrに変換するにはどうすればよいですか?

私はfloat [N、2]の配列を作成する方法を持っていますが、Marshal.Copyには多次元配列のオーバーロードはなく、XとYの値をどのように渡すことはできません。

答えて

4

これらの行列を作成するには、単に関数cvCreateMatを呼び出します。 documentation of the native interfaceには、これを行う方法を示す良い例が含まれています。

データを設定するにはcvSet2Dを使用できます。これは、直接ポインターアクセスほど効率的ではありませんが、管理されたコードから達成するのはかなり困難です。

+0

ありがとうございました。もう一度簡単な質問:MCvScalarをどのように新しくする必要がありますか?そのコンストラクタは倍精度だけを持ちます。 –

+0

それは別の質問です。今私は答えを知らない。私の推測では、あなたが選択したスカラー型に何か変換される途中でどこか二重で使用することが予想されるだけです。 –

0

このお試しください:

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高さ))

+1

私は何らかの形でこれがいつもうまくいくのではないかと疑っています。 – leppie

+0

あなたは正しいです。私はそれを考えなかった。より多くのフィードバックのために編集後に検討してください。 – SimpleVar

+0

これをどれだけ編集するかは関係ありません。いつも間違っています。 openCV用の正しいデータ構造を作成する必要があります。独自のデータ構造を作成することはできません。 –

関連する問題