OpenCVForUnity(四)如何使用OpenCV图像处理机制


前言

这节课我们来了解一下OpenCV是如何处理如此庞大的像素点集群的。


如何扫秒通道的每个像素

每个像素点中,最多可以也有256个不同的值.而每个像素可以有四个通道,这意味着每个像素点可以形成1684万的颜色.这对性能无疑是沉重的打击.然而可以OpenCV使用了优化的方式,使其减少工作量以达到相同的效果.

通常会通过减少色彩空间,如0 ~ 9 则取0,10 ~ 19则取10. 向下舍入.每个值都在十到十之间。当用使用Int值将uCher值分隔时结果将会是char。因此任何分数也将是向下啥入,表达为公式为:
在这里插入图片描述

简单的空间缩小算法可以用过矩阵公式来实现,如使用乘法除法对性能的消耗更大,因而OpenCV会优先使用加减法,且值的上限为256.
为了提升处理速度 ,对于较大的图像可能通过预先计算的方式并使用表记录查找的方式分配。


图像如何储存在内存中?

图像矩阵的大小取决于颜色系统和通道数量,在灰度的情况他像这样:
在这里插入图片描述
对于多通道列包含与通道数一样多的子列。例如是BGR颜色系统下情况则是这样:
在这里插入图片描述
值得注意的是在openCV中通道顺序是 **BGR**而不是 RGB.
通常内存是足够大的而且是连续结构这样有助于更快的读写扫描.


访问方式

最有效的方法是使用指针, 在处理矩阵时,我们需要获取指向每一行开头的指针,并遍历每一项。对于彩色图像,由于有三个通道,我们需要遍历每行三次以上。Mat对象的数据成员返回指向第一个元素的指针,如果为空,则说明图像未加载成功。在灰度图像的情况下,遍历是连续的。

性能差异

为了对比出更好效果,我们运行程序并对比出差异。为了便差异更加清晰,我们使用2560 X 1600 的图像。这里呈现的性能是彩色图像。为了更准确的值我们的数据为调用100次后的平均值。

方法 时间
高效的方式 79.4717毫秒
迭代程序 83.7201毫秒
在飞行RA 93.7878毫秒
LUT功能 32.5759毫秒

通过上表我们可以总结出一些内容。如果可以,尽可能使用OpenCV现有的方法,效率会比较高. 可以看出最忆的方式是使用LUT功能。这是因为OpenCV库通过Intel Threaded Building Blocks启用多线程。

但是如果你需要编写一个简单的图片扫描可以考虑使用指针的方式。

猜你喜欢

转载自blog.csdn.net/ww1351646544/article/details/131632734