学习Opencv(蝴蝶书/C++)——4.图形和大型数组类型(上)

news2024/9/23 21:27:37

文章目录

  • 1. cv::Mat类的成员变量
    • 1.1 flags
    • 1.2 cv::Mat::step
  • 2 存储方式,存储位置计算
    • 2.1 存储方式
    • 2.2 🌈存储位置计算
      • 2.2.1 基本计算公式
      • 2.2.1 step代码说明
      • 2.2.3 内存地址计算代码说明
  • 3 创建数据
    • 3.0 Mat的构成
      • 3.0.1 3.0版本之后的Mat
      • 3.0.2 cvMat
    • 3.1 构造函数
    • 3.2 🌈构造函数总结
  • 4 Mat访问(at<>, 迭代器和ptr)
    • 4.0 🌈数据类型(CV_16F)等
    • 4.1 🌈模板函数at<>()访问
      • 4.1.1 基本使用示例
      • 4.1.2 构造函数
    • 4.2 🌈数组迭代器访问
      • 4.2.1 示例(对比ptr效果,ptr一个小trick)
      • 4.2.2 构造函数MatConstIterator_和MatIterator_
      • 4.2.3 NAryMatIterator迭代器构造函数
    • 4.3 🌈ptr/指针访问(内存地址)
      • 4.3.1 示例
      • 4.3.2 构造函数
    • 4.4 三种访问方式速度比较
      • 4.4.1 基本说明
      • 4.4.2 代码

OpenCV库中的大部分函数,要么是cv::Mat类的成员,要么是使用cv::Mat类作为参数,要么就是把cv::Mat作为返回值,很少有函数和这三种都没有关系。

OpenCV中的cv::Mat就相当于Numpy中的array类型,是整个库最核心的概念,其它内容都是围绕这个概念建立起来的。

cv::Mat类表示N维稠密数组,cv::SparsesMat表示N维稀疏数组

1. cv::Mat类的成员变量

OpenCV2.x版本中的CvMat结构,与现在OpenCV3.x之后的还是有很大不同的。

现在的cv::Mat类的成员变量:

  • int flags,包括下面四种标志,
    • the magic signature,魔法标识
    • continuity flag,连续性标志
    • depth,深度
    • number of channels,通道数
  • int dims,表示矩阵的维度,>=2
  • int rows和int cols表示矩阵的高/行和宽/列,当维度>2时,这两个值无效,返回(-1,-1)
  • uchar * data,一个数据指针,指向数据真正存储的地方
  • MatStep step,定义矩阵的数据布局
  • MatSize size: Size(cols, rows) ,这是因为在Size的构造器里,rows和columns的参数顺序是相反的,如下:
    typedef Size2i cv::Size
    typedef Size_<int> cv::Size2i
    Size_ (_Tp _width, _Tp _height) size指定的先是宽cols,再是高rows
    

1.1 flags

以下回答来自chatGPT:

在 OpenCV 中,cv::Mat 类有一个特殊的成员变量 flags,它是一个整数,表示 cv::Mat 对象的属性和标志。

flags 的值是通过对不同的标志位进行按位或操作得到的,不同的标志位表示不同的属性和行为。以下是一些常用的 flags 标志和它们的作用:

  • cv::Mat::CONTINUOUS_FLAG:表示矩阵是连续的,即数据在内存中是按行存储的,没有间隔。
  • cv::Mat::DEPTH_MASK:表示矩阵的深度(数据类型),可以通过与 cv::Mat::DEPTH_MASK 进行按位与操作来提取深度值。
  • cv::Mat::CHANNELS_MASK:表示矩阵的通道数,可以通过与 cv::Mat::CHANNELS_MASK 进行按位与操作来提取通道数值。
  • cv::Mat::MAGIC_MASK:用于检测错误或非法的 cv::Mat 对象。
  • cv::Mat::TYPE_MASK:用于提取矩阵的类型信息,flags 中除去上述标志位以外的部分。

此外,还有一些特定的标志位,如 cv::Mat::CONTINUOUScv::Mat::CV_32S 等,用于表示特定的属性。

你可以使用 cv::Mat::flags 成员变量来获取 cv::Mat 对象的标志位,也可以使用 cv::Mat::type() 函数来获取矩阵的类型。例如:

cv::Mat image = cv::imread("image.jpg");
int flags = image.flags;
int type = image.type();

注意,通过 flags 获取的是一个整数,你可以通过按位与与按位右移等操作来提取具体的属性值。而通过 type() 函数获取的是一个表示类型的整数,通过与 CV_ 系列常量进行比较,可以获知矩阵的具体类型。

