当前位置:   article > 正文

Opencv系列(二):Mat类的定义及输出_c#mat类型的数据怎么输出

c#mat类型的数据怎么输出

Opencv系列(二):Mat类的定义及输出

一、数字图像

什么是数字图像?
数字图像是物理图像(客观世界中,以自然形式呈现出的图像,也叫做连续图像)的连续信号值被离散化后,以像素为单元组成的二维矩阵,每个像素通过离散的数值进行表征 (如图)。
在这里插入图片描述
数字图像三要素:
(1)图像大小:图像的长(length)和宽(width),即图像在长度和宽度方向上的像素个数;
(2)图像通道数:可以理解位表征一个像素单元需要的数值个数;比如灰度图只有明暗变化,因此只需要一个数值表征,通道数为1;彩图通常需要三个通道(数值)R、G、B来表征,通过R、G、B不同的比例合成需要的颜色,因此通道数为3;
(3)图像的深度:用来存储表征通道数值所占内存的BIT位数,例如用0~255的整数来表述灰度图每个像素的值,255=28,则8即为图像深度;而由于位数相同,数据类型不同,数值的范围也会不同,因此定义图像矩阵时必须明确数值是有符号(S)型还是无符号型(U),是否为浮点型(F)。
*关于数值类型的详细介绍请参考官网:数值类型

在Opencv中,Mat类表示一个N维单通道或多通道数值矩阵,可以用它来存储由实数或复数构成的向量、矩阵、灰度或彩色图像、体素、向量场、点云、张量和直方图(高维的直方图最好存储在SparseMat中),下面就来介绍Mat类的创建和操作。

二、Mat对象的创建

图像矩阵在Mat对象中的存储:
Mat类由两部分组成:矩阵头(包含矩阵大小、存储方法、存储地址等信息)和一个指向所有像素值的指针。矩阵头的尺寸是常数值,但是矩阵本身的大小可能因图像的不同而不同,并且通常比矩阵头要大几个数量级。
下图是一张3通道彩图在内存中存储的方式,用取色器取色并和内存中数据存储顺序对比,可以看到3原色存储的顺序是B(蓝色)、G(绿色)、R(红色),同一行像素存储在矩阵的同一行,因此当图像大小是mxn时,通道数位c时,矩阵的大小为mxcn。
在这里插入图片描述
Mat对象的创建

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
   
   //---------【Mat对象的使用】-----------
   Mat A = imread("C:\\Users\\ZH\\Desktop\\2_20191012\\1.png", 1);
   //复制和赋值,只创建Mat对象信息头,公用一个矩阵
   Mat B(A);  //复制
   Mat C = A;  //赋值
   
   //创建只引用部分矩阵数据的信息头
   Mat D(A, Rect(1, 400, 100, 500));  //使用Rect()函数
   Mat E = A(Range::all(), Range(1,50));  //使用Range()函数
   
   //clone()函数和copyTo()函数创建信息头并将矩阵复制(会降低运算速度)
   Mat F = A.clone
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/886771
推荐阅读
相关标签
  

闽ICP备14008679号