如何使用指针处理带有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);