首页 > 其他分享 >OpenCV Mat类详解

OpenCV Mat类详解

时间:2023-01-19 09:23:20浏览次数:33  
标签:Mat int 矩阵 OpenCV 详解 构造函数 cv 函数

1. Mat类常用成员函数和成员变量

        由于 Mat 类使用的非常广泛,使用的形式也非常之多,这里只对较为常用的成员函数和成员变量做出了整理;

1.1 构造函数

(1)默认构造函数

cv::Mat::Mat()

  默认构造函数:生成一个矩阵并由OpenCV提供的函数(一般是Mat::create() 和 cv::imread() )来分配储存空间。

  Mat类可以分为两个部分:矩阵头和指向像素数据的矩阵指针

  矩阵头:包括数字图像的矩阵尺寸、存储方法、存储地址和引用次数等,矩阵头的大小是一个常数,不会随着图像的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针,例如:

1 cv::Mat a ;                 //默认构造函数,创建矩阵头
2 a = cv::imread("test.jpg"); //读入图像,矩阵指针指向该像素数据
3 cv::Mat b = a ;             //复制

  上面的a,b有各自的矩阵头,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外一个。那么,多个Mat共用一个矩阵数据,最后谁来释放矩阵数据呢?
  这就是引用计数的作用,当Mat对象每被复制一次时,就会将引用计数加1,而每销毁一个Mat对象(共用同一个矩阵数据)时引用计数会被减1,当引用计数为0时,矩阵数据会被清理。

(2)常用构造函数——1

cv::Mat::Mat(int rows,int cols,int type)

  重载的构造函数,这也是常用构造函数之一,在创建对象同时,提供矩阵的大小(rows,行数;cols ,列数),以及存储类型(type)
该类型表示矩阵中每一个元素在计算机内存的存储类型,如CV_8UC3,具体含义为“3通道8位无符号数”。

eg:

Mat src(10,10,CV_32FC3);  //表示src是一个10*10的矩阵,且矩阵元素以32位float型存储

类似,OpenCV还提供了一种Size() 数据结构来构造Mat对象

(3)常用构造函数——2

cv::Mat::Mat(Size size,int type )   

Size类等效于一个成对数据,size::Size(cols,rows),特别注意 cols和rows的位置

eg:

1 Mat src1(3, 4, CV_32FC3);
2 Mat src2(Size(3, 4), CV_32FC3);
3 cout << "src1.rows=" << src1.rows << " src1.cols=" << src1.cols <<endl;
4 cout << "src2.rows=" << src2.rows << " src2.cols=" << src2.cols << endl;
5 cout << "src1.size="<<src1.size() << endl <<"src2.size=" << src2.size() <<endl;

         不得不说,这个Size类的数据结构有点“反人类”,但这样做的好处是方便了计算机内部的运算(比如OpenCV很多函数计算Size相关的数据也是按这个顺序来的,具体为什么这样,我也不太清楚,个人理解为行业标准);

        还有,我们平时所说分辨率,也是Size的类型,比如屏幕分别率 1440*900,其中cols=1440,rows=900;

(3)常用构造函数——3

cv::Mat::Mat(int ndims,const int *  sizes,int type,const Scalar& s) 

该构造函数与使用了Scalar参数,作用是能够通过Scalar数据类来初始化元素值,例如,我们要生成一张白色背景的图片:

1 Mat src1(300, 400, CV_8UC3,Scalar(255,255,255));
2 imshow("test", src1);

其中,(255,255,255)对应以8位无符号数存储,RGB色域的白色值。

(5)常用构造函数——4

cv::Mat::Mat(const Mat & m)

引用m矩阵,注意,这里是引用值;

1.2 成员函数

(1)at函数
at函数的功能是访问矩阵元素,根据不同的使用场景,有多个重载函数可供选择。
如,访问一个二维的矩阵,可用at函数原型为:

_Tp& cv::Mat::at(int i0,int i1)

eg:

1 Mat src = imread("test.jpg");
2 int elem = src.at<int>(0,0);

访问test.jpg图像的(0 , 0)元素

(2)channels函数

int cv::Mat::channels()  const

返回图像的通道数

(3)clone函数

Mat cv::Mat::clone()    const

矩阵复制

(4)convertTo函数

void cv::Mat::convertTo(OutputArray m,int rtype,double alpha = 1,double beta = 0)   const

转换矩阵存储类型,具体计算公式如下:

m(x,y)=saturate_cast<rType>(α(∗this)(x,y)+β)

m是输入矩阵,rtype是目标类型,alpha是放缩系数,beta是增减标量

(5)copyTo函数

void cv::Mat::copyTo(OutputArray    m)  const

从m矩阵复制data数据单元,与clone函数的作用类似

(6)create函数

void cv::Mat::create(int rows,int cols,int type) 

分配矩阵的存储单元,一般和默认构造函数配合使用

(7)depth函数

int cv::Mat::depth()    const

