前言
在面向对象的编程中,循环数据汇合通常是应用迭代器实现的。迭代器是专门为遍历汇合的每个元素而构建的类,暗藏了如何迭代给定汇合中每个元素的具体操作。信息暗藏原理的利用使扫描汇合更容易、更平安;同时,无论应用什么类型的汇合,迭代的模式都是类似的。规范模板库 (Standard Template Library, STL) 具备与其每个汇合类相关联的迭代器类。而 OpenCV 同样提供了一个 cv::Mat 迭代器类,该类与 C++ STL 中的规范迭代器兼容。在本节中,咱们应用持续增色工作解说如何应用迭代器扫描图像。
应用迭代器扫描图像
Cv::Mat 实例的迭代器对象能够通过首先创立一个 cv::MatIterator_ 对象来取得。与 cv::Mat_ 的状况一样,下划线示意这是一个模板子类。实际上,因为图像迭代器用于拜访图像元素,因而在编译时必须晓得返回类型。迭代器申明如下:
cv::MatIterator_<cv::Vec3b> it;
或者,也能够应用 Mat_ 模板类中定义的迭代器类型:
cv::Mat_<cv::Vec3b>::iterator it;
接下来,咱们将迭代器利用于色彩缩小工作。
要将迭代器利用于色彩缩小工作,须要执行以下步骤。
1、咱们应用常见的开始和完结迭代器办法循环像素。首先,咱们必须取得开始地位:
// 在初始地位获取迭代器
cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();
2、而后,咱们必须取得迭代器的完结地位:
// 获取完结地位
cv::Mat_<cv::Vec3b>::iterator itend = image.end<cv::Vec3b>();
3、接下来,咱们必须循环迭代器直到完结地位:
// 循环所有像素
for (; it!= itend; ++it) {
4、最初,对像素利用色彩缩小算法:
(*it)[0]= (*it)[0]/div*div + div/2;
(*it)[1]= (*it)[1]/div*div + div/2;
(*it)[2]= (*it)[2]/div*div + div/2;
因为咱们正在解决彩色图像,以上代码中的迭代器会返回一个 cv::Vec3b 实例,应用解援用运算符 [] 能够拜访每个色彩通道元素。
无论扫描哪种类型的汇合,应用迭代器始终须要遵循雷同的模式。首先,应用适当的专用类创立迭代器对象,在以上代码中,咱们应用了 cv::Mat_<cv::Vec3b>::iterator (或 cv::MatIterator_<cv::Vec3b>)。
而后,获取在起始地位 (在以上代码中为图像的左上角) 处应用 begin 办法初始化的迭代器。应用 cv::Mat 实例,能够通过 image.begin<cv::Vec3b>() 获取起始地位。咱们也能够在迭代器上应用算术。例如,如果心愿从图像的第二行开始迭代,能够在 image.begin<cv::Vec3b>()+image.cols 处初始化 cv::Mat 迭代器。汇合的完结地位的获取形式相似,但应用的是 end 办法。也能够在完结迭代器上应用算术;例如,如果心愿在最初一行之前进行,最终迭代将在迭代器达到 image.end<cv::Vec3b>()-image.cols 时进行。