Opencv之Mat常用类成员(一篇就够了)

news2025/7/14 10:41:20

1. 重要类成员

  • data:数据存储的起始地址 (uchar*类型);
  • dims:矩阵维度。如 3 * 4 的矩阵为 2 维, 3 * 4 * 5 的为3维;
  • channels():通道数量,矩阵中表示一个元素所需要的值的个数。例:3 * 4矩阵中共有12个元素,如果每个元素需要3个值表示,那么此矩阵的通道数为3。常见的是一张彩色图片有B蓝、G绿、R红3个通道;
  • depth():深度,即表示单通道中元素值的位数(bits)。Mat.depth()返回的是一个 0~6 的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }; 可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位;
  • elemSize() : 单个元素在所有通道中大小之和,elemSize() = sizeof(数据类型) * channels()。如果Mat中的数据的数据类型是 CV_8U 那么 elemSize() = 1;CV_8UC3 那么 elemSize() = 3,CV_16UC2 那么 elemSize() = 4;
  • elemSize1() : 单个元素在1个通道中的大小。elemSize1() = sizeof(数据类型) = elemSize()  / channels()。 
  • step[]:可以看作是一个有dims个元素的动态数组,定义了矩阵的在各维度之间跳变时的最大步长(单位:字节。如2维Mat时,step[0]表示行长度,step[1]表示元素长度)。
  • step1(n):与step[n]对应范围的总通道数, step1(n) = step[n] / elemSize1();
  • type: 矩阵元素的数据类型

2. Mat.step

step的几个类别区分:

  • step:矩阵第一行元素的字节数
  • step[0]:矩阵第一行元素的字节数
  • step[1]:矩阵中一个元素的字节数
  • step1(0):矩阵中一行有几个通道数
  • step1(1):一个元素有几个通道数(channel())

3. Mat的创建

Mat::Mat(); //default  
    Mat::Mat(int rows, int cols, int type);  
    Mat::Mat(Size size, int type);  
    Mat::Mat(int rows, int cols, int type, const Scalar& s);  
    Mat::Mat(Size size, int type, const Scalar& s);  
    Mat::Mat(const Mat& m);  
    //参数说明:  
    //int rows:高  
    //int cols:宽  
    //int type:参见"Mat类型定义"  
    //Size size:矩阵尺寸,注意宽和高的顺序:Size(cols, rows)  
    //const Scalar& s:用于初始化矩阵元素的数值  
    //const Mat& m:拷贝m的矩阵头给新的Mat对象,但是不复制数据!相当于创建了m的一个引用对象  
      
    //例子1:创建100*90的矩阵,矩阵元素为3通道32位浮点型  
    cv::Mat M(100, 90, CV_32FC3);  
    //例子2:使用一维或多维数组来初始化矩阵,  
    double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};  
    cv::Mat M = cv::Mat(3, 3, CV_64F, m);  
      
    //2.使用create函数:  
    Mat a = create(10, 9, CV_16U);  //创建10*9的矩阵,矩阵元素为16位无符号整型  
    //create的一个特殊用法:如果初始化的时候没有传入size的参数,或者后面需要改变size的参数,可以使用create来调整  
    // make 7x7 complex matrix filled with 1+3j.  
    cv::Mat M(7,7,CV_32FC2,Scalar(1,3));  
    // and now turn M to 100x60 15-channel 8-bit matrix.  
    // The old content will be deallocated:隐式使用release()释放  
    M.create(100,60,CV_8UC(15));

4. Mat的访问

at

    //第一种方法
    for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			image.at<Vec3b>(h , w)[0] = 255 ;
			image.at<Vec3b>(h , w)[1] = 0 ;
			image.at<Vec3b>(h , w)[2] = 0 ;
		}
	}
	imshow("color1" , image) ;
	//方法二
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			Vec3b &bgr = image.at<Vec3b>(h , w) ;
			bgr.val[0] = 0 ;
			bgr.val[1] = 255 ;
			bgr.val[2] = 0 ;
		}
    }

ptr

    //三通道图像,at(y , x)索引是先行(y轴) , 后列(x轴)    
    //第一种方法
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			uchar *ptr = image.ptr<uchar>(h , w) ;
			ptr[0] = 255 ;
			ptr[1] = 0 ;
			ptr[2] = 0 ;
		}
	}
	imshow("color1" , image) ;
	//第二种方法
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			Vec3b *ptr = image.ptr<Vec3b>(h , w) ;
			ptr->val[0] = 0 ;
			ptr->val[1] = 255 ;
			ptr->val[2] = 0 ;
		}
    }

    //单通道图像,at(y , x)索引是先行(y轴) , 后列(x轴)
	//第一种方法
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		uchar *ptr = image.ptr(h) ;
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			ptr[w] = 128 ;
		}
	}
 
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			uchar *ptr = image.ptr<uchar>(h , w) ;
			*ptr = 255 ;
		}
    }