返回图像深度,即矩阵元素的存储方式

(8)diag函数

Mat cv::Mat::diag(int d = 0)  const

提取矩阵的对角元素

(9)mul函数

MatExpr cv::Mat::mul(InputArray m,double scale = 1)    const

矩阵的乘法

(10)inv函数

MatExpr cv::Mat::inv(int method = DECOMP_LU)   const

求逆矩阵

(11)t函数

MatExpr cv::Mat::t() const

求转置矩阵

(12)total函数

size_t cv::Mat::total() const

返回矩阵的元素总个数,如30*40的图像,存在1200个像素点

(13)pop_back函数

eg:

object.pop_back();    //object是一个矩阵,该函数功能是弹出最后一行元素

(14)release函数

在必要的情况下,递减引用计数并释放该矩阵。

void Mat::release()

  该方法递减与矩阵的数据关联的引用计数。当引用计数减为0时,矩阵的数据将被释放,数据和引用计数器指针设置为 NULL。如果矩阵头指向外部数据集 (见 Mat::Mat()), 引用计数为 NULL,并且该方法在这种情况下无效。

  可以手动调用此方法强制矩阵数据释放。但由于这种方法在析构函数中是自动调用的,或以更改数据指针的其他方法,因此通常不需要调用这个函数。在支持它的平台上,引用计数器递减并检查是否为0 是一个原子操作。因此,在不同的线程异步调用相同的矩阵是安全的操作。

(15) Mat::ones()函数

Mat m = Mat::ones(2, 2, CV_8UC3); 相当于:Mat m = Mat(2, 2, CV_8UC3, 1);

// OpenCV replaces 1 with Scalar(1,0,0)相当于每个像素的第一个通道为1,其余两个通道为0;

(16) Mat::zeros()函数

Mat m = Mat::zeros(2, 2, CV_8UC3);

//相当于创建一张黑色的图,每个像素的每个通道都为0,Scalar(0,0,0);

2.3 成员变量

1 int cv::Mat::cols;     //返回矩阵的列数
2  
3 int cv::Mat::rows      // 返回矩阵行数
4  
5 uchar* cv::Mat::data   // 指向矩阵的数据单元的指针
6  
7 int cv::Mat::dims      // 返回矩阵维度,该维度≥2
8  
9 MatSize cv::Mat::size  // 返回矩阵大小

 

标签:Mat,int,矩阵,OpenCV,详解,构造函数,cv,函数
From: https://www.cnblogs.com/ybqjymy/p/17061050.html

相关文章

  • match's mistake
    Survivor(https://codeforces.com/group/L9GOcnr1dm/contest/422378/problem/F)血的教训比较有意思的一个贪心题简单翻译一下题目:输入第一行n,m,k;分别代表有几个人,几......
  • 【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch解决方法
      解决:    https://blog.csdn.net/private_void_main/article/details/128014317 ......
  • Linux服务器 MATLAB 安装
    在Ubuntu安装配置MATLAB开发环境https://muzing.top/posts/52276c1/Linux下基于MobaXterm的无图形界面MatlabR2018a安装https://www.cnblogs.com/Jody9123/p/13447273......
  • 二维图像的原子匹配追踪投影算法的图像重建matlab仿真
    1.算法描述       原子快速匹配追踪信号稀疏分解算法,并将其应用于静态图像编码.多原子匹配追踪通过每次迭代选取多个原子的形式,实现信号的快速稀疏分解.在此基础......
  • m基于遗传优化算法的公式参数拟合matlab仿真
    1.算法描述遗传算法的原理        遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假......
  • Matrix Matcher
    MatrixMatcher代码#include<bits/stdc++.h>usingnamespacestd;constintM=1005;usingull=unsignedlonglong;constullP1=131,P2=233;strings1[M],s2[M];......
  • m基于效用函数的联合资源分配matlab仿真,对比PF,CUBP以及DUBP三种方法
    1.算法描述 表示基站n到用户m是否连接。 1.1C-CUBP   主要涉及到的公式有: 1.2C-DUBP 主要涉及到的公式有: 2.仿真效果预览matlab2022a仿真......
  • bugku_EasyMath
    bugku_EasyMath题目描述简单的数学题fromCrypto.Util.numberimportgetPrime,bytes_to_longfromsecretimportflagp=getPrime(2048)q=getPrime(2048)x=......
  • 这可能是Matplotlib和Seaborn最全的入门文档
    matplotlib是python第一个数据可视化库,在数据分析,可视化领域的地位和贡献是无法磨灭的。但也正是因为有了这位老大哥的出现给后续基于matplotlib实现的绘图库实现了可能。......
  • 分块入门详解(比较全面)
    最近写了几个分块,顺便做一下笔记。什么是分块分块是一种数据结构。。有许多数据结构都是\(\mathrm{log}\)数据结构,比如线段树,树状数组等等。他们复杂度优秀,但是都是树......