先从最简单的学起来

1.mat.cols()

mat 矩阵的列数,和矩阵的通道数无关

new Mat(10,20,CvType.CV_8UC2)      mat.cols==20

2.mat.rows()

mat 矩阵的行数 和矩阵的通道数据无关

new Mat(10,20,CvType.CV_8UC2)      mat.rows==10

3.mat.channels()

mat 矩阵的通道数,常用的是1,2,3,4

灰度图 单通道

RGB   3通道

new Mat(10,20,CvType.CV_8UC2)      mat.channels()==2

4.mat.depth()

mat 矩阵的深度 和一开始定义mat的时候指定的类型有关系,深度的值为 0-8  深度值是描述一个图片在一个像素点的精度,当然精度越大,图片越清晰

            CV_8U = 0,CV_8S = 1,CV_16U = 2,CV_16S = 3,CV_32S = 4,CV_32F = 5,CV_64F = 6,CV_16F = 7;

new Mat(10,20,CvType.CV_8UC2)      mat.depth()==0

5.mat.elemSize()

在Java中:Byte.SIZE,Double.SIZE  对应的单位是bit    一个字节等于8个bit

mat.elemSize  矩阵中每个元素(这个地方的元素是一个数组,int[],double[]  通道数是数组的长度)的大小 单位字节

new Mat(10,20,CvType.CV_8UC2) 对于这个mat  CV_8U ====>8U 是8位 无符号整数,取值范围位 0-255  是一个通道中的元素所占字节    mat.elemSize =8bit *  channels_num =Byte.SIZE/8 * 2=2 byte

new Mat(10,20,CvType.CV_32FC2) 对于这个mat CV_32F====>标识每个通道的中元素所占字bit (比特)位32位 就是 32/8=4个字节 因为有两个通道所以mat.elemSize()=4*2=8

6.mat.elemSize1()

矩阵中每个通道元素所占大小,单位字节

这个函数和mat.elemSize() 很类似,但是确实有区别的,如果是单通道的矩阵,两者的值是相等的,但是对于多通道的mat.elemSize1()*channels=mat.elemSize()

7.mat.clone()

矩阵克隆,获取到一个新的矩阵

mat :Mat [ 20*20*CV_8UC2, isCont=true, isSubmat=false, nativeObj=0xeb7b10, dataAddr=0x1d48c180 ]

mat2=mat.clone();

ma2:Mat [ 20*20*CV_8UC2, isCont=true, isSubmat=false, nativeObj=0xeb8650, dataAddr=0x1d48c540 ]

克隆之后两个矩阵没有关联

8.mat.copyTo(mat2)

 Mat mat2=new Mat();mat.copyTo(mat2);

copyTo 之后的两个矩阵只是元素像相同,也是对应不同的矩阵

mat:Mat [ 20*20*CV_8UC2, isCont=true, isSubmat=false, nativeObj=0xdba600, dataAddr=0x1d37c180 ]

mat2:Mat [ 20*20*CV_8UC2, isCont=true, isSubmat=false, nativeObj=0xdba740, dataAddr=0x1d37c540 ]

复制之后的两个矩阵也是毫无关联

8.1  mat.copyTo(mat2,mask)

mat2 结果矩阵

mask 标识的是掩膜  作用是对mat 进行与非计算,最终得到mat2

     Mat mat = new Mat(10, 10, CvType.CV_8UC1) {{put(0, 0, 1, 12, 13, 14, 15, 16, 17, 18, 19, 10);put(1, 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 20);put(2, 0, 31, 32, 33, 34, 35, 36, 37, 38, 39, 30);put(3, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 40);put(4, 0, 51, 52, 53, 54, 55, 56, 57, 58, 59, 50);put(5, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 60);put(6, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 70);put(7, 0, 81, 82, 83, 84, 85, 86, 87, 88, 89, 80);put(8, 0, 91, 92, 93, 94, 95, 96, 97, 98, 99, 90);put(9, 0, 01, 02, 03, 04, 05, 06, 07, 8, 9,   0);}};System.out.println(mat.dump());Mat mask=new Mat(mat.size(),CvType.CV_8UC1,new Scalar(1));mask.submat(new Rect(0,0,4,8)).setTo(new Scalar(0));System.out.println(mask.dump());Mat dst=new Mat();mat.copyTo(dst, mask);System.out.println(dst.dump());

9.mat.submat(Rect rect)

rect  是一个矩形,new Rect(x,y,width,height)

其中x,y 位截取的开始坐标,width 截取的宽度,height 截取的高度

比如:

     Rect rect=new Rect();rect.set(new double[]{0,1,4,5});Mat submat=mat.submat(rect);

