10.java openCV4.x 入门-特殊的Mat类汇总(二)

2024-04-07 14:44

本文主要是介绍10.java openCV4.x 入门-特殊的Mat类汇总(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

专栏简介

💒个人主页
📰专栏目录

点击上方查看更多内容
📖心灵鸡汤📖

我们唯一拥有的就是今天,唯一能把握的也是今天


建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫
🧭文章导航🧭
⬆️ 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 对象的字段值,例如 distance(距离)字段。 如果当前对象的某个字段值小于比较对象的对应字段值,则返回 true,否则返回 false。这个方法通常用于排序或查找操作,例如在匹配结果中进行筛选或查找最佳匹配
        // 创建两个 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());
  1. 创建一个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.方法介绍

   列举部分方法。

  1. 计算两个三维向量的叉乘
cross​(Point3 p)
参数:
pPoint3对象

   使用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());
  1. 计算当前点与另一个点p的点积(dot product)
dot​(Point3 p)
参数:
p Point3对象
   如果点积的结果为正数,则表示两个向量之间的夹角小于 90 度;如果点积的结果为负数,则表示两个向量之间的夹角大于 90 度;如果点积的结果为零,则表示两个向量之间的夹角为 90 度(垂直)。
计算公式可以表示为:
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)
参数:
mmat数据类型需为 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)
参数:
mmat数据类型需为 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}

这篇关于10.java openCV4.x 入门-特殊的Mat类汇总(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882880

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2