[英]How to use pointer to process image with c# and 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;
for (int j = 0; j < ss.width; j++)
{
if (a * j - i + b > 0)
((byte*)(ptr))[j] = 0;
}
}
}
它的性能很好(0.5ms,而沒有指針則為4ms)。
然后我發現應該修復托管對象以防止重定位,所以我想這就像
Image<Gray, byte> diff = new Image<Gray, byte>(frame.Width,frame.Height);
fixed (void* p_temp=diff.Ptr.ToPointer()){}
要么
fixed (byte* p_temp=(byte*)temp.Ptr){}
但這是錯誤的,那么如何修復圖像呢? 以及如何在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;
}
}
}
}
我只是做了一個快速演示(不是生產質量代碼),為您提供了有關不安全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);
首先,我用隨機噪聲填充圖像,然后用漸變填充一些行:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.