1

「データ」プロパティ EmguCV MCvMat 構造体にアクセスする必要があります。しかし、そのプロパティはポインター (IntPtr) です。このプロパティ (データ) の構造は共用体であることがわかりました。こんな感じです:

union Data
{
    char* ptr;     // Data pointer for an unsigned char matrix
    short* s;      // Data pointer for a short matrix
    int* i;        // Data pointer for an integer matrix
    float* fl;     // Data pointer for a float matrix
    double* db;    // Data pointer for a double matrix
} Data;

私はC#でこれのための構造を作成しようとしました:

[StructLayout(LayoutKind.Explicit)]
struct MCvMatData
{
    [FieldOffset(0)]
    public char[] ptr;     // Data pointer for an unsigned char matrix
    [FieldOffset(0)]
    public short[] s;      // Data pointer for a short matrix
    [FieldOffset(0)]
    public int[] i;        // Data pointer for an integer matrix
    [FieldOffset(0)]
    public float[] fl;     // Data pointer for a float matrix
    [FieldOffset(0)]
    public double[] db;    // Data pointer for a double matrix
}

Marshel を使用して変換し、

MCvMat mat = (MCvMat)Marshal.PtrToStructure(pMat, typeof(MCvMat));
MCvMatData matdata = (MCvMatData)Marshal.PtrToStructure(mat.data, typeof(MCvMatData));

しかし、これは私に例外を与えます。私がする必要があるのは:

  • このポインターにアクセスするために C# でデータ構造を作成するか、
  • MCvMat.dataプロパティにアクセスするその他の方法
4

1 に答える 1

0

SkyDrive で Visual Studio 2010 ソリューションを公開しました。これは、そのような構造のアンマーシャリングを示しています。

もっと時間があれば、MarshalAs 属性を試してみます。通常、このような状況では、C++ でアダプター レイヤーを実装して、アンマネージド コードとマネージド コードの間でデータを簡単に転送できるようにします。

于 2011-06-08T14:14:17.533 に答える