我正在使用 EmguCV,但我不知道如何为此处记录的图像点传递 2xN、Nx2、3xN、Nx3 或 1xN(N 是点数)的数组。
我有一种创建 float[N,2] 数组的方法,但是 Marshal.Copy 没有多维数组的重载,我不知道如何将 X 和 Y 值作为一个传递。
我正在使用 EmguCV,但我不知道如何为此处记录的图像点传递 2xN、Nx2、3xN、Nx3 或 1xN(N 是点数)的数组。
我有一种创建 float[N,2] 数组的方法,但是 Marshal.Copy 没有多维数组的重载,我不知道如何将 X 和 Y 值作为一个传递。
您只需调用该cvCreateMat
函数来创建这些矩阵。本机接口的文档包含很好的示例,展示了如何执行此操作。
为了设置您可以使用的数据cvSet2D
。它不如直接指针访问效率高,但从托管代码中实现这一点相当困难。
试试这个:
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 width, int height))