根据OpenCV中Mat类型的结构和内存中存储方式,此处给出三种对图像进行遍历的方法。首先给出基础的读取图片代码,在中间替换三种遍历方法即可,本文中,程序将遍历图像并将所有像素点置为255,所有运行结果中命令行里的数字为程序执行时间

#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include "highgui.h"
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat image = imread("D:\\Users\\Documents\\WinForm\\cpp_learn\\teach1\\Debug\\img.jpg",CV_LOAD_IMAGE_COLOR);//读取img.jpg到image中,此处可以写相对路径也可以写绝对路径
namedWindow("图片1");//定义一个名为“图片1”的窗口
imshow("图片1", image);//在窗口“图片1”中显示image double time = static_cast<double>(cv::getTickCount()); //遍历元素 time = static_cast<double>(cv::getTickCount()) - time;
time /= cv::getTickFrequency();
cout<<time<<endl; namedWindow("图片2");//定义一个名为“图片1”的窗口
imshow("图片2", image);//在窗口“图片1”中显示image
waitKey();
return ;
}

一、一个一个点的读取

  作为最低效率的一种方法,本法的思想就是从第一行第一列开始依次读第一行第二列、第三列,然后是第二行、第三行。其核心代码就是

image.at<uchar>(i,j)//读取灰度图像的点
image.at<cv::Vec3b>(i,j)[]//读取彩色图像点的0通道

该方法可以读取图像中i行j列的点,代码如下:

    for (int i = ; i < image.rows; i++)
{
for (int j = ; j < image.cols; j++)
{
//Do anything you want
if(image.channels() == )
{
image.at<uchar>(i,j) = ;
}
else if(image.channels() == )
{
image.at<cv::Vec3b>(i,j)[] = ;
image.at<cv::Vec3b>(i,j)[] = ;
image.at<cv::Vec3b>(i,j)[] = ;
}
}
}

二、 通过指针遍历图像

  由于Mat图像在内存中是连续排布的,因此定义指针指向行首地址后,指针每+1就会移到下一个元素上,此时直接操作指针所指内容就可以实现图像的操作。

    int image_rows = image.rows;//行数
int elementCount = image.cols*image.channels();//每行元素数
if (image.isContinuous())//如果图像没有经过填补 内存是连续排序
{
//则把图像看成行数X每行元素数个元素的一行,只进行一次循环
elementCount = elementCount*image_rows;
image_rows = ;
}
for (int i = ; i < image_rows; i++)
{
uchar* linehead = image.ptr<uchar>(i);//每行的起始地址
for (int j = ; j < elementCount; j++)
{
//遍历元素 Do anything you want
linehead[j] = ;
}
}

  值得注意的是,在内存上行与行之间的元素可能不是连续的(有时为提高效率,会将行元素填补为4的倍数),因此如果要连续用指针遍历图像,首先应判断图像是否有填补。

三、迭代器遍历

  这个和指针比较像,不细说了,上代码。

    Mat_<Vec3b>::iterator it = image.begin<Vec3b>();
Mat_<Vec3b>::iterator itend = image.end<Vec3b>();
for (; it!= itend; it++)
{
(*it)[] = ;
(*it)[] = ;
(*it)[] = ;
}

OpenCV2+入门系列(三):遍历图像的几种方法的更多相关文章

  1. mybatis入门系列三之类型转换器

    mybatis入门系列三之类型转换器 类型转换器介绍 mybatis作为一个ORM框架,要求java中的对象与数据库中的表记录应该对应 因此java类名-数据库表名,java类属性名-数据库表字段名, ...

  2. C# 互操作性入门系列(三):平台调用中的数据封送处理

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  3. [转]C# 互操作性入门系列(三):平台调用中的数据封送处理

    参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...

  4. c#图像处理入门(-bitmap类和图像像素值获取方法)

    c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义 ...

  5. 转载:遍历Map的四种方法

    http://www.cnblogs.com/kristain/articles/2033566.html 遍历Map的四种方法 public static void main(String[] ar ...

  6. java 遍历map的四种方法

    16:21:42 Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项( ...

  7. WPF编程,将控件所呈现的内容保存成图像的一种方法。

    原文:WPF编程,将控件所呈现的内容保存成图像的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/detai ...

  8. 遍历python字典几种方法

    遍历python字典几种方法 from: http://ghostfromheaven.iteye.com/blog/1549441 aDict = {'key1':'value1', 'key2': ...

  9. CSS三栏布局的四种方法

    总括: 不管是三栏布局还是两栏布局都是我们在平时项目里经常使用的,也许你不知道什么事三栏布局什么是两栏布局但实际已经在用,或许你知道三栏布局的一种或两种方法,但实际操作中也只会依赖那某一种方法,本文具 ...

随机推荐

  1. Python之路----------基础 一(数据类型、变量、基本语法、流程控制)

    一. 数据类型与变量 1.数据类型 整数   #Python在程序中的表示方法和数学上的写法一模一样,-1,0,1都是整数. 浮点数  1 #浮点数就是小数. 字符串 1 #在Python中字符串是以 ...

  2. swift 判断字符串长度

    projectName.lengthOfBytes(using: String.Encoding(rawValue: String.Encoding.utf16.rawValue)) > 0

  3. c++的重载运算符

    c++中允许重载运算符: 这是我辛苦的结果 #include"iostream"using namespace std;class aaa{ int x;public: aaa() ...

  4. java 关键字 assert的学习

    之前在学习java源码时,发现了assert这个不常用的关键字.下面直接来介绍下这个关键字的使用. assert是什么? 它是jdk1.4之后新增加的关键字,没了. assert的作用是什么? ass ...

  5. C/C++之指针加减法

    C和C++中可对指针进行加减,但对其进行乘除则基本无实际意义.一般来说,对指针进行减法的前提是减数和被减数均指向同一数组.加法同理.需要注意的是,两个指针的减法,结果是两个地址之间索引变量的数目,而不 ...

  6. Javascript之confirm的用法

    confirm函数 confirm函数用于提供确认功能,它首先显示给定的message参数所包含的信息,并提供两个可选择的回答“ok”和“cancel”,然后等待用户选择其中的一个.如果用户选择“ok ...

  7. jquery.min.map 404 (Not Found)出错的原因及解决办法

    Chrome 更新后出现了 jquery.min.map 404  (Not Found) 的信息 这个到底是什么东西?查询了一下,得到了以下资料 JQuery 官方解释 摘录一下內容 从 jQuer ...

  8. C语言 04 进制

    %d 或者%i 十进制 %c 输出字符 %p 输出地址 %f 输出小数 %o 八进制 %x 十六进制 一个int类型变量占4字节,占32bit(位) 例子:十进制 int=12  转二进制 0000 ...

  9. PHP 笔记一(systax/variables/echo/print/Data Type)

    PHP stands for "Hypertext Preprocessor" ,it is a server scripting language. What Can PHP D ...

  10. linux 使用 rz 和 sz 命令

    linux系统 root权限 lrzsz安装包 ①. 安装 编译安装 root 账号登陆后,依次执行以下命令: tar zxvf lrzsz-.tar.gz cd lrzsz- ./configure ...