参考:

  • OpenCV学习之路(二)——Mat对象
  • 【OpenCV4】cv::Mat.isContinuous() 函数判断内存是否连续(c++
  • OpenCV】从Mat的flags中可以读到的信息,以及相关宏定义

1.2 cv::Mat::step

详见OpenCV:Mat中的step、elemSize和任意内存访问

在这里插入图片描述

2 存储方式,存储位置计算

2.1 存储方式

cv::Mat可以用来表示任意维度的数组,数组中数据的存储和n维光栅扫描顺序的类似。
如果是一维数组,其存储就是连续的;
如果是二维数组,数据被组织成行,然后按照行排列(以前数据结构里,数组排列的行优先)
如果是三维数组(plane),那就是每个plane先被逐行填满,然后plane再一个接一个。

例如:

有一维数组: [1,3,5,2,7]
其存储:①③⑤②⑦

有二维数组(OpenCV里打印2d数组结果是这样的)[1,3,5,2,7;
1,3,5,2,7;
1,3,5,2,7]
其存储:①③⑤②⑦|①③⑤②⑦|①③⑤②⑦
一个|代表一行

三维数组。。。无法直接使用std::cout打印,可以理解为
其存储:
①③⑤②⑦|①③⑤②⑦|①③⑤②⑦||①③⑤②⑦|①③⑤②⑦|①③⑤②⑦||①③⑤②⑦|①③⑤②⑦|①③⑤②⑦
一个|代表一行,一个||表示一个plane

2.2 🌈存储位置计算

2.2.1 基本计算公式

1.1 成员变量中可以知道,对于一个矩阵 M M M,其布局是由数组M.step[]所定义的,因此索引为 [ i 0 , i 1 . . . , i M . d i m s − 1 ] [i_0,i_1...,i_{M.dims-1}] [i0,i1...,iM.dims1]的元素(其中 0 ≤ i k ≤ M . s i z e [ k ] 0\leq i_k \leq M.size[k] 0ikM.size[k])的地址可以通过下式计算:
a d d r ( M i 0 , i 1 . . . , i M . d i m s − 1 ) = M . d a t a + M . s t e p [ 0 ] ∗ i 0 + M . s t e p [ 1 ] ∗ i 1 + . . . . + M . s t e p [ M . d i m s − 1 ] ∗ i M . d i m s − 1 addr(M_{i_0,i_1...,i_{M.dims-1}})=M.data+M.step[0]*i_0+M.step[1]*i_1+....+M.step[M.dims-1]*i_{M.dims-1} addr(

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1285469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat的启动关闭及日志说明

目录 1 启动Tomcat 1.1 启动 1.2 检查Tomcat启动是否正常 1.3 浏览器访问 2 关闭Tomcat 3 Tomcat日志说明 3.1 catalina.out 3.2 localhost.[日期].log 3.3 host-manager.[日期].log 3.4 manager.[日期].log 3.5 localhost_access_log.[日期].txt 1 启动Tomcat 1.1 启动 在…

Centos7.4安装nginx1.24.0_安装详细步骤---Linux工作笔记066

以前安装的太模糊了,干脆重新写一个: 1.首先下载对应的nginx-1.24.0.tar.gz安装文件 2.然后: 去执行命令 安装依赖 yum install -y gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel 3.然后:去解压 tar -zxvf ngi…

自动采集发布,轻松博客运营——Zblog插件指南

我们是否常常为找不到合适的文章而烦恼&#xff1f;是不是每次写作都要花费大量时间在查找资料上&#xff1f;对于将内容创作作为长期工作来说&#xff0c;保持话题新颖&#xff0c;素材内容充实是很有必要的&#xff0c;ZBlog采集插件可以将这些问题都将化繁为简。 ZBlog是什么…

前端项目中CDN的一些问题【性能优化篇】

1. CDN的概念 CDN&#xff08;Content Delivery NetWork&#xff0c;内容分发网络&#xff09;&#xff0c;是指利用最靠近每位用户的服务区&#xff0c;更快的将资源发送给用户。 提高用户的访问速度减轻服务器压力提高网站的稳定性和安全性 2. CDN的作用 CDN一般用来托管…

GaussDB数据库SQL系列-序列的使用

目录 一、前言 二、GaussDB数据库中的序列 1、语法(CREATE SEQUENCE) 2、注意事项 三、GaussDB数据库中的示例 1、示例一&#xff1a;创建普通序列 2、示例二&#xff1a;创建与表关联的序列 四、小结 一、前言 在数据库管理中&#xff0c;序列&#xff08;SEQUENCE&a…

前端开发者眼中的Node.js未来发展趋势

前言 随着互联网的高速发展&#xff0c;前端开发领域的技术也在不断演进&#xff0c;各种各样的前端技术日新月异&#xff0c;前端框架也是层出不穷。在这个变化的过程中&#xff0c;Node.js作为一种强大的服务器端运行环境&#xff0c;已经成为前端开发者的重要技术之一&#…

netty源码:(4)ServerBootstrap

ServerBootstrap的group方法用来给成员变量赋值&#xff0c;如下图 AbstractBootstrap为ServerBootstrap的父类。 ServerBootstrap的channel方法用来设置channelFactory成员变量(在父类AbstractBootstrap里&#xff09; ServerBootstrap的childHandler方法用来给本类的成员…

MySQL笔记-第05章_排序与分页

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第05章_排序与分页1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 第05章_排序与分页 讲师&#…

HNU-电路与电子学-2021期末A卷(不含解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 本份卷子的参考性很高&#xff0c;这是2020级的期末考卷。题目都是很典型的&#xff0c;每一道题都值得仔细研究透。 特别注意&#xff1a;看得懂答案跟写得…

【C++】map和set的使用及注意事项

map和set的使用及注意事项 1.关联式容器2. 键值对3.set3.1接口介绍3.1.1构造3.1.2迭代器3.1.3容量3.1.4修改 3.2set使用及注意事项 4.multiset5.map6.multimap349. 两个数组的交集 1.关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xf…

【EI会议征稿中】2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024)

2024年第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 4th International Conference on Digital Signal and Computer Communications 第四届数字信号与计算机通信国际会议(DSCC 2024)将于2024年4月12日至14日在中国-香港举行。DSCC 2024旨…

什么是Amazon Lambda(无服务器计算服务)

Lambda 在高可用性计算基础设施上运行代码&#xff0c;用于执行计算资源的所有管理工作。这包括服务器和操作系统维护、容量调配和弹性伸缩、代码和安全补丁部署以及代码监控和日志记录。您只需要提供代码。 最近亚马逊云服务提供了超多免费的云服务&#xff0c;快来领取免费套…

Shein、Temu拓荒背后,中国快递业“卷”向海外

【潮汐商业评论/原创】 在中国互联网行业&#xff0c;软银创始人孙正义有一个耳熟能详的“时光机理论”&#xff0c;意思是充分利用不同国家和行业之间发展的不平衡&#xff0c;在发达市场获取经验&#xff0c;然后利用这些经验去开发落后的市场。从发达市场到落后市场的穿越&…

人体姿态估计算法

人体姿态估计算法 1 什么是人体姿态估计2 基于经典传统和基于深度学习的方法2.1 基于经典传统的人体姿态估计算法2.2 基于深度学习的人体姿态估计算法OpenPoseAlphaPose (RMPE) 3 算法应用4 Paper 人体姿态估计在现实中的应用场景很丰富&#xff0c;如下 动作捕捉&#xff1a;三…

小程序开发

1.准备工作 1.注册公众平台账号&#xff08;免费&#xff09;2.下载小程序开发工具&#xff08;免费&#xff09; 2.开发步骤 1.第一个小程序 1.小程序的AppID相当于小程序平台的一个身份证&#xff0c;这里使用的是测试号&#xff08;注意区别于服务号或订阅号的AppID&#xf…

浪潮信息KeyarchOS——保卫数字未来的安全防御利器

浪潮信息KeyarchOS——保卫数字未来的安全防御利器 前言 众所周知&#xff0c;目前流行的操作系统有10余种&#xff0c;每一款操作系统都有自己的特点。作为使用者&#xff0c;我们该如何选择操作系统。如果你偏重操作系统的安全可信和稳定高效&#xff0c;我推荐你使用浪潮信…

服务器巡检表

《服务器巡检表》检查项&#xff1a; 1、系统资源 2、K8S集群 3、Nginx 4、JAVA应用 5、RabbitMQ 6、Redis 7、PostgreSQL 8、Elasticsearch 9、ELK日志系统 获取软件开发全套资料进主页。

连夜整理的6个开源项目,都很实用

偶然找到的这个宝藏网站&#xff0c;站内集齐了大量的开源项目。 推荐实用的项目 1、vueNextAdmin 基于 vue3.x CompositionAPI setup 语法糖 typescript vite element plus vue-router-next pinia 技术&#xff0c;适配手机、平板、pc 的后台开源免费模板&#xff0c;…

分享67个节日PPT,总有一款适合您

分享67个节日PPT&#xff0c;总有一款适合您 67个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1oU-UUCV_69e8Gp5Y6zrzVA?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

k8s部署单机模式的minio

k8s部署单机模式的minio 一、说明二、yaml内容三、步骤3.1 创建资源3.2 查看启动日志3.2 查看svc并访问控制台 一、说明 项目使用minio&#xff0c;准备在k8s环境部署一套minio试用。 1.关于minio的原理和概念参考: https://mp.weixin.qq.com/s?__bizMzI3MDM5NjgwNg&mid…