1、目的:遍历、修改Mat像素
本文主要是在学习How to scan images, lookup tables and time measurement with OpenCV和OpenCV如何扫描图像、利用查找表和计时过程中,将对应的原文中的C++源码用OpenCVSharp重写,但由于对原文的理解和对OpenCVSharp的了解有限,无法一一重写,只能结合自己的了解,依葫芦画瓢式地进行了重写。
原文章中,主要介绍了一种 颜色空间缩减算法:将现有颜色空间值除以某个输入值,以获得较少的颜色数。例如,颜色值0到9可取为新值0,10到19可取为10,以此类推。并用多种方式实现该算法,以对比各种方式之间的性能。
本文主要实现用Mat按指针、GetGenericIndexer、GetIndexer、GetUnsafeGenericIndexer、At、Get/Set方式以及LUT方法遍历和修改像素。
上代码前,先看看重复执行100次对应算法的耗时对比吧
Debug模式下:
Release模式下:
2、指针访问Mat
private Mat ScanImageAndReduceByPtr(Mat I, byte[] table)
{
Debug.Assert(I.Depth() == MatType.CV_8U);
int channels = I.Channels();
int nRows = I.Rows;
int nCols = I.Cols * channels;
if (I.IsContinuous())
{
nCols *= nRows;
nRows = 1;
}
unsafe
{
for (int i = 0; i < nRows; i++)
{
var p = I.Ptr(i);
byte* b = (byte*)p.ToPointer();
for (int j = 0; j < nCols; j++)
{
b[j] = table[b[j]];
}
}
return I;
}
}

文章通过实现不同方法遍历和修改OpenCVSharp中的Mat像素,包括指针访问、GetIndexer、GetGenericIndexer、GetUnsafeGenericIndexer、At、Get/Set以及LUT,并在Debug和Release模式下对比了它们的性能。结果显示,LUT方法在性能上最优,而Get/Set方法最差。此外,文章提供了用于测试的代码示例。
7739

被折叠的 条评论
为什么被折叠?



