为了构建计算机视觉应用程序,需要学会访问图像内容,有时也要修改或创建图像,如何操作图像的像素,就需要遍历一幅图像并处理每一个像素。现在我们就来介绍OpenCV三种图像像素的遍历方法:
一、 用cv::Mat类的at方法扫描图像
利用cv::Mat的at(int x,int y)方法可以访问元素,其中x是行号,y是列号。在编译时必须明确方法返回值的类型,因为cv::Mat可以接受任何类型的元素,所以程序员需要指定返回值的预期类型。正因为如此,at方法被实现成一个模板方法。在调用at方法时,你必须指定图像元素的类型,例如:
|
001 002 003 004 |
|
用cv::Mat类的at方法扫描图像代码如下:
|
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 |
|
二、 用指针扫描图像
一般来说,用指针扫描图像比较高效。在大多数图像处理任务中,执行计算时你都需要对图像的所有像素进行扫描。需要访问的像素数量非常庞大,因此你必须采用高效的方式来执行这个任务。
用指针扫描图像代码如下:
|
001 002 003 004 005 006 007 008 009 010 011 |
|
三、 用迭代器扫描图像
在面向对象编程时,我们通常用迭代器对数据集合进行循环遍历。迭代器是一种类,专门用于遍历集合的每个元素,并能隐藏遍历过程的具体细节。标准模板库(Standard Template Library,STL)对每个集合类都定义了对应的迭代器类,OpenCV也提供了cv::Mat的迭代器类,并且与C++ STL中的标准迭代器兼容。
用迭代器扫描图像代码如下:
|
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 |
|
测试代码:
|
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 |
|
运行结果:
|
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 |
|
说明我们完成遍历图像,并成功修改图像像素,至此大功告成~
本文详细介绍使用OpenCV遍历图像像素的三种方法:通过cv::Mat类的at方法、指针和迭代器,每种方法都有其适用场景和优缺点,通过实例代码展示如何修改图像像素。

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