10.mat.col(col_index)

获取到第col_index 列,从 0开始

11.mat.row(row_index)

获取到矩阵的第 row_index 行

12. mat.colRange(range)

获取到range范围的行

public class Range {public int start, end;public Range(int s, int e) {this.start = s;this.end = e;}public Range() {this(0, 0);}public Range(double[] vals) {set(vals);}public void set(double[] vals) {if (vals != null) {start = vals.length > 0 ? (int) vals[0] : 0;end = vals.length > 1 ? (int) vals[1] : 0;} else {start = 0;end = 0;}}
}

range 有一个起始,一个结束。可以通过构造函数初始化,也可以通过set函数进行初始化

13.mat.rowRange(range)

类似 mat.colRange(range) 截取range范围的行获取到新矩阵

14.mat.convertTo(dst, cvType);

实现的功能是不同类型之间矩阵的转换

     Mat mat = new Mat(10, 10, CvType.CV_8UC1) {{put(0, 0, 1, 12, 13, 14, 15, 16, 17, 18, 19, 10);put(1, 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 20);put(2, 0, 31, 32, 33, 34, 35, 36, 37, 38, 39, 30);put(3, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 40);put(4, 0, 51, 52, 53, 54, 55, 56, 57, 58, 59, 50);put(5, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 60);put(6, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 70);put(7, 0, 81, 82, 83, 84, 85, 86, 87, 88, 89, 80);put(8, 0, 91, 92, 93, 94, 95, 96, 97, 98, 99, 90);put(9, 0, 01, 02, 03, 04, 05, 06, 07, 8, 9, 0,11);}};Mat dst=new Mat();mat.convertTo(dst, CvType.CV_16F);

15. Mat.convertTo(Mat m, int rtype, double alpha)

alpha 标识放大倍数

对应的元素扩大 alpha 倍

16.Mat.convertTo(Mat m, int rtype, double alpha, double beta)

矩阵放大alpha 倍之后,每个元素加上beta 获取到新的矩阵

17.mat.empty()

判断矩阵是否元素为空

 Mat mat = new Mat(10, 10, CvType.CV_8UC1) {{put(0, 0, 1, 12, 13, 14, 15, 16, 17, 18, 19, 10);put(1, 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 20);put(2, 0, 31, 32, 33, 34, 35, 36, 37, 38, 39, 30);put(3, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 40);put(4, 0, 51, 52, 53, 54, 55, 56, 57, 58, 59, 50);put(5, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 60);put(6, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 70);put(7, 0, 81, 82, 83, 84, 85, 86, 87, 88, 89, 80);put(8, 0, 91, 92, 93, 94, 95, 96, 97, 98, 99, 90);put(9, 0, 01, 02, 03, 04, 05, 06, 07, 8, 9,   0);}};System.out.println(mat.empty());   //  falseMat dst=new Mat();System.out.println(dst.empty());   //true

18.mat.CheckVector()

检查mat 是否为向量

之前写过一个专门介绍的博客: https://blog.csdn.net/datouniao1/article/details/119027662

19.mat.diag()

diag 函数用于构造一个对角矩阵,以向量的形式返回对角线上的元素

20  mat.diag(int a)

构建一个对角矩阵,按照向量的形式返回主对角线 右上方偏移 a 或者左下方偏移 -a 位置的矩阵

21. mat.diag(diagVector)   ||  Mat.diag(diagVector)

diagVector 是一个向量  ,什么是向量  1*N 或者N*1的矩阵,所以在创建diagVector的时候,矩阵的行数或者是列数要有一个为1的

diag(diagVector) 是构建一个N*N 对角方阵 不是对角线上的元素全部为0

Mat diagVector = new Mat(1, 11, CvType.CV_8UC1, new Scalar(2));
System.out.println(diagVector.dump());
System.out.println(mat.diag(diagVector).dump());

该矩阵也可以通过这种方式来获取:

     Mat diagVector = new Mat(1, 11, CvType.CV_8UC1, new Scalar(2));Mat diag=Mat.diag(diagVector);

22. mat1.dot(mat2)

两个矩阵做点乘运算

   

那么我们用最为简单的矩阵,二维矩阵来看一下mat1.dot(mat2)

     Mat mat1 = new Mat(2, 2, CvType.CV_8UC1) {{put(0, 0, 1, 2);put(1, 0, 2, 3);}};Mat mat2 = new Mat(2, 2, CvType.CV_8UC1) {{put(0, 0, 2, 1);put(1, 0, 3, 4);}};double result=mat1.dot(mat2);  //1*2+2*1+2*3+3*4=22  

