本文介绍的cv::像素遍历方法如下:

  • 使用at成员函数
  • 使用ptr指针访问
  • 使用迭代器iterator

1. 使用at(i, j)

这种方式在Debug模式下的访问速度是最慢的,但是在Release模式下的访问速度也是相当快的,和其他方式相近。

  • 单通道遍历(灰度图像)
cv::Mat image(100 , 100 , CV_8UC1);
int rows = image.rows;
int cols = image.cols;for (int i=0; i<rows ; i++)
{  for (int j=0; j<cols ; j++)  {  image.at<uchar>(i,j) = 20;  }
}
  • 多通道遍历(彩色图像)
cv::Mat image(100 , 100 , CV_8UC3);
int rows = image.rows;
int cols = image.cols;for (int i=0; i<rows ; i++)
{  for (int j=0; j<cols ; j++)  {  image.at<cv::Vec3b>(i,j)[0]= 20;  // B 通道image.at<cv::Vec3b>(i,j)[1]= 20;  // G 通道image.at<cv::Vec3b>(i,j)[2]= 20;  // R 通道}
}  

注:灰度图像元素类型为<uchar>, 彩色图像元素类型为<cv::Vec3b>

注:image.at<>(y, x)

注:这种方式会检查访问是否会溢出。

2.  使用指针 ptr(i)(j)

这种方式是最有效的方式, 可以使用iscontinue()函数来提高遍历的速度。

cv::image image = cv::imread("xx.png", cv::IMREAD_COLOR);int channels = image.channels;
int rows = image.rows;
int cols = image.cols * channels;if (image.isContinuous()){cols *= rows;rows = 1;}int i, j;
uchar* p;
for (i = 0; i < rows; ++i)
{p = image.ptr<uchar>(i);for (j = 0; j < cols; ++j){std::cout << int(p[j]) << " ";}
}

注: image.ptr<>(i)返回第i行首元素的指针。

3. 使用迭代器iterator

  • 单通道遍历(灰度图像)
cv::Mat image(100 , 100 , CV_8UC1);  for (auto it = image.begin<uchar>(); it != image.end<uchar>(); ++it)
{std::cout << int((*it)) << " ";
}
  • 多通道遍历(彩色图像)
cv::Mat image(100 , 100 , CV_8UC3);  for (auto it = image.begin<cv::Vec3b>(); it != image.end<cv::Vec3b>(); ++it)
{std::cout << int((*it)[0]) << " " << int((*it)[1]) << " " << int((*it)[2]) << std::endl;
}

opencv之cv::Mat像素遍历相关推荐

  1. 遍历opencv中的mat像素的几种方法和概念

    今天在看矩形滤波的时候忽然脑子短路,把一些概念全弄混了,现总结一下,以便下次再混的时候可以参考确认下,自己的理解,有错的地方还请指正. 首先,在Opencv2中基本上都是用的Mat来表示图像了,C++ ...

  2. 在OpenCV中将cv::Mat绘制到MFC的视图中

    毕设时遇到了一个问题,不能在MFC中显示由GrabCut抠出来的图.经一番折腾发现: 在OpenCV中如果图像最初是Mat类型的话,就不能通过转换为IplImage,再转换为CvvImage来显示到V ...

  3. 【OpenCV】cv::Mat和std::vector之间的相互转换

    Mat转换成Vector 以vector 为例,其它模型类似 vector getVector(const Mat & a) { Mat b; a.convertTo(b, CV_64F); ...

  4. 【OpenCV】cv::Mat对单个像素的访问和操作

    我们在使用OpenCV进行图像处理的过程中,经常会涉及到对指定位置像素的读取和修改,下面我们就介绍OpenCV中几种常用的对指定位置像素值的读取和修改操作. 一.at操作 at操作是一种直接简单的对单 ...

  5. 【OpenCV】cv::Mat位深和通道,CV_8UC1等

    位深 每个像素由多少位来存储 是一个精度问题,一般图片是8bit(位)的,则深度是8 通道 每个像素点能存放多少个数 类似于RGB彩色图中的每个像素点有三个值,即三通道 一个图像的通道数是N,就表明每 ...

  6. opencv(二)图像像素提取及操作

    为了编写计算机视觉应用,我们必须会存取图像的内容,如修改或者创建图像,这些过程都需要对图像的基本元素进行操作,即所谓的像素. 1[存取像素值] 为了存取矩阵元素,我们需要在代码中指定元素所在的行和列, ...

  7. 独家|OpenCV 1.1 Mat - 基本图像容器(附链接)

    翻译:陈之炎 校对:吴振东.林夕本文约3600字,建议阅读10分钟本文为大家系统地介绍了OpenCV官方教程. 写在前边 让读者朋友们较为系统地了解和学习OpenCV官方教程,数据派THU翻译组联合研 ...

  8. QImage/cv::Mat/HObject的图像格式互相转换,4字节对齐

    QImage/cv::Mat互相转换 QImage ImgChange::cvMat2QImage(const Mat &mat) // Mat 改成 QImage {if (mat.type ...

  9. mat 释放_c++ - OpenCV无法释放Mat *内存 - 堆栈内存溢出

    绝对可以使用cv :: Mat指针,但是(与所有指针一样)您必须格外小心地删除创建的对象,以再次释放分配的内存. 在您的示例代码中,尚不清楚是否将在任何地方删除其指针在函数中返回的对象. 如果不是这种 ...

最新文章

  1. hdu 2031 进制转换
  2. linux中标准I/O 文件I/O 及库
  3. 嵌入式系统实时仿真解决方案SkyEye
  4. Flash务实主义——Loading
  5. Rust —— 一门没有GC的语言
  6. cms php vue 开源_2020最受欢迎的企业网站CMS建站系统排行榜
  7. Tomcat—logs文件夹中不再产生日志文件
  8. python画图设置彩色线条_Python数据处理从零开始----第四章(可视化)(19)一文解决线图line chart...
  9. 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针...
  10. linux下cmake安装配置
  11. 18650锂电池保护板接线图_锂电池保护板的原理介绍保护板的构成和主要作用
  12. 汉诺塔递归算法python详细解析图_汉诺塔递归算法分析过程
  13. 宝塔面板添加站点及运营商SSL免费证书的申请与使用
  14. matlab如何把正弦转化为余弦公式,高中正弦和余弦公式定理,正余弦转化公式
  15. luogu1600天天爱跑步
  16. Grounded theory相关知识
  17. 前端开发JS--匀速运动
  18. 【正点原子FPGA连载】 第二十章 LCD触摸屏实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
  19. HAL库开发—基于stm32的智能小家电
  20. 数据结构与算法(刺猬书)读书笔记(1)----数组

热门文章

  1. 【最小割】HDU 4289 Control
  2. c# 关于继承类中构造函数的实现
  3. 《You can do it!》的chapter 2笔记
  4. Python办公自动化(六)|自动更新表格,
  5. windows 7系统报错txupd.exe
  6. 在ubuntu16.04上搭建svn服务器
  7. 编译安装的mysql如何更改文件路径
  8. 软件测试工程师 Linux 十大场景命令使用
  9. cmd 命令 之 dir 之 强化使用
  10. c语言 malloc前的括号,20. 有效的括号(LeetCode)——C语言及JS实现