c# - 为 CvMat.data union 创建 C# 结构或以任何方式在 C# 中访问它

标签 c# c++ data-structures opencv emgucv

我需要访问“数据”属性 EmguCV MCvMat 结构。但该属性是一个指针(IntPtr)。我发现这个属性(数据)的结构是一个 union 。是这样的:

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));

但这给了我一个异常(exception)。我需要做的是:

  • 在 C# 中创建数据结构以访问此指针或
  • 访问 MCvMat.data 属性的任何其他方式

最佳答案

我已经发布了 a Visual Studio 2010 solution on SkyDrive .它演示了如何解码这种结构。

当我有更多时间时,我会尝试使用 MarshalAs 属性。通常,在这种情况下,我会在 C++ 中实现一个适配器层,以便更轻松地在非托管代码和托管代码之间传输数据。

关于c# - 为 CvMat.data union 创建 C# 结构或以任何方式在 C# 中访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6279796/

相关文章:

c++ - 运行时大小的数组和指针衰减

c++ - 如何添加到已分配的字符?

algorithm - graph - 如何获得最小权重连通子集?

Java 队列。该程序结果为空。

c++ - 使用优先级队列结构?

c# - 如何使用正则表达式替换匹配项,前提是它前面没有给定字符?

c# - 你应该包装工作单元吗?

C++ 和迭代器失效

c# - ListView FocusedItem 变为 NULL

c# - 通过扩展方法将一个对象转换为另一个对象——寻找替代解决方案