cv::Mat是OpenCV定义的用于表示任意维度的稠密数组,OpenCV使用它来存储和传递图像,理解它对我们操作图像是有帮助的,本文将介绍cv::Mat的初始化方式、内置方法等。

元素类型定义

由于cv::Mat要用于存储图像,它里面的元素可以是“像素”,对于像素,OpenCV定义了专门的数据格式来描述它们。

“像素”的数据格式----命名规则:
基本数据类型 + 通道数
CV_{8U, 16S, 16U, 32S, 32F, 64F}C{1, 2, 3}
例如:CV_8UC3: 三通道、每个通道是unsigned char类型的数据

{8U, 16S, 16U, 32S, 32F, 64F}:
8U:unsigned char ; 16S: short int ; 16U: unsigned short int ; 32F: float ; 64F: double

{1,2,3}代表通道数,彩色图像每个像素需要存储B、G、R(蓝、绿、红)3个信息,需要3个位置, 每一个称为一个“颜色通道”
灰度图像无颜色,只有一个通道,故常为CV_8UC1

cv::Mat类

//使用示例://默认构造函数与值构造函数
cv::Mat img; //默认构造函数//值构造函数1
cv::Mat img1(480, 640, CV_8UC3); //图像高(行)480-row,宽(列)640-col, 数据类型:CV_8UC3//值构造函数2
//cv::Scalar(B, G, R)可以表示三通道颜色,这里所示为纯蓝色
cv::Mat img2(480, 640, CV_8UC3, cv::Scalar(255, 0, 0));//值构造函数3
//效果与上面一样
cv::Size sz3(480, 640);
cv::Mat img3(sz3, CV_8UC3, cv::Scalar(255, 0, 0));//拷贝构造函数1---都是以静态引用传递参数(const &)
cv::Mat img4(img3);//拷贝构造函数2---只拷贝感兴趣的区域----由Rect对象定义
//rect左上角(100,100),宽高均为200,(x,y,width,height)
cv::Rect rect(100, 100, 200, 200);
cv::Mat img5(img3, rect);//拷贝构造函数3--从指定行列构造
//从img3中拷贝0-239行以及0-319行到img6
cv::Range rows(0, 240);
cv::Range cols(0, 320);
cv::Mat img6(img3, rows, cols);//静态构造函数
cv::Mat img7 = cv::Mat::zeros(480, 640, CV_8UC3); //480行640列,值全为零的数组。
cv::Mat img8 = cv::Mat::ones(480, 640, CV_64FC1); //全1矩阵
cv::Mat img9 = cv::Mat::eye(480, 640, CV_16SC2); //单位矩阵

访问元素(访问像素)

固定向量类,形如Vec3b,参考我的博客,OpenCV基础类型3:
详解Vec固定向量

//使用示例//直接访问---模板函数at<>()
//单通道, 尖括号里面的类型照着文章开头介绍的类型对应关系输入
cv::Mat img = cv::Mat::ones(240, 320, CV_32FC1);
float elem = img.at<float>(10, 10);//多通道---Vec3b代表固定向量类
//利用固定向量类访问:https://blog.csdn.net/czsnooker/article/details/118314514?spm=1001.2014.3001.5501
//注意类型之间的对应,固定向量与Mat的代表字母有一点差异
//UC3 -> 3b
cv::Mat img1(480, 640, CV_8UC3, cv::Scalar(255,255,0));
cv::Vec3b elem = img1.at<cv::Vec3b>(10, 10);
elem_B = elem[0]; //蓝色通道数值---255
elem_G = elem[1]; //绿色通道数值---255
elem_R = elem[2]; //红色通道---0//暂不介绍指针访问

区域访问

//使用示例
//320×320, 3通道白色图像
cv::Mat img(320, 320, CV_8UC3, cv::Scalar(255,255,255));//访问第1行元素
cv::Mat img_r_0 = img.row(0);//访问第2列元素
cv::Mat img_c_2 = img.col(1);//0-160行元素组成的数组
cv::Mat img_r_range = img.rowRange(0, 160);//0-160列元素组成的数组
cv::Mat img_c_range = img.colRange(0, 160);//注意:上述操作没有复制行和列,其实相当于只是引用了指定的行和列,我们可以对其进行读写。返回值仍然可以当作图像对待,它是原图像的一部分。

一些内置方法

//使用示例://克隆矩阵
cv::Mat img(480, 640, CV_64FC3);
cv::Mat img1 = img.clone();//设置元素值
img1.setTo(cv::Scalar(1.0, 2.0, 3.0));//返回通道数目
size_t num_c = img1.channels();//返回数组大小
cv::Size sz = img1.size();//检验数组是否为空,为空返回true
bool e = img1.empty();

