我需要访问“数据”属性 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/