专栏简介 | ||
💒个人主页 📰专栏目录 点击上方查看更多内容 | 📖心灵鸡汤📖 我们唯一拥有的就是今天,唯一能把握的也是今天 建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫 | 🧭文章导航🧭 ⬆️ 9.特殊的Mat类汇总(一) ⬇️ 11.待更新 |
特殊的Mat类汇总(二)
- 特殊的Mat类汇总(二)
- 一、MatOfDMatch
- 1.构造函数
- 2.DMatch类
- 1.构造函数
- 2.方法介绍
- 二、MatOfKeyPoint
- 1.构造函数
- 2.KeyPoint类
- 1.构造函数
- 三、MatOfPoint
- 1.构造函数
- 2.Point类
- 四、MatOfPoint2f
- 五、MatOfPoint3
- 1.构造函数
- 2.Point3类
- 1.构造函数
- 2.方法介绍
- 六、MatOfPoint3f
- 七、MatOfRect
- 1.构造函数
- 2.Rect类
- 八、MatOfRect2d
- 九、MatOfRotatedRect
- 1.构造函数
- 2.RotatedRect类
- 1.构造函数
- 2.方法介绍
- 1.boundingRect
- 2.points(Point[] pt)
特殊的Mat类汇总(二)
1. 本节中列举的类的作用用于表示图像的轮廓点或矩形相关的数据信息。
2. 方法可参考 9.特殊的Mat类汇总(一),本节仅列出不同的地方。
3. 本文示例不考虑上下文
一、MatOfDMatch
MatOfDMatch用于存储特征点的匹配信息。包括匹配的特征点在两个图像中的索引和它们之间的距离。它是一个二维矩阵,每一行表示一个匹配对,每个匹配对由两个特征点的索引和它们之间的距离组成。
1.构造函数
MatOfDMatch(DMatch... ap) | |
参数: | |
ap | DMatch对象 |
DMatch dMatch1 =new DMatch(0,0,0,2f);DMatch dMatch2 =new DMatch(2,2,2,4f);// 使用构造函数创建MatOfDMatch对象,并传入两个DMatch对象MatOfDMatch match=new MatOfDMatch(dMatch1,dMatch2);//打印对象内容System.out.println("match.dump() :\n " + match.dump());
2.DMatch类
DMatch 类是用于表示两幅图像之间的匹配关系的类。
1.构造函数
DMatch(int _queryIdx, int _trainIdx, int _imgIdx, float _distance) | |
参数: | |
_queryIdx | 查询图像中描述符的索引。这个参数表示在查询图像中,与训练图像中的匹配描述符相对应的描述符的索引位置 |
_trainIdx | 训练图像中描述符的索引。这个参数表示在训练图像中,与查询图像中的匹配描述符相对应的描述符的索引位置 |
_imgIdx | 在训练图像中的匹配图像索引。这个参数提供了关于匹配特征点来自哪个训练图像的信息 |
_distance | 描述符之间的距离。这个参数表示两个描述符之间的相似性度量,通常用于筛选匹配结果 |
2.方法介绍
1.比较两个 DMatch 对象,并根据给定的比较条件返回一个布尔值
lessThan(DMatch it) | |
参数: | |
it | 与当前 DMatch 对象进行比较的对象 |
// 创建两个 DMatch 对象DMatch match1 = new DMatch(0, 0, 0, 2.0f);DMatch match2 = new DMatch(0, 0, 0, 1.0f);// 比较两个 DMatch 对象if (match1.lessThan(match2)) {System.out.println("match1 小于 match2");} else {System.out.println("match1 不小于 match2");}
二、MatOfKeyPoint
MatOfKeyPoint用于存储关键点的信息。
MatOfKeyPoint类的作用包括: 1.存储关键点的位置和尺度信息:每个关键点由其在图像中的坐标和尺度大小表示。 2.存储关键点的特征描述符:关键点通常与其周围的图像区域相关联,可以通过计算该区域的特征描述符来表示关键点的特征。 3.支持关键点的检测和提取:可以使用MatOfKeyPoint类中的方法来检测图像中的关键点,并提取关键点的特征描述符。 4.支持关键点的匹配和跟踪:可以使用MatOfKeyPoint类中的方法来进行关键点的匹配和跟踪,用于目标检测、图像配准等任务。 |
1.构造函数
1.将给定的Mat对象转换为MatOfKeyPoint对象
MatOfKeyPoint(Mat m) | |
参数: | |
m | mat数据类型需为 CV_32FC(7),且需要1行多列或1列多行(cols=7,rows>0,CvType.CV_32FC1也可,请自行验证) |
Mat mat=new Mat(2,1, CvType.CV_32FC(7));mat.put(0,0,1,2,3,4,5,6,7,8,9,10,11,12,14,14);MatOfKeyPoint keyPoint=new MatOfKeyPoint(mat);System.out.println("keyPoint.dump() = " + keyPoint.dump());
- 创建一个MatOfKeyPoint对象,并将传入的KeyPoint类型的数组作为初始数据
MatOfKeyPoint(KeyPoint... a) | |
参数: | |
a | KeyPoint 数组 |
2.KeyPoint类
KeyPoint 类是用于表示特征检测中的关键点的。关键点是图像中具有显著特征的区域,例如角点、边缘或其他结构。特征检测是计算机视觉中的一项重要任务,用于识别和定位图像中的关键点,以便进一步进行特征描述、匹配或物体检测等操作。
1.构造函数
这里仅对其中一个构造函数进行说明。
KeyPoint(float x, float y, float _size, float _angle, float _response, int _octave, int _class_id) | |
参数: | |
x | 关键点的 x 坐标 |
y | 关键点的 y 坐标 |
_size | 关键点的尺度,表示关键点的大小或半径 |
_angle | 关键点的方向,表示关键点所在的边缘或结构的方向 |
_response | 关键点的响应值,表示该关键点在特征检测算法中的显著性或匹配度 |
_octave | 关键点所在的图像八度(octave),用于多尺度特征检测时标识关键点所在的尺度层级 |
_class_id | 关键点的类别 ID,用于标识关键点所属的类别或类型 |
三、MatOfPoint
用于表示图像中的轮廓点的类(表示二维空间中的轮廓点)
MatOfPoint类的主要作用包括: 1.存储轮廓点集:MatOfPoint类可以用来存储图像中的轮廓点集。轮廓是图像中的连续边界,由一组点表示。MatOfPoint类可以存储这些点,并提供对这些点的访问和操作方法。 2.访问轮廓点:MatOfPoint类提供了一些方法来访问轮廓中的点。可以通过索引访问单个点,也可以通过迭代器遍历所有的点。 。 3.转换为其他数据结构:MatOfPoint类可以将轮廓点集转换为其他数据结构,如数组或列表。这样可以更方便地使用这些点进行进一步的分析和处理。 4.计算轮廓的面积和周长:MatOfPoint类提供了计算轮廓的面积和周长的方法。这些信息对于图像分析和处理非常有用。 |
1.构造函数
MatOfPoint(Mat m) | |
参数: | |
m | mat数据类型需为 CV_32SC2 mat数据类型: CV_32SC1: rows>0,cols=2 CV_32SC2: rows>0,cols=1或 rows=1,cols>0 |
Mat mat=new Mat(1,2, CvType.CV_32SC2);MatOfPoint matOfPoint=new MatOfPoint(mat);System.out.println("matOfPoint.dump() :\n " + matOfPoint.dump());
2.Point类
相关说明参考:6.Mat之局部区域读写及Range和Rect介绍
四、MatOfPoint2f
与MatOfPoint一样用于表示二维点集的类,它的坐标类型为浮点型
。便于更加精确的操作点集。
五、MatOfPoint3
用于表示图像中的轮廓点的类(表示三维空间中的轮廓点)
1.构造函数
MatOfPoint3(Mat m) | |
参数: | |
m | mat数据类型需为CV_32SC3,且需要1行多列或1列多行(CV_32SC1,rows>0,cols=3也可) |
Mat mat=new Mat(4,1, CvType.CV_32SC3);MatOfPoint3 matOfPoint=new MatOfPoint3(mat);System.out.println("matOfPoint.dump() :\n " + matOfPoint.dump());
2.Point3类
Point3类是一个表示三维坐标点的类。它在三维空间中定义了一个点的坐标,包括x、y和z坐标。Point3类通常用于表示三维物体的位置、方向或者其他特征
1.构造函数
2.方法介绍
列举部分方法。
- 计算两个三维向量的叉乘
cross(Point3 p) | |
参数: | |
p | Point3对象 |
使用cross方法可以计算两个向量的叉乘,并得到一个新的向量。这在计算机图形学和计算机视觉中经常用于计算法向量、平面的法向量、光线的反射方向等。
两个三维向量的叉乘公式可以表示为: A × B = (A2B3 - A3B2, A3B1 - A1B3, A1B2 - A2B1) 其中,A = (A1, A2, A3) 和 B = (B1, B2, B3) 是两个三维向量 |
Point3 p3_1 = new Point3(1,2,3);Point3 p3_2 = new Point3(2,3,4);Point3 cross = p3_1.cross(p3_2);System.out.println("cross.toString() = " + cross.toString());
- 计算当前点与另一个点p的点积(dot product)
dot(Point3 p) | |
参数: | |
p | Point3对象 |
计算公式可以表示为: dot = a.x * b.x + a.y * b.y + a.z * b.z 其中a.x、a.y和a.z分别表示向量a在x、y和z轴上的坐标,b.x、b.y和b.z分别表示向量b在x、y和z轴上的坐标 |
Point3 point1=new Point3(1,2,0);Point3 point2=new Point3(2,4,0);double dot = point1.dot(point2);System.out.println("dot = " + dot);
六、MatOfPoint3f
与MatOfPoint一样用于表示三维点集的类,它的坐标类型为浮点型
。便于更加精确的操作点集。
七、MatOfRect
MatOfRect类的主要作用是在图像或视频中检测和定位矩形对象。它通常用于目标检测、人脸识别、车牌识别等计算机视觉任务中。
MatOfRect类具有以下主要功能和方法: 1.存储矩形对象: MatOfRect类可以存储一组矩形对象,每个矩形对象由四个整数表示,分别表示矩形的左上角坐标和宽度、高度。 2.访问矩形对象: 可以通过索引访问MatOfRect对象中的矩形对象,获取矩形的位置和大小信息。 3.操作矩形对象: 可以对MatOfRect对象中的矩形对象进行操作,如添加、删除、修改等。 4.矩形对象的转换: 可以将MatOfRect对象转换为其他数据结构,如矩形数组、列表等。 |
1.构造函数
MatOfRect(Mat m) | |
参数: | |
m | mat数据类型需为 CV_32SC4,且需要1行多列或1列多行(CV_32SC1,rows>0,cols=4也可) |
Mat mat = new Mat( 4,1, CvType.CV_32SC4);MatOfRect matOfRect = new MatOfRect(mat);System.out.println("matOfRect.dump() :\n " + matOfRect.dump());
2.Rect类
相关说明参考:6.Mat之局部区域读写及Range和Rect介绍
八、MatOfRect2d
与MatOfRect一样,但是使用double类型的坐标表示
九、MatOfRotatedRect
MatOfRotatedRect 类是一个特殊的Mat类,用于存储旋转矩形对象的数据。旋转矩形是一个带有角度信息的矩形,通常用于表示图像中的物体或区域。
1.构造函数
MatOfRotatedRect(Mat m) | |
参数: | |
m | mat数据类型需为 CV_32FC(5),且需要1行多列或1列多行(CV_32FC1,rows>0,cols=5也可) |
Mat mat =new Mat(3,1, CvType.CV_32FC(5));MatOfRotatedRect matOfRotatedRect = new MatOfRotatedRect(mat);System.out.println("matOfRotatedRect.dump() :\n " + matOfRotatedRect.dump());
2.RotatedRect类
用于表示旋转矩形的类,它可以具有任意旋转角度。
1.构造函数
1.
RotatedRect(Point c, Size s, double a) | |
参数: | |
c | 旋转矩形的中心点坐标,为一个Point对象 |
s | 旋转矩形的尺寸,为一个Size对象,表示矩形的宽度和高度 |
a | 旋转矩形的旋转角度,以度为单位 |
RotatedRect(double[] vals) | |
参数: | |
vals | 一个包含5个元素的double数组,依次表示旋转矩形的中心点坐标(x, y),宽度width,高度height,以及旋转角度angle |
double vals[]={4,4,5,5,-10};RotatedRect rotatedRect = new RotatedRect(vals);System.out.println("rotatedRect.toString() = " + rotatedRect.toString());
结果:
rotatedRect.toString() = { {4.0, 4.0} 5x5 * -10.0 }
2.方法介绍
仅列举部分
1.boundingRect
计算RotatedRect对象的最小外接矩形(即包围矩形)
public class RotatedRectExample {public static void main(String[] args) {Point point =new Point(4,4);Size size = new Size(2,2);RotatedRect rotatedRect = new RotatedRect(point,size,0);System.out.println("rotatedRect.toString() = " + rotatedRect.toString());Rect rect = rotatedRect.boundingRect();System.out.println("rect.toString() = " + rect.toString());}
}
结果:
rotatedRect.toString() = { {4.0, 4.0} 2x2 * 0.0 }
rect.toString() = {3, 3, 3x3}
2.points(Point[] pt)
获取旋转矩形的四个顶点坐标。
public class PointsExample {public static void main(String[] args) {// 创建一个旋转矩形对象RotatedRect rotatedRect = new RotatedRect(new Point(100, 100), new Size(20, 20), 0);// 创建一个Point数组用于存储顶点坐标Point[] points = new Point[4];// 获取旋转矩形的顶点坐标rotatedRect.points(points);for (Point point : points) {System.out.println("point.toString() = " + point.toString());}}
}
结果:
point.toString() = {90.0, 110.0}
point.toString() = {90.0, 90.0}
point.toString() = {110.0, 90.0}
point.toString() = {110.0, 110.0}