陕西建工第三建设集团网站,网页页面建设方案,策划网络营销活动方案,静态网站素材#x1f389;#x1f389;#x1f389; 欢迎来到小白 p i a o 的学习空间#xff01; \color{red}{欢迎来到小白piao的学习空间#xff01;} 欢迎来到小白piao的学习空间#xff01;#x1f389;#x1f389;#x1f389; #x1f496; C\Python所有的入门技术皆在 我… 欢迎来到小白 p i a o 的学习空间 \color{red}{欢迎来到小白piao的学习空间} 欢迎来到小白piao的学习空间  C\Python所有的入门技术皆在 我的主页 \color{#0cc123}{我的主页} 我的主页我的主页 我的资源 \color{purple}{我的资源} 我的资源我的资源 
IT技术各档次模板各类项目企业项目、毕设数据库安装包Mysql8.0技能资料电子书、软考等 目录  前言 \color{purple}{前言} 前言  一、利用成员变量 s t e p 和 d a t a 访问 M a t 中的元素 \color{blue}{一、利用成员变量step和data访问Mat中的元素} 一、利用成员变量step和data访问Mat中的元素 1.1 s t e p 和 d a t a 的概念 \color{green}{1.1 step和data的概念} 1.1step和data的概念1.1.1 step1.1.2 data  1.2 具体使用方法 \color{green}{1.2 具体使用方法} 1.2具体使用方法1.2.1 图解教程1.2.2 代码实例  1.3 小结 \color{green}{1.3 小结} 1.3小结   二、总结 \color{red}{二、总结} 二、总结 前言 \color{purple}{前言} 前言 昨天由于有点写不动了所以还剩了些内容放在今天完成今天的内容完成常用Mat操作的元素访问环节的介绍如果还没有看过前边内容的小伙伴赶紧从前文开始学起来哦 
前文链接【C的OpenCV】第十四课-OpenCV基础强化二访问单通道Mat中的值 一、利用成员变量 s t e p 和 d a t a 访问 M a t 中的元素 \color{blue}{一、利用成员变量step和data访问Mat中的元素} 一、利用成员变量step和data访问Mat中的元素 通过之前的学习内容我们知道Mat中的元素在空间中存储的形式无非以下两种 形式一行元素连续行与行之间有固定等大的间隔   形式二所有元素连续存储   如果不知道为什么的小伙伴请赶快点击上边的前文链接学习起来【C的OpenCV】第十四课-OpenCV基础强化二访问单通道Mat中的值 1.1 s t e p 和 d a t a 的概念 \color{green}{1.1 step和data的概念} 1.1step和data的概念 
1.1.1 step 不难看出首先step是一个MatStep类型的值那MatStep又是什么呢 在OpenCV中MatStep是一个结构体用于描述一个多维矩阵Mat的步幅stride。步幅是指在内存中从一个元素到下一个元素所需的字节数。 
值得注意的是 
step[0] 代表矩阵每一行所占的字节数如果有间隔的话这个间隔的字节数也算作在内step[1] 代表每一个数值所占的字节数。 
1.1.2 data 首先呢它就是一个uchar类型的指针而已其次呢其实就是指向矩阵第一个值的指针。 1.2 具体使用方法 \color{green}{1.2 具体使用方法} 1.2具体使用方法 
// 基于上述的描述
// 访问一个元素可以如下
*((int*)(m.datam.step[0]*rm.step[1]*c))// 其中1.r代表行c代表列都是从0开始。2.m就是一个Mat对象后续有完整代码展示这里特此申明1.2.1 图解教程 重点来了花点事件通过图解的形式理解一下上述的代码为什么可以找到每一个想要找到的元素 假如说我们需要访问下边矩阵中的元素4  首先解析代码中的m.data: 指向首个元素的指针即目前其位置如下          接下来我们来看 m.datam.step[0]*r :         4 所在的位置的r值r1如果是访问第一行元素则很简单了r为0就没有 m.step[0]*r 这一项了。         m.step[0]*r此时就是第一行所有的字节数包含间距即如下图蓝色方框框住的即为m.step[0]所占的字节空间         所以上述的操作其实相当于是把m.data往后移动了“ m.step[0] * 1 ” 的字节数此时m.data就跨过了第一行的间隔来到了第二行首个元素的位置。 (这里纠正一下在上边一张描述m.data的位置的图片中我将其指向了那个数字1这种描述不够准确特此纠正应该是指向空间的头) 最后就是这个“ m.step[1]*c ”了首先step[1]还记得吗代表“一个数值所占的字节数”这里4处于的位置中c的值为1          所以这里相当于给m.data加了一个元素的字节数m.step[1] * 1,所以m.data发生了移动          经过上述一系列的操作终于搞懂了“(m.datam.step[0]*rm.step[1]*c)”的含义至于外边的那个int*就不解释了类型强制转换而已 。 而这个玩意呢不就是把强转之后的指针去解除引用找到对应位置的元素吗那不就是4吗下边是代码展示 
1.2.2 代码实例 
#includeiostream
#includeopencv2/core/utility.hpp
using namespace std;
using namespace cv;int main()
{Mat m  (Mat_int(3,2)  1,2,3,4,5,6);cout  m endl; // 注意显示的是3行2列/*[1, 2;3, 4;5, 6]*/cout  *((int*)(m.datam.step[0]*1m.step[1]*1))  endl;return 0;
} 1.3 小结 \color{green}{1.3 小结} 1.3小结 
简短总结下访问Mat中元素的方法 
成员函数at() 前文链接成员函数ptr() 前文链接isContinuous()和ptr()组合的方式 前文链接step和data组合方式 这是四种最常用的方法希望大家可以熟练掌握即使没有新的思路那这几个基本可以解决开发中实际遇到的访问元素的情况千万不要觉得难的方法就不用了有些复杂环境下可能更加高效总而言之掌握多一点对你没坏处 二、总结 \color{red}{二、总结} 二、总结 这部分内容落下了实际是写不动了给大家补全可以理解为是上一章节的补充章节可以学习起来了。新章节的内容我们另起一页重头说起 持续更新期待关注 \color{blue}{持续更新期待关注} 持续更新期待关注