更多的内容请参见:
https://docs.opencv.org/4.5.2/d3/d63/classcv_1_1Mat.html#af2d2652e552d7de635988f18a84b53e5

有时候cv::Mat会被用作像3×3或4×4这样的小型矩阵,它可以像固定矩阵一样做矩阵的代数运算,有时候它也用作3×1的向量,这时候它可以有固定向量的功能。关于这一部分,可以参考我的博客----固定矩阵与固定向量类,那些操作基本上完全适配cv::Mat,因此不在此赘述。
固定向量类
固定矩阵类

在Python中,对于OpenCV而言,使用了Numpy来代替cv::Mat存储图像,相应的,对图像的操作转变为对Numpy数组的操作。

OpenCV基础类型4--cv::Mat详解相关推荐

  1. [转] OpenCV 文字绘制cv::putText详解

    ref:[OpenCV3]文字绘制--cv::putText详解_cv.puttext_PHILOS_THU的博客-CSDN博客 opencv学习(十三)之文本文字插入_opencv视频添加文本并保存 ...

  2. OpenCV基础类型3(固定向量类cv::Vec<>、Vec2i、Vec3i、Vec3f、Vec2f)

    简介 OpenCV中固定向量模板类cv::Vec<>派生自固定矩阵类cv::Matx<>,固定矩阵类解释参照我的博文OpenCV基础类型2,即使不知道固定矩阵类也不影响我们使用 ...

  3. 【OpenCV3】棋盘格角点检测与绘制——cv::findChessboardCorners()与cv::drawChessboardCorners()详解

    棋盘格法是摄像机标定中常用的一种方法,在使用该方法时需要对棋盘格的角点进行检测.opencv中封装了一个专门用于棋盘格角点检测的函数即cv::findChessboardCorners(),同时,也提 ...

  4. 干货 | OpenCV中KLT光流跟踪原理详解与代码演示

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 稀疏光流跟踪(KLT)详解 在视频移动 ...

  5. 【OpenCV3】角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解

    一提到角点检测,最常用的方法莫过于Harris角点检测,opencv中也提供了Harris角点检测的接口,即cv::cornerHarris(),但是Harris角点检测存在很多缺陷(如角点是像素级别 ...

  6. [Python从零到壹] 八.数据库之MySQL和Sqlite基础知识及操作万字详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. 前端基础-HTML的的标签详解

    阅读目录 一.head内常用标签 二. HTML语义化 三. 字符实体 四. h系列标签 五. p标签 六. img标签 七. a标签 八. 列表标签 九. table标签 十. form标签 一. ...

  8. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  9. Python基础学习之 os 模块详解

    Python基础学习之 os 模块详解 文章目录 Python基础学习之 os 模块详解 1. 路径操作 1.1 os.chdir(),切换当前工作目录: 1.2 os.getcwd(),返回工作目录 ...

最新文章

  1. mysql自定义序号_MySQL数据库之在mysql中给查询的结果添加序号列
  2. STL之优先级队列priority_queue
  3. .Net Core 图片文件上传下载
  4. leetcode 376. 摆动序列(dp)
  5. Shell编程(逻辑判断、文件目录属性判断、if特殊用法、case判断)
  6. jvm性能调优工具之 jmap使用详解
  7. 深度学习与 Spark 和 TensorFlow
  8. [ CSOL ] - zihao + 自适应 + 文字滚动 + 媒体查询 + fullpage + 手风琴 + 延时动画
  9. tomcat设置为开机自启动
  10. #35 insert
  11. Python中tkinter模块的学习记录(一)
  12. 计算机教师课改先进个人,基础教育课程改革工作先进个人事迹
  13. linux 磁盘碎片整理,Linux上没有磁盘碎片清理功能如何整理磁盘碎片
  14. 苹果Mac系统彻底关闭开机声音duang~
  15. 男人30岁之前必须要明白的16条
  16. maven-default-http-blocker
  17. 信息安全--身份认证
  18. 苹果手机计算机报不了名,iPhone8无法连接电脑并且不弹出信任对话框怎么办?...
  19. C语言求ex的近似值
  20. 决策树(信息熵、信息增溢、GINI)的计算

热门文章

  1. 招银网络科技--电话面试面经
  2. 神化输入系统 - 世界首个盲打拼音输入法问世了
  3. Windows 取证之注册表
  4. 根据IP查询所在城市接口(查询用户所在城市)
  5. HTML实现点击阅读导航,跳转到页面这个内容的开始部分。
  6. 3D游戏编程 作业二 奢华井字棋
  7. Android 安卓动画 补间动画 - 组合(四个动画) 动画
  8. 关于前后端雪花算法Long转String丢失精度问题
  9. 软件PWM控制led
  10. Neutron运营商网络和租户网络详解