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
}

然后使用 Marsel 进行转换,

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 回答