迭代器

    //三通道图像
	Mat_<Vec3b>::iterator it = image.begin<Vec3b>() ;
	Mat_<Vec3b>::iterator itend = image.end<Vec3b>() ;
 
	for(;it != itend ; ++ it)
	{
		(*it)[0] = 255 ;
		(*it)[1] = 0 ;
		(*it)[2] = 0 ;
	}

	//单通道图像
	image = imread("forest.jpg" , 0) ;
	Mat_<uchar>::iterator it1 = image.begin<uchar>() ;
	Mat_<uchar>::iterator itend1 = image.end<uchar>() ;
	for (;it1 != itend1 ; ++ it1)
	{
		(*it1) = 128 ;
    }

data

    data = image.data ;
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols/2 ; ++ w)
		{
			*data ++ = 128 ;
		}
    }

row, col

for(int i = 0 ; i < 100 ; ++ i)
	{
		image.row(i).setTo(Scalar(0 , 0 , 0)) ;//设定第i行数据
		image.col(i).setTo(Scalar(0 , 0 , 0)) ;//设定第i列数据
	}

综合高效

    //单通道多通道都适用
	int nRows = image.rows ;
	int nCols = image.cols * image.channels() ;
 
	if(image.isContinuous())
	{
		nCols = nRows * nCols ;
		nRows = 1 ;
	}
 
	for(int h = 0 ; h < nRows ; ++ h)
	{
		uchar *ptr = image.ptr<uchar>(h) ;
		for(int w = 0 ; w < nCols ; ++ w)
		{
			*ptr ++ = 128 ;
		}
	}

5. Mat的数据类型

当使用at以及对数据进行运算时候需要指定类型。cv::Mat 类的对象有一个成员函数type()用来返回矩阵元素的数据类型

访问:

    cv::Vec3b vec3b = img.at<cv::Vec3b>(0,0);
    uchar vec3b0 = img.at<cv::Vec3b>(0,0)[0];
    uchar vec3b1 = img.at<cv::Vec3b>(0,0)[1];
    uchar vec3b2 = img.at<cv::Vec3b>(0,0)[2];

 

定义:

typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;

typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;

typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;

typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;

typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;

typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;

 

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

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

相关文章

Docker-系统环境

Docker1.Docker与虚拟机的区别2.Docker主要解决的问题3.镜像和容器4.Docker的安装9.查找镜像10.常用命令11.安装数据库12.安装tomcat13.容器使用注意事项1.Docker与虚拟机的区别 Docker是开发运行和部署应用程序的开发管理平台&#xff0c;它类似于虚拟机&#xff0c;可以独立…

七、Feign

文章目录一、Feign实现远程调用1.替换RestTemplate发起远程调用&#xff0c;RestTemplate存在的问题&#xff1a;2.实现Feign远程调用&#xff1a;二、Feign的自定义日志1.Feign可修改的配置如下2.方式一&#xff1a;配置文件方式3.方式二&#xff1a;Java代码方式一、Feign实现…

Qt:信号与槽机制

说实话&#xff0c;Qt给我的感觉像一种魔改版c&#xff0c;不纯粹&#xff0c;看不到内部的源代码&#xff0c;也不知道一些宏是怎么实现的... 信号与槽内部机制 回归正题&#xff0c;其实学过设计模式的应该都能看出来&#xff0c;qt的这个机制是一个观察者模式&#xff1b; …

又解锁了一种OpenFeign的使用方式!

引言 Hello 大家好&#xff0c;这里是Anyin。 在关于OpenFeign那点事儿 - 使用篇 中和大家分享了关于OpenFeign在某些场景下的一些处理和使用方法&#xff0c;而今天Anyin再次解锁了OpenFeign的又一个使用场景&#xff0c;只能说真香。 在我们日常开发中&#xff0c;相信大家…

SSM框架-MyBatis基础

1. MyBatis简介 1.1 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis&#xff0c;2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c;iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBa…

Pipelines in Shell

本篇文章内容需要读者知道 shell 的一些语法和作用&#xff0c;知道 shell 的用途&#xff0c;和一些基本的用法。 这里可以查看原文&#xff1a;Pipelines in Shell 学习 shell 脚本必须要理解 pipeline 的概念&#xff0c;知道 command 的输入&#xff08;input&#xff09;和…

编译概念总结

