从EmguCV 3.1转换为3.3会导致代码挂起

时间:2017-11-23 16:42:51

标签: c# opencv emgucv

在使用非商业许可证的EmguCV 3.1.X(从Nuget安装)中,我有这个代码,我从is undefined behaviour获得并且工作正常:

    public static dynamic GetValue(this UMat mat, int row, int col)
    {
        var value = CreateElement(mat.Depth);
        Marshal.Copy(mat.ToMat(AccessType.Read).DataPointer + (row * mat.Cols + col) * mat.ElementSize, value, 0, 1);
        return value[0];
    }

我现在想切换到EmguCV 3.3.X的商业版本(从Nuget安装),因此必须将此代码更改为:

    public static dynamic GetValue(this UMat mat, int row, int col)
    {
        var value = CreateElement(mat.Depth);
        Marshal.Copy(mat.GetMat(AccessType.Read).DataPointer + (row * mat.Cols + col) * mat.ElementSize, value, 0, 1);
        return value[0];
    }

由于没有明显原因,此代码无异常挂起或在线上发生任何事情: Marshal.Copy(mat.GetMat(AccessType.Read).DataPointer + (row * mat.Cols + col) * mat.ElementSize, value, 0, 1);

我做错了什么或者这可能是EmguCV中的错误?

1 个答案:

答案 0 :(得分:0)

我没有“CreateElement”功能,所以我使用以下代码进行测试。它应该是类似的。

        UMat u = new UMat(new Size(480, 320), DepthType.Cv8U, 1);
        u.SetTo(new MCvScalar(100));

        byte[] value = new byte[1];
        int row = 100;
        int col = 200;

        using (Mat m = u.GetMat(AccessType.Read))
        {
            IntPtr ptr = m.DataPointer + row * m.Step + col * m.ElementSize;
            Marshal.Copy(ptr, value, 0, 1);
        }

使用Emgu CV商业版本nuget存储库中的v3.3.0.2824版本进行测试,无需挂起即可正常工作。如果您仍然遇到同样的问题,请上传完整的代码,我会看一下。

感谢。