【个人笔记】OpenCV4 C++ 快速入门 04课
个人资料,仅供学习使用
修改时间——2022年2月7日 11:00:47
学习课程:OpenCV4 C++ 快速入门视频30讲
视频老师:贾志刚
04 图像像素的读写操作
opencv知识点:
- 获取/改变图像的某个像素 - Mat::at
- 图像像素 - 数组遍历
- 图像像素 - 指针遍历
本课所解决的问题:
- 如何获取/改变图像的某个像素?
- 如何利用数组遍历图像像素?
- 如何利用指针遍历图像像素?
1.获取某个像素
我们获取/改变图像的某个像素,要用到Mat::at< >( )
image.at<uchar>(row, col);
/*
获取指定位置的像素值这里只是at方法的一种演示,一共6种传参方式,具体可查看文档
说明:at<>中必须标明矩阵的数据类型,一般图像是uchar(8位无符号整型)类型这里我们采用二维度坐标的方式传参
*/
2.图像像素的数组遍历
为了演示图像像素遍历,我们在遍历的同时进行一个反色处理
//函数定义
void pixel_visit_demo(Mat& image);//函数实现
void QuickDemo::pixel_visit_demo(Mat& image) {int h = image.rows;int w = image.cols;int dims = image.channels();/*灰度图像——通道为1彩色图像——通道为3*/for(int row = 0; row < h; row++) {for (int col = 0; col < w; col++) {if (dims == 1) {//灰度图像int pv = image.at<uchar>(row, col);image.at<uchar>(row, col) = 255 - pv;}if (dims == 3) {//彩色图像Vec3b bgr = image.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = 255 - bgr[0];image.at<Vec3b>(row, col)[1] = 255 - bgr[1];image.at<Vec3b>(row, col)[2] = 255 - bgr[2];}}}imshow("像素读写演示", image);
}
如上,我们可以看到,不同通道数的处理方式是不同的
- 对于单通道图像的使用方法:
int pv = image.at<uchar>(row, col);image.at<uchar>(row, col) = 255 - pv;//对访问的像素进行反色
- 对于RGB三通道图像的使用方法:
Vec3b bgr = image.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = 255 - bgr[0];//对访问的像素进行反色
image.at<Vec3b>(row, col)[1] = 255 - bgr[1];//对访问的像素进行反色
image.at<Vec3b>(row, col)[2] = 255 - bgr[2];//对访问的像素进行反色
这里我们解释一下Vec3b是什么
Vec3b可以看作是vector<uchar, 3>。
简单而言就是一个uchar类型的,长度为3的vector向量。
根据通道数的不同,数据类型的不同,就有了很多变化,下面是常用的三种
8U 类型的 RGB 彩色图像可以使用 < Vec3b >
3 通道 float 类型的矩阵可以使用 < Vec3f >
3 通道 int 类型的矩阵可以使用 < Vec3i >
3.图像像素的指针遍历
另一种更快的方式就是指针遍历
通过设置每一行的首地址指针,我们可以实现更快的遍历
for(int row = 0; row < h; row++) {uchar* curren_row = image.ptr<uchar>(row);//相当于每次获取行的首地址for (int col = 0; col < w; col++) {//灰度图像if (dims == 1) {*curren_row++ = 255 - *curren_row;}//彩色图像if (dims == 3) {*curren_row++ = 255 - *curren_row;*curren_row++ = 255 - *curren_row;*curren_row++ = 255 - *curren_row;}}}
取完每行的首地址之后
- 对于单通道图像的使用方法:
*curren_row++ = 255 - pv;
- 对于RGB三通道图像的使用方法:
//与数组遍历相比,3通道时执行三次就可以
*curren_row++ = 255 - *curren_row;
*curren_row++ = 255 - *curren_row;
*curren_row++ = 255 - *curren_row;
本课所用API查阅
Mat::at
虽然有12种重载,但只有6种传参方式
单维度坐标——i0:沿维度 0 的索引
双维度坐标——row 沿维度 0 的索引 ;col 沿维度 1 的索引
三维度坐标——i0 沿维度 0 的索引;i1 沿维度 1 的索引;i2 沿维度 2 的索引
维度数组坐标——int数组
维度数组坐标——vector数组
像素点的坐标——point类
【个人笔记】OpenCV4 C++ 快速入门 04课相关推荐
- 【个人笔记】OpenCV4 C++ 快速入门 29课
个人资料,仅供学习使用 修改时间--2022年2月19日 15:02:27 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 29 高斯双边模糊 opencv知识点: 高斯双边模 ...
- 【个人笔记】OpenCV4 C++ 快速入门 26课
个人资料,仅供学习使用 修改时间--2022年2月13日 20:49:07 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 26 直方图均衡化 opencv知识点: 均衡灰度图 ...
- 【个人笔记】OpenCV4 C++ 快速入门 25课
个人资料,仅供学习使用 修改时间--2022年2月13日 20:45:23 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 25 二维直方图 opencv知识点: 计算直方图数 ...
- 【个人笔记】OpenCV4 C++ 快速入门 23课
个人资料,仅供学习使用 修改时间--2022年1月26日 00:49:43 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 23 视频处理与保存 opencv知识点: Vide ...
- 【个人笔记】OpenCV4 C++ 快速入门 22课
个人资料,仅供学习使用 修改时间--2022年1月25日 22:09:17 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 22 视频文件摄像头使用 opencv知识点: VI ...
- 【个人笔记】OpenCV4 C++ 快速入门 20课
个人资料,仅供学习使用 修改时间--2022年1月24日 22:09:02 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 20 图像翻转 opencv知识点: 图像翻转 - ...
- 【个人笔记】OpenCV4 C++ 快速入门 19课
个人资料,仅供学习使用 修改时间--2022年1月24日 20:17:13 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 19 图像放缩与插值 opencv知识点: 图像放缩 ...
- 【个人笔记】OpenCV4 C++ 快速入门 17课
个人资料,仅供学习使用 修改时间--2022年1月23日 17:59:14 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 17 鼠标操作与响应 opencv知识点: 设置指定 ...
- 【个人笔记】OpenCV4 C++ 快速入门 14课
个人资料,仅供学习使用 修改时间--2022年2月13日 09:47:32 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 14 图像几何形状绘制 opencv知识点: 四种几 ...
最新文章
- VC++ 判断文件或文件夹是否存在的快捷方法 _access
- 波士顿动力机器狗再进化:已学会自主规划路线
- oracle 修改聚簇因子,Oracle 基础篇 --- 聚簇因子(clustering_factor)
- P2550 [AHOI2001]彩票摇奖
- Linux实战教学笔记24:SSH连接原理及ssh-key
- MTP管理才能发展专家
- 柱坐标系下的流体力学控制方程组的微分形式的推导
- 1寸、小2寸、2寸证件照片是多大尺寸?
- async/await 记录
- 广东知名企品牌拉芳好迪等的中文域名遭抢注
- 苹果iPhone14频繁自动重启是什么原因?如何修复这个问题?
- PreScan快速入门到精通第三十四讲基于PreScan进行超声波雷达传感器仿真
- Java中的枚举类是什么?enum关键字怎么使用?
- 万圣节html代码大全,基于Jquery实现万圣节快乐特效
- 蛋白质集合c语言算法,利用蛋白质序列的预测方法
- imp 00017 由于 oracle 错误 6550,imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 20005 求大神!...
- odoo12企业版修改邮箱配置
- 使用echarts实现雷达图
- LXC是什么、什么是docker、docker产生的背景
- 免费打印控件Lodop
热门文章
- NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)
- R+NLP︱text2vec包——四类文本挖掘相似性指标 RWMD、cosine、Jaccard 、Euclidean (三,相似距离)
- 特征选择的工程方法?
- Nova 操作汇总(限 libvirt 虚机) [Nova Operations Summary]
- 红帽专家谈 Ceph 与 Gluster 开源存储路线
- [转] 用GDB调试程序(五)
- python查询注册表子项是否存在并操作
- 《R in Action》读书笔记(3) 数据变换
- HP刀片服务器C7000-Cisco网络模块配置指南
- 教你如何与电脑病毒打游击