如何使用指针处理带有c#和emgucv的图像?

如何使用指针处理带有c#和emgucv的图像?,c#,emgucv,C#,Emgucv,我想用指针来处理图像,使它更快 unsafe { double a = 288 / 55; double b = -215 * 288 / 55; MIplImage ss = diff.MIplImage; for (int i = 0; i < ss.height; i++) { IntPtr ptr = ss.imageData + i * ss.widthStep;

我想用指针来处理图像,使它更快

unsafe
    {
        double a = 288 / 55;
        double b = -215 * 288 / 55;
        MIplImage ss = diff.MIplImage;
        for (int i = 0; i < ss.height; i++)
        {
            IntPtr ptr = ss.imageData + i * ss.widthStep;
            for (int j = 0; j < ss.width; j++)
            {
                if (a * j - i + b > 0)
                    ((byte*)(ptr))[j] = 0;
            }
        }
    }
Image<Gray, byte> diff = new Image<Gray, byte>(frame.Width,frame.Height);
fixed (void* p_temp=diff.Ptr.ToPointer()){}
但这是错误的。那么如何修复图像呢?如何将指针与emgucv一起使用?我真的很困惑。谢谢

unsafe
        {
            var data = diff.Data;
            int stride = diff.MIplImage.widthStep;
            byte* p;
            fixed (byte* pData = data)
            {
                for (int i = 0; i < diff.Height; i++)
                {
                    p = pData + i * stride;
                    for (int j = 0; j < diff.Width; j++)
                    {
                        if (a * j - i + b > 0)
                            *(p + j) = (byte)0;
                    }

                }
            }
        }
不安全
{
var数据=差异数据;
int stride=diff.MIplImage.widthStep;
字节*p;
固定(字节*pData=数据)
{
对于(int i=0;i0)
*(p+j)=(字节)0;
}
}
}
}
我刚刚做了一个快速演示(不是生产质量代码),为您提供一个关于不安全使用emgu的开始工作示例

        Image<Gray, Byte> img = new Image<Gray, byte>(510, 510);            
        // Fill image with random values
        img.SetRandUniform(new MCvScalar(), new MCvScalar(255));
        // Show Image
        ImageViewer.Show(img);
        var data = img.Data;
        int stride = img.MIplImage.widthStep;
        fixed (byte* pData = data)
        {
            for (int i = 0; i < 255 * stride; i++)
                *(pData + i) = (byte)(i % stride);
        }
        // Show Image Again
        ImageViewer.Show(img);
Image img=新图像(510510);
//用随机值填充图像
img.SetRandUniform(new MCvScalar(),new MCvScalar(255));
//显示图像
ImageViewer.Show(img);
var数据=模拟数据;
int stride=img.MIplImage.widthStep;
固定(字节*pData=数据)
{
对于(int i=0;i<255*步长;i++)
*(pData+i)=(字节)(i%步幅);
}
//再次显示图像
ImageViewer.Show(img);
首先我用随机噪声填充图像,然后用梯度填充一些行:-)

如果您尝试我的代码,并且它有效,您可以将其标记为答案:-)谢谢!但还有另一个问题。我修改了代码并添加到描述中。请看一看。它的成本约为45毫秒,而之前为0.5毫秒。是否还有其他方法可以解决它?您在循环中使用了Height和Width属性,这在幕后是一个GDI调用。看看我在这里给出的答案,这个问题的症状与你的相似。
        Image<Gray, Byte> img = new Image<Gray, byte>(510, 510);            
        // Fill image with random values
        img.SetRandUniform(new MCvScalar(), new MCvScalar(255));
        // Show Image
        ImageViewer.Show(img);
        var data = img.Data;
        int stride = img.MIplImage.widthStep;
        fixed (byte* pData = data)
        {
            for (int i = 0; i < 255 * stride; i++)
                *(pData + i) = (byte)(i % stride);
        }
        // Show Image Again
        ImageViewer.Show(img);