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

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、