openCV学习笔记(6):Mat类/数据结构详解(1)

Mat类不仅可以用于图像存储,同时也是一个通用的矩阵类,可以用来创建和操作多维矩阵,以后将会更新将Mat作为矩阵类的学习笔记。本文重点在于重新学习Mat类的结构,主要是重要成员变量和构造函数。

一、Mat类

Mat类中关键属性如下所示:

//Mat类
class CV_EXPORTS Mat
{
	public:

		//一系列函数

		/*	包括几位字段:
			-Mat的标识
			-连续性标志
			-深度(位深)
			-通道数
		*/
		int flags;
		//矩阵的维数,取值> = 2
		int dims ;
		//矩阵的行数和列数,如果矩阵超过2维,变量值rows = -1,cols = -1
		int rows,cols;
		//指向数据的指针
		uchar *data ;

		//指针的引用计数器;
		//阵列指向用户分配的数据时,当指针为 NULL
		int * refcount ;

		//其他成员

};

二、创建Mat对象

有多种方法创建一个Mat对象。

2.1常用构造函数

//无参数构造函数
Mat::Mat();

//创建行数为rows,列数为cols,类型为type的图像
//type 可以是CV_8UC1,CV_16SC1,…, CV_64FC4 等。里面的8U 表示8 位无符号整数,16S 表示16 位有符号整数,64F表示64 位浮点数(即double 类型)
//C 后面的数表示通道数,例如C1表示一个通道的图像,C4 表示4 个通道的图像,以此类推。如果你需要更多的通道数,需要用宏C//V_8UC(n),例如:
// Mat M(3,2, CV_8UC(5));//创建行数为3,列数为2,通道数为5 的图像
Mat::Mat(int rows,int cols,int type);

//创建大小为size,类型为type的图像
Mat::Mat(Size size, int type);

//创建行数为rows,列数为cols,类型为type的图像,并将所有元素初始化为s
Mat::Mat(int rows, int cols, int type,const Scalar& s);

//创建大小为size,类型为type的图像,并将所有元素初始化为s
 Mat::Mat(Size size, int type, constScalar& s);

//将m赋值给新创建的对象,此处不会对图像数据进行复制,m和新对象共用图像数据
Mat::Mat(const Mat& m);

//创建行数为rows,列数为col,类型为type  的图像,此构造函数不创建图像数据所需内存,而是直接使用data 所指内存,图像的行步长由step指定。
 Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);  

//创建大小为size,类型为type  的图像,此构造函数不创建图像数据所需内存,而是直接使用data 所指内存,图像的行步长由step 指定。
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP);

//创建的新图像为 m  的一部分,具体的范围由 rowRange  和 colRange指 定,此构造函数也不进行图像数据的复制操作,新图像与m 共用图像数据;
 Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange);

//创建的新图像为m 的一部分,具体的范围roi 指定,此构造函数也不进行图像数据的复制操作,新图像与m 共用图像数据。
Mat::Mat(const Mat& m, const Rect& roi);

2.2 create方法

如果 create()函数指定的参数与图像之前的参数相同,则不进行实质的内存申请操作;如果参数不同,则减少原始数据内存的索引,并重新申请内存。使用方法如下面例程所示:

    Mat M(2,2, CV_8UC3);//构造函数创建图像
    M.create(3,2, CV_8UC2);//释放内存重新创建图像  

需要注意的时,使用create()函数无法设置图像像素的初始值。

时间: 2024-12-28 05:49:17

openCV学习笔记(6):Mat类/数据结构详解(1)的相关文章

OpenCV学习C++接口 Mat像素遍历详解

OpenCV学习C++接口 Mat像素遍历详解 原文地址:https://www.cnblogs.com/zhehan54/p/8460602.html

Linux学习笔记--Linux文件管理类名利详解

Linux文件管理类命令详解 目录管理: ls.cd.pwd.mkdir.rmdir.tree 文件管理: touch.stat.file.rm.cp.mv.nano 日期管理: touch.clock.hwclock.cal 查看文本: cat.tac.more.less.head.tail cat:连接并显示 -n:在显示时显示每一行的行号 -E:在每行结束处显示 $ Ctrl+C:结束命令 分屏显示: more.less more:向后翻 less: q退出命令 head:查看前n行 ta

学习笔记——Maven pom.xml配置详解

POM的全称是“ProjectObjectModel(项目对象模型)”. pom.xml详解 声明规范 <projectxmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apach

学习笔记——Maven settings.xml 配置详解

文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${user.home} 和和所有其他系统属性只能在3.0+版本上使用.请注意windows和Linux使用变量的区别. settings.xml详解 声明规范 <?xml version="1.0" encoding="UTF-8"?> <settings x

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解

1--我们知道Mat是一个图像容器类,这个数据结构由两部分组成: 1--矩阵头--即class Mat类所实例化的类对象所开辟的空间里面存储的数据---就是这个矩阵的信息,当我们以 Mat object;这样声明类对象的时候,也仅仅是创建了一个Mat的信息头,并没有创建矩阵体,也就是说,我们并 没有给将要存储的图像开辟相应的空间 2--矩阵头--包含: 1--矩阵的尺寸----比如---class Mat这个类中的----数据成员rows,cols---就可以指定图像的尺寸 2--存储方法---

[读书笔记]C#学习笔记八:StringBuilder与String详解及参数传递问题剖析

前言 上次在公司开会时有同事分享windebug的知识, 拿的是string字符串Concat拼接 然后用while(true){}死循环的Demo来讲解.其中有提及string操作大量字符串效率低下的问题, 刚好自己之前也看过类似的问题, 于是便拿出来记录一下.本文内容: 参数传递问题剖析, string与stringbuilder详解 1,参数传递问题剖析 对于C#中的参数传递,根据参数的类型可以分为四类: 值类型参数的按值传递 引用类型参数的按值传递 值类型参数的按引用传递 引用类型参数的

IOS学习笔记37——ViewController生命周期详解

在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewController是IOS开发中MVC模式中的C,ViewController是view的controller,ViewController的职责主要包括管理内部各个view的加载显示和卸载,同时负责与其他ViewController的通信和协调.在IOS中,有两类ViewController,一类是显示内容

Vue.js学习笔记(7)组件详解

在这篇文章之前小颖分享过小颖自己写的组件:Vue.js学习笔记(5)tabs组件和Tree升级版(实现省市多级联动) 先给大家看下小颖写了一个简单的组件示例: 组件: <template> <div class='content' v-if='showFlag'> <input type="text" v-bind:style='{ width:compwidth+"px"}' v-model='compvalue' @keyup='m

DNS与BIND学习笔记-基础知识及配置详解

转自 http://blog.chinaunix.net/uid-14825809-id-333591.html 标签:DNS 多线 智能 服务器 bind 一直想系统的学习和了解DNS的原理,包括看相关的rfc文件,一看和dns相关的rfc文件,妈呀,居然有86个之多.能看多少是多少吧.先把DNS的原理研究透彻了.在看rfc文件我想会事半功倍的:) 1. ICANN是干什么的?和他的一些相关资讯? ICANN全称是叫:Internet Corporation for Assigned Name