如何将 PointF 列表转换为 IntPtr

本文关键字:转换 IntPtr 列表 PointF | 更新日期: 2023-09-27 18:32:48

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

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

如何将 PointF 列表转换为 IntPtr

您只需调用 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))