23.Mat.eye()

获取到一个单位矩阵:在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。除此以外全都为0。

 Mat eye = Mat.eye(3, 3, CvType.CV_32FC1);

24.mat.inv()

求解mat 的逆矩阵 在opencv4.5中这个函数有点问题(单位矩阵求解逆矩阵可以,但是普通的矩阵会报错)

我们来复习一下逆矩阵

假设: A  的逆矩阵 为B   则:AB=BA=E

逆矩阵的求法一般为 1.求解伴随矩阵 2.对元矩阵进行初等变换

单位矩阵的逆矩阵还是它本身

25.Mat.zeros()

零矩阵

Mat dst = Mat.zeros(new Size(2, 2), CvType.CV_16S);

.......

为什么那么多方法啊

还有很多

先不写了,以后再说

希望对你有所帮助!

OpenCv Mat -类 成员函数相关推荐

  1. 【OpenCV3】cv::Mat类成员函数详解

    cv::Mat为OpenCV2和OpenCV3中最重要的类,可以毫不夸张得说,掌握了cv::Mat的操作,就掌握了OpenCV大半,这里将详细的介绍下cv::Mat类的成员函数及其使用. 1.clon ...

  2. opencv Mat类赋值函数copyTo、clone的区别

    被赋值Mat之前已经被分配足够空间时,copyTo()不重新给分配空间,继续使用之前的空间,当已分配空间不足时,则会重新分配空间:clone()则均重新分配空间. Mat M(1, 3, CV_8UC ...

  3. OpenCV Mat类详解和用法

    OpenCV Mat类详解和用法 我们有多种方法可以获得从现实世界的数字图像:数码相机.扫描仪.计算机体层摄影或磁共振成像就是其中的几种.在每种情况下我们(人类)看到了什么是图像.但是,转换图像到我们 ...

  4. OpenCV Mat类详解和用法(官网原文)

    参考文章:OpenCV Mat类详解和用法 我马克一下,日后更 官网原文链接:https://docs.opencv.org/3.2.0/d6/d6d/tutorial_mat_the_basic_i ...

  5. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  6. C++类成员函数重载问题

    C++类成员函数重载问题 #include <iostream> using namespace std; class A {private: int a;int b; public:A( ...

  7. 类成员函数指针的语法

    /*类成员函数指针的语法*/ /*****************************类.h文件************************************/ #if !defined ...

  8. 10.2 运算符重载函数作为类成员函数和友元函数

    Complex operator+(Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; ...

  9. 类成员函数作为函数参数/回调函数 出现error C3867

    转自:https://blog.csdn.net/liyunxin_c_language/article/details/83188176 类成员函数作为函数参数出现error C3867:非标准语法 ...

最新文章

  1. CSS——float属性备忘笔记
  2. Magicodes.IE 2.5.6.1发布
  3. 90%测试猿都想学的Jmeter技能,你get吗?
  4. 阿里云天池 Docker练习场(入门赛) 操作步骤
  5. java二级 计算复杂利息_java 计算存款利息
  6. Delphi7调用dll(图文教程)2021最新
  7. 中国区块链专利申请数破万:阿里巴巴居首位 网心科技晋身前十
  8. CPU频率和单位换算
  9. python怎么识别拼音-python+拼音
  10. Latex 合并多个pdf文件
  11. 二次开发平台PMSCADA展示版
  12. iOS 之强大的WebSocket
  13. 高数——齐次方程中齐次的解释
  14. java获取身份证上的出生日期
  15. 打开服务器网页要5秒,网页优化技巧 如何把网页加载时间控制在1.5秒以内
  16. 智慧屏鸿蒙,荣耀智慧屏体验评测:鸿蒙OS首款产品,真正的智慧中心
  17. mongodb 聚合函数求平均值及时差处理
  18. iOS-键盘弹出的类型
  19. 模拟重力场(多方向运动+碰撞检测+重力加速度+能量损失)
  20. 晨风机器人发送图片_晨风机器人基本使用说明

热门文章

  1. CentOS下安装ZooKeeper
  2. 极客新闻——16、数据库设计中的5个常见错误
  3. 最新公开的华为认证通关秘籍来了
  4. 2022计算机行业技术策略报告
  5. 高德渲染网关Go语言重构实践
  6. 大白话详解5种网络IO模型
  7. 360数据处理平台的架构演进及优化实践
  8. 今日头条后端Java社招面经分享
  9. 盘点Java框架常用的3大底层技术!
  10. 有人说:穷学IT富搞金融!程序员究竟是不是一帮苦孩子在做?