如何将PointF列表转换为IntPtr?

时间:2012-04-29 12:13:56

标签: c# .net emgucv

我正在使用EmguCV,我不知道如何为像here这样的图像点传递2xN,Nx2,3xN,Nx3或1xN(N是点数)的数组。

我有一个创建float [N,2]数组的方法,但Marshal.Copy没有多维数组的重载,我不知道如何将X和Y值作为一个传递。

2 个答案:

答案 0 :(得分:4)

您只需调用cvCreateMat函数即可创建这些矩阵。 documentation of the native interface包含很好的示例,说明如何执行此操作。

要设置数据,您可以使用cvSet2D。它不如直接指针访问那么高效,但是从托管代码实现起来相当困难。

答案 1 :(得分:0)

试试这个:

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