OpenCv Mat -类 成员函数
先从最简单的学起来
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 -类 成员函数相关推荐
- 【OpenCV3】cv::Mat类成员函数详解
cv::Mat为OpenCV2和OpenCV3中最重要的类,可以毫不夸张得说,掌握了cv::Mat的操作,就掌握了OpenCV大半,这里将详细的介绍下cv::Mat类的成员函数及其使用. 1.clon ...
- opencv Mat类赋值函数copyTo、clone的区别
被赋值Mat之前已经被分配足够空间时,copyTo()不重新给分配空间,继续使用之前的空间,当已分配空间不足时,则会重新分配空间:clone()则均重新分配空间. Mat M(1, 3, CV_8UC ...
- OpenCV Mat类详解和用法
OpenCV Mat类详解和用法 我们有多种方法可以获得从现实世界的数字图像:数码相机.扫描仪.计算机体层摄影或磁共振成像就是其中的几种.在每种情况下我们(人类)看到了什么是图像.但是,转换图像到我们 ...
- OpenCV Mat类详解和用法(官网原文)
参考文章:OpenCV Mat类详解和用法 我马克一下,日后更 官网原文链接:https://docs.opencv.org/3.2.0/d6/d6d/tutorial_mat_the_basic_i ...
- C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)
1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...
- C++类成员函数重载问题
C++类成员函数重载问题 #include <iostream> using namespace std; class A {private: int a;int b; public:A( ...
- 类成员函数指针的语法
/*类成员函数指针的语法*/ /*****************************类.h文件************************************/ #if !defined ...
- 10.2 运算符重载函数作为类成员函数和友元函数
Complex operator+(Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; ...
- 类成员函数作为函数参数/回调函数 出现error C3867
转自:https://blog.csdn.net/liyunxin_c_language/article/details/83188176 类成员函数作为函数参数出现error C3867:非标准语法 ...
最新文章
- CSS——float属性备忘笔记
- Magicodes.IE 2.5.6.1发布
- 90%测试猿都想学的Jmeter技能,你get吗?
- 阿里云天池 Docker练习场(入门赛) 操作步骤
- java二级 计算复杂利息_java 计算存款利息
- Delphi7调用dll(图文教程)2021最新
- 中国区块链专利申请数破万:阿里巴巴居首位 网心科技晋身前十
- CPU频率和单位换算
- python怎么识别拼音-python+拼音
- Latex 合并多个pdf文件
- 二次开发平台PMSCADA展示版
- iOS 之强大的WebSocket
- 高数——齐次方程中齐次的解释
- java获取身份证上的出生日期
- 打开服务器网页要5秒,网页优化技巧 如何把网页加载时间控制在1.5秒以内
- 智慧屏鸿蒙,荣耀智慧屏体验评测:鸿蒙OS首款产品,真正的智慧中心
- mongodb 聚合函数求平均值及时差处理
- iOS-键盘弹出的类型
- 模拟重力场(多方向运动+碰撞检测+重力加速度+能量损失)
- 晨风机器人发送图片_晨风机器人基本使用说明