emgucv使用索引速度之慢,都是有目共睹的,使用索引的方式写自定义的方法在效率上实不可取的。
楼主学习emgucv有半年左右。当初是从opencv转来的,对 Mat的数据结构有所了解 ,尝试写出了指针遍历Mat图像的函数模板。
大家使用这个模板可以写出自定义的处理函数,非常方便哦
直接见干货
public void PtrProcess(Mat img)
{
///要使用指针遍历需要预先知道Mat矩阵元素的类型,通常使用的是Cv8U(unchar) 在C#里面对应byte,其他类型的对应关系见DepthType的枚举注释
if (img == null || img.IsEmpty || img.Depth != DepthType.Cv8U) throw new ArgumentException("img is unvalid!");
int rows = img.Rows, cols = img.Cols, step = img.Step;
unsafe
{
byte* dataptr = (byte*)img.DataPointer;
///单通道图像遍历方式
if (img.NumberOfChannels == 1)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
int index = i * step + j;
///get
byte getvalue = dataptr[index];
///set
byte setvalue = 127;
dataptr[index] = setvalue;
}
}
}
///多通道图像遍历方式,以BGR图像为例
else
{
int chns = img.NumberOfChannels;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
///B,G,R 顺序 c= 0,1,2;
for (int c = 0; c < chns; c++)
{
int index = i * step + j * chns + c;
///get
byte getvalue = dataptr[index];
///set
byte setvalue = 127;
dataptr[index] = setvalue;
}
}
}
}
}
}
|