一个很笨很笨的人的编译自救笔记。 1 程序设计语言 程序设计语言用于书写计算机程序的语言。语言的基础是一组记号和一组规则。根据规则由记号构成的记号串的总体就是语言。在程序设计语言中&#xff0c;这些记号串就是程序。 程序设计语言由三个方面的因素&#xff0c;语法…

[附源码]SSM计算机毕业设计商场日常维修管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

深度学习(19):nerf论文公式理解

注&#xff1a;有问题欢迎评论留言&#xff0c;但尽量不要喷呀。 1. nerf论文第四章翻译如下&#xff1a; 我们的5D神经辐射场将场景表示为空间任意点的体积密度和定向发射辐射&#xff08;directional emitted radiance&#xff09;。我们使用经典体积渲染&#xff08;class…

嗯哦哎辟 2022 游寄

虽然上次不是假的&#xff0c;但这次是真的寄了。 Day 0 虽然是南京本地人&#xff0c;但因疫情原因&#xff0c;晚上决定去住了酒店。 看了一眼考场&#xff0c;感觉位置小得离谱。不愧是 NOI 2022 团体总分第十的“强省”江苏。 刚开始去了 409&#xff0c;发现房间里一股…

C++ 基础入门

1、变量 作用&#xff1a;给一段指定的内存空间起名&#xff0c;方便操作这段内存。 2、常量 作用&#xff1a;用于记录程序中不可更改的数据 C中定义常量的两种方式&#xff1a; #define 宏常量&#xff1a; #define 常量名 常量值const修饰的变量&#xff1a;const数据类型 …

26k Star, 理解Git太轻松了。。。

程序员宝藏库&#xff1a;gitee.com/sharetech_lee/CS-Books-Store Git是目前使用比较广泛一款版本控制工具&#xff0c;从事开发工作&#xff0c;很难绕开Git。 因此&#xff0c;关于如何快速学习Git使用一直都是一个经久不衰的话题。 前不久我在另外一篇文章中曾提到Git对初…

【药材识别】基于色差色温特征结合SVM实现药材炮制程度判断系统附GUI界面

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

十九种卷积

参考文章:一文看尽深度学习中的20种卷积(附源码整理和论文解读) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/381839221 一、原始卷积(Vanilla Convolution) CNNs中的卷积,也称为滤波器,是由一组具有固定窗口大小且带可学习参数(learnable paramerters)的卷积核所组…

Java之IO流详解(一)——File类

一、File类创建文件 方法说明public boolean createNewFile()当具有该名称的文件不存在时&#xff0c;创建一个由该抽象路径命名的新空文件public boolean mkdir()创建由此抽象路径命名的目录public boolean mkdirs()创建由此抽象路径命名的目录&#xff0c;包括任何必须但不存…

Go常见错误第15篇:interface使用的常见错误和最佳实践

前言 这是Go常见错误系列的第15篇&#xff1a;interface使用的常见错误和最佳实践。 素材来源于Go布道者&#xff0c;现Docker公司资深工程师Teiva Harsanyi。 本文涉及的源代码全部开源在&#xff1a;Go常见错误源代码&#xff0c;欢迎大家关注公众号&#xff0c;及时获取本…

加载配置文件内容利用反射动态创建对象和调用方法(开闭原则的体现)

反射的应用&#xff1a;根据配置文件来创建对象和调用方法 需求&#xff1a;1&#xff0c;根据配置文件re.properties 指定的信息&#xff0c;创建对象并调用方法 classfullpathsrc.com.liu.Cat methodhi 即通过外部文件配置&#xff0c;在不修改源码的情况下&#xff0c;来控…

GAN详解

前言 GAN是当今作为火热的生成式算法&#xff0c;由Ian Goodfellow&#xff0c;Yoshua Bengio等人在2014年提出的&#xff0c;Yan LeCun表示道GAN是“adversarial training is the coolest thing since sliced bread”。它使用两个神经网络&#xff0c;将一个神经网络与另一个…

ArcGIS中ArcMap栅格图层0值设置为NoData值的简便方法

本文介绍在ArcMap软件中&#xff0c;将栅格图层中的0值或其他指定数值作为NoData值的方法。 在处理栅格图像时&#xff0c;有时会发现如下图所示的情况——我们对某一个区域的栅格数据进行分类着色后&#xff0c;其周边区域&#xff08;即下图中浅蓝色的区域&#xff09;原本应…

C语言学习记录(十五)C预处理器和C库

文章目录一、C预处理器1.1 翻译程序1.2 明示常量&#xff1a;#define1.3 在#define中使用参数1.4 文件包含&#xff1a;#include1.5 其他指令1.5.1 #undef指令1.5.2 从C预处理角度看已定义1.5.3 条件编译1.5.3.1 #ifdef、#else和#endif指令1.5.3.2 #ifndef1.5.3.3 #if和elif指令…