【opencv】cv::Mat 公有成员函数 (Public Member Func)

Public Member Func

channels()

Mat矩阵元素拥有的通道数。

depth()

用来度量每一个像素中每一个通道的精度,但它本身与图像的通道数无关。
depth数值越大,精度越高。
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}

其中U是unsigned的意思,S表示signed,也就是有符号和无符号数。

elemSize()

elem是element(元素)的缩写,表示矩阵中每一个元素的数据大小,如果Mat中的数据类型是CV_8UC1,那么elemSize=1;如果是CV_8UC3或CV_8SC3,那么elemSize=3;如果是CV_16UC3或者CV_16SC3,那么elemSize=6;即elemSize是以8位(一个字节)为一个单位,乘以通道数和8位的整数倍;

elemSize1()

elemSize加上一个“1”构成了elemSize1这个属性,1可以认为是元素内1个通道的意思,这样从命名上拆分后就很容易解释这个属性了:表示Mat矩阵中每一个元素单个通道的数据大小,以字节为一个单位,所以有:

eleSize1==elemSize/channels;

rowRange()

为指定的行span创建一个新的矩阵头,可取指定行区间元素。

colRange()

为指定的列span创建一个新的矩阵头,可取指定列区间元素。

zeros()

ones()

empty()

at()

isContinuous()

判断图像存储是否连续。

clone()

m1 = m0.clone(); //将m0完全拷贝到m1中,同时拷贝m0中的所有数据,且拷贝的矩阵是连续的。

copyTo()

m0.copyTo(m1); // 将m0中的内容拷贝到m1中,如果有必要重新分配m1(等价于m1 = m0.clone())。
m0.copyTo(m1, mask); //将m0中,mask所指示的的数据拷贝到m1中。

convertTo()

m0.convertTo(m1, type, scale, offset); //将m0中的元素转换成type类(CV_32F等),作scale尺度的缩放,offset偏移,写入m1中。

setTo()

m0.setTo(s,mask); //将m0中所有的元素的值设为s;如果使用mask,则只设定mask中的非零元素。

reshape()

m0.reshape(chan, rows); //改变二维矩阵的的实际形状,不进行数据拷贝;若chan或rows为0,则表示不作改变。

push_back()

m0.push_back(s); //对mx1矩阵进行扩展,并在末尾插入单一值s。
m0.push_back(m1); //对mxn矩阵作k行扩展,并将m1拷贝到这些行中;m1的大小为kxn。

pop_back()

m0.pop_back(n); //从m0尾部移除n行,默认情况下n为1。

locateROI()

m0.locateROI(size, offset); //将m0的大小重写为size,如果m0重写后变成更大的矩阵,则起始点为cv::Pointoffset点。

adjustROI()

m0.adjustROI(t, b, l, r); //在m0的上下左右分别添加t、b、l、r个像素。

total()

m0.total(); //计算所有数组元素的个数,不考虑通道。

isContinuous()

m0.isContinuous(); //如果m0所有的行在内存空间中打包时都没有间隙,则返回true。

elementSize()

m0.elementSize(); //返回矩阵m0中每个元素的字节大小(如3通道float型的矩阵则返回12)。

elementSize1()

m0.elementSize1(); //返回矩阵m0中每个次元素的字节大小(如3通道float型的矩阵则返回4)。

type()

Mat矩阵的类型,包含有矩阵中元素的类型以及通道数信息,type的命名格式为CV_(位数)+(数据类型)+(通道数)。
m0.type(); //返回m0中元素的有效类型标识符(如CV_32FC3)。

depth()

m0.depth(); //返回m0中单个通道中元素的有效类型标识符(如CV_32F)。

channels()

m0.channels(); //返回m0中元素的通道数目。

size()

m0.size(); //以cv::Size对象的形式返回m0的大小。

empty()

m0.empty(); //如果数组中没有元素(如m0.total = 0或m0.data = NULL)则返回true。


参考文献

[1] cv::Mat Class Reference
[2] OpenCV3 cv::Mat类成员函数详解
[3] OpenCV2:总结篇 cv::Mat 类
[4] OpenCV—矩阵数据类型转换cv::convertTo
[5] Opencv Mat矩阵中data、size、depth、elemSize、step等属性的理解

<think>嗯,用户想了解OpenCVcv::Mat::zeros的用法。首先,我得回忆一下这个函数的作用。它是用来创建一个全零矩阵的静态成员函数,对吧?那应该包括参数、返回类型以及使用场景。 用户可能刚接触OpenCV,需要详细的步骤解释。应该先说明函数的基本功能,然后参数的含义,比如rows和cols,还有数据类型type。要注意解释type的组成,比如CV_8UC3这样的格式,可能用户不太清楚通道数的意义,需要举例说明。 然后,创建示例代码的时候,要确保语法正确,并且用中文注释。可能需要提到不同的数据类型应用场景,比如灰度图和彩色图。还要指出rows和cols为0时的特殊情况,虽然这种情况可能不常见,但需要说明。 另外,用户可能想知道为什么用zeros而不是直接赋值0,这时候要解释效率和便利性。可能还要对比其他创建矩阵的方法,比如Mat::ones或者直接构造函数,但这里重点在zeros。 有没有可能用户会遇到初始化矩阵的问题,比如类型不匹配或者尺寸错误?这时候需要提醒正确选择参数。另外,应用场景部分可以举图像处理中的例子,比如滤波前的初始化或者掩膜创建。 要确保结构清晰,分步骤讲解,可能用列表或者分段。同时检查是否有LaTeX格式的问题,行内公式用$...$,独立公式用$$...$$。不过问题中可能涉及代码示例,所以这部分可能需要用代码块,但用户没有提到代码格式,所以按常规方式处理。 最后,总结一下注意事项,帮助用户避免常见错误。比如数据类型和通道数的重要性,以及正确使用rows和cols。可能还需要提到OpenCV的文档链接,但用户没有要求,所以可能不需要。</think>以下是关于OpenCV中 `cv::Mat::zeros` 的详细分步解析: --- ### 一、`cv::Mat::zeros` 的功能 `cv::Mat::zeros` 是OpenCV中用于**创建全零矩阵**的静态成员函数。它的核心用途是快速初始化一个指定尺寸和数据类型的矩阵,所有元素初始值为0。 --- ### 二、函数原型 ```cpp static Mat Mat::zeros(int rows, int cols, int type); ``` - **参数说明**: - `rows`:矩阵的行数(高度) - `cols`:矩阵的列数(宽度) - `type`:矩阵的数据类型和通道数,例如 `CV_8UC1`(单通道8位无符号整数) --- ### 三、核心特性与使用步骤 1. **初始化全零矩阵** ```cpp cv::Mat mat = cv::Mat::zeros(3, 3, CV_32FC1); ``` 生成一个3x3的单通道浮点矩阵,所有元素初始化为0.0f。 2. **数据类型与通道控制** - `type` 的格式为 `CV_<位数><类型>C<通道数>` 例如: - `CV_8UC1`:单通道8位无符号整数(灰度图常用) - `CV_32FC3`:3通道32位浮点数(彩色图处理) 3. **返回值** - 返回一个 `cv::Mat` 对象,内存自动管理 --- ### 四、代码示例 ```cpp #include <opencv2/opencv.hpp> int main() { // 示例1:创建3x3单通道全零矩阵 cv::Mat mat1 = cv::Mat::zeros(3, 3, CV_8UC1); std::cout << "mat1 = \n" << mat1 << std::endl; // 示例2:创建2x2三通道全零矩阵(用于彩色图像) cv::Mat mat2 = cv::Mat::zeros(2, 2, CV_8UC3); std::cout << "mat2 = \n" << mat2 << std::endl; return 0; } ``` **输出**: ``` mat1 = [ 0, 0, 0; 0, 0, 0; 0, 0, 0] mat2 = [ 0, 0, 0, 0, 0, 0; 0, 0, 0, 0, 0, 0] ``` --- ### 五、应用场景 1. **图像处理初始化**:为滤波器、掩膜操作预分配内存 2. **算法中间结果存储**:如累积梯度、积分图计算 3. **矩阵运算占位符**:避免未初始化内存导致的随机值问题 --- ### 六、注意事项 1. **数据类型匹配**:确保 `type` 与实际需求一致(如浮点运算需用 `CV_32F`) 2. **尺寸有效性**:`rows` 和 `cols` 必须为非负数(但允许为0,此时矩阵为空) 3. **效率优势**:比手动循环赋值更高效,直接调用底层优化代码 --- ### 七、对比其他初始化方法 | 方法 | 特点 | 示例 | |---------------------|--------------------------|----------------------------| | `Mat::zeros` | 全零初始化,高效 | `Mat::zeros(2,2,CV_8UC1)` | | `Mat::ones` | 全1初始化 | `Mat::ones(2,2,CV_32F)` | | `Mat::eye` | 单位矩阵初始化 | `Mat::eye(3,3,CV_64FC1)` | | 构造函数直接初始化 | 灵活但需手动填充数据 | `Mat(2,2,CV_8UC1, Scalar(0))` | --- 通过以上步骤,可以快速掌握 `cv::Mat::zeros` 的核心用法及其在OpenCV开发中的实际价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值