6.java openCV4.x 入门-Mat之局部区域读写及Range和Rect介绍

专栏简介

💒个人主页
📰专栏目录

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

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


建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫
🧭文章导航🧭
⬆️ 5.Mat之像素读写
⬇️ 7.待更新

Mat之范围读写

  • 一、🌳Range类
    • 1.构造函数
    • 2.方法介绍
      • 1.all()
      • 2.intersection​(Range r1)
      • 3.set​(double[] vals)
      • 4.shift​(int delta)
      • 5.size()
  • 二、🌳Rect类
    • 1.构造函数
    • 2.方法介绍
      • 1.area()
      • 2.contains​(Point p)
      • 3.br()
      • 4.tl()
      • 5.size()
  • 三、🌳矩阵范围读写
    • 1.col​(int x)
    • 2.colRange​
    • 3.row​(int y)
    • 4.rowRange
    • 5.diag​
    • 6.submat
  • 四、🌳感兴趣区域
    • 1.adjustROI
    • 2.locateROI​
  • 五、其它函数
    • 1.isSubmatrix()
    • 2.channels()
    • 3.checkVector
    • 4.cols()
    • 5.dataAddr()
    • 6.depth()
    • 7.dims()
    • 8.dump()
    • 9.elemSize()
    • 10.elemSize1()
    • 11. empty()
    • 12.finalize()
    • 13.getNativeObjAddr()
    • 14.height()
    • 15. isContinuous()
    • 16.release()
    • 17.rows()
    • 18.size()
    • 19. size​(int i)
    • 20.step1()
    • 21.step1​(int i)
    • 22.total()
    • 23.type()
    • 24.width()

   在之前先了解下Range类和 Rect类

一、🌳Range类

   Range类用于表示一个范围(一个连续的数值范围),并用于选择图像或矩阵的子区域。

1.构造函数

   这里仅解释下构造函数,就不代码举例了。
在这里插入图片描述
1.

Range​(double[] vals)
参数:
vals 一个包含两个元素的double数组,分别表示范围的起始值和结束值
2.
Range​(int s, int e)
参数:
s 范围的起始值
e 范围的结束值

2.方法介绍

  这里仅列举部分,简单直接的函数就不列举了

1.all()

  返回一个表示整个范围的Range对象。换句话说,它返回一个从负无穷到正无穷的范围。

 System.out.println("Range.all() = " + Range.all());

结果

Range.all() = [-2147483648, 2147483647)

2.intersection​(Range r1)

  计算两个Range对象的交集,并返回一个新的Range对象表示交集部分。
  1.如果两个Range对象有交集,则返回一个新的Range对象,该对象的start为两个Range对象中start值较大的那个,end为两个Range对象中end值较小的那个。
  2.如果两个Range对象没有交集,则返回一个start值为两个对象中最大的值,end值也为两个对象中最大的值的一个Range对象(ps或者说无交集是返回一个空的Range对象,这里所说的空Range对象并不是代表Range对象是空的,而是指Range对象没有范围或范围是0

public class IntersectionExample {public static void main(String[] args) {Range range1 = new Range(1,5);Range range2 = new Range(3,7);Range intersection = range1.intersection(range2);System.out.println("intersection.toString() = " + intersection.toString());}
}

请自行验证

3.set​(double[] vals)

  设置Range对象的范围。vals包含两个元素的数组,分别表示范围的起始值和结束值。

4.shift​(int delta)

  调整Range对象的范围,使其向右或向左移动

public static void main(String[] args) {Range range = new Range(4,8);System.out.println("range = " + range);//向右移动2位Range shift_r = range.shift(2);System.out.println("shift_r = " + shift_r);//向左移动4位Range shift_l = shift_r.shift(-4);System.out.println("shift_l = " + shift_l);}

5.size()

  返回范围的大小,即范围内的元素数量。

二、🌳Rect类

  

Rect类的作用包括:
  表示矩形区域的位置和大小:Rect类包含了四个整型成员变量x、y、width和height,分别表示矩形区域的左上角点的x坐标、y坐标,以及矩形区域的宽度和高度。
  用于图像处理和计算机视觉算法:在OpenCV中,Rect类常常用于表示图像中的感兴趣区域(Region of Interest,ROI),即在图像中选择一个矩形区域进行特定的操作,如图像裁剪、目标检测、特征提取等。
  作为其他类的参数和返回值:Rect类常常作为其他OpenCV函数和类的参数和返回值,用于传递和获取矩形区域的位置和大小信息。

1.构造函数

在这里插入图片描述
  Point 和Size类之前我们已经了解过了,这里就不再介绍相关类了。
  我这里只解释下部分构造函数。
1.

Rect​(double[] vals)
参数:
vals 包含四个 double 值的数组,分别表示矩形的左上角 x 坐标、左上角 y 坐标、宽度和高度
 		//创建Rect对象,使用valsdouble vals[] ={0,1,4,4};Rect rect = new Rect(vals);//Rect rect = new Rect(0,1,4,4);System.out.println("rect = " + rect);
  1. 其中p1和p2分别表示矩形的对角线的两个顶点
Rect​(Point p1, Point p2)
参数:
p1 顶点1
p2 顶点2
        Point point1 = new Point(1,2);Point point2 =new Point(5,5);Rect rect_p = new Rect(point1,point2);System.out.println("rect_p = " + rect_p);

2.方法介绍

  只列举部分,不列举不代表不重要!!!

1.area()

  计算矩形区域的面积。该方法返回一个double类型的值,面积的计算是通过矩形的宽度和高度相乘得到的。

2.contains​(Point p)

  判断一个点是否在一个矩形区域内部

        //创建一个矩形Rect rect = new Rect(0,0,100,100);boolean contains = rect.contains(new Point(11, 11));System.out.println("contains = " + contains);

如果给定的点p在矩形内部,则返回true。如果给定的点p在矩形外部,则返回false。

3.br()

  返回矩形的右下角点的坐标,以Point对象的形式返回

4.tl()

  返回矩形的左上角顶点的坐标,以Point对象的形式返回

5.size()

  返回矩形的大小。它返回一个Size对象,该对象包含矩形的宽度和高度信息。

三、🌳矩阵范围读写

  请自行验证示例结果

1.col​(int x)

  返回一个包含矩阵的第x列数据的新的Mat对象。这个新的Mat对象将会是一个单列矩阵,其中包含了矩阵的第x列的所有元素。

        Mat mat = new Mat(3,3,CvType.CV_8UC1);//设置值mat.put(0,0,1,2,3,4,5,6,7,8,9);//获取第二列值Mat col = mat.col(1);//打印结果System.out.println("mat.dump() = \n" + mat.dump());System.out.println("col.dump() = \n" + col.dump());

2.colRange​

  获取矩阵的指定列范围。
1.

colRange​(int startcol, int endcol)
参数:
startcol 起始列的索引(包含在范围内)
endcol 结束列的索引(不包含在范围内)
        Mat mat = new Mat(3,3,CvType.CV_8UC1);//设置值mat.put(0,0,1,2,3,4,5,6,7,8,9);//获取第一列到第三列之间的Mat对象,不包含第三列Mat colRange = mat.colRange(0, 2);//打印结果System.out.println("mat.dump() = \n" + mat.dump());System.out.println("col.dump() = \n" + colRange.dump());

2.获取矩阵的指定列范围

colRange​(Range r)
参数:
r Range范围的对象,可以使用Range类的构造函数指定范围,例如new Range(0, 2)表示提取第一列到第三列的范围

3.row​(int y)

  回一个包含矩阵的第y行数据的新的Mat对象。这个新的Mat对象将会是一个单行矩阵,其中包含了矩阵的第y行的所有元素。

4.rowRange

  参考colRange

5.diag​

  返回矩阵的对角线元素。
1.diag()

diag()方法用于返回一个包含矩阵对角线元素的列向量。该方法返回的矩阵的行数等于列数
        Mat mat = new Mat(3,3,CvType.CV_8UC1);//设置值mat.put(0,0,1,2,3,4,5,6,7,8,9);Mat diag = mat.diag();System.out.println("diag.dump() = \n" + diag.dump());

2.返回矩阵的对角线元素

diag​(int d)
参数:
d 对角线的索引。当d为正数时,表示获取主对角线元素;当d为负数时,表示获取副对角线元素
        // 创建一个3x3的矩阵Mat mat = new Mat(3, 3, CvType.CV_32F);mat.put(0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);System.out.println("mat.dump(): \n" + mat.dump());// 获取主对角线元素Mat diag = mat.diag(0);System.out.println("主对角线元素:");System.out.println(diag.dump());// 获取副对角线元素Mat subDiag = mat.diag(-1);System.out.println("副对角线元素:");System.out.println(subDiag.dump());

3.diag​(Mat d)

这个函数和上面两个不一样的操作,这个函数用于创建对角矩阵
参数:
d 用于创建对角矩阵的矩阵
        // 创建一个1x3的矩阵Mat d = new Mat(1, 3, CvType.CV_32F);d.put(0, 0, 1);d.put(0, 1, 2);d.put(0, 2, 3);System.out.println("d.dump() :\n " + d.dump());// 创建对角矩阵Mat diagMatrix = Mat.diag(d);// 输出对角矩阵System.out.println(diagMatrix.dump());

6.submat

  返回当前矩阵的子矩阵.只列举部分
1.

submat​(Range rowRange, Range colRange)
参数:
rowRange 子矩阵在行上的范围
colRange 子矩阵在列上的范围
submat​(Rect roi)
参数:
roi 用于指定子矩阵的区域。Rect对象包含四个整数值,分别表示矩形的左上角坐标(x,y)和矩形的宽度和高度(width,height)
       Mat mat = new Mat(3,3,CvType.CV_8UC1);//设置值mat.put(0,0,1,2,3,4,5,6,7,8,9);Mat submat = mat.submat(new Rect(0, 0, 2, 2));System.out.println("submat.dump()= \n" + submat.dump());

四、🌳感兴趣区域

1.adjustROI

  调整当前矩阵的感兴趣区域(Region of Interest,ROI),这个方法允许扩大或缩小矩阵的边界。

adjustROI​(int dtop, int dbottom, int dleft, int dright)
参数:
dtop 上边界的调整量。正数表示增加,负数表示减少
dbottom 下边界的调整量。正数表示增加,负数表示减少
dleft 左边界的调整量。正数表示增加,负数表示减少
dright 右边界的调整量。正数表示增加,负数表示减少
        Mat mat=Mat.eye(5,5, CvType.CV_8UC1);System.out.println("mat:\n"+ mat.dump());// 调整 ROI,移除左右边界的 1 像素,并移除上下的 1 像素Mat roiAdjusted = mat.adjustROI(-1, -1, -1, -1);System.out.println("roiAdjusted:\n"+roiAdjusted.dump());

2.locateROI​

  获取感兴趣区域在整个图像中的位置和偏移量。(通过子矩阵重建原始矩阵的大小以及提取的子矩阵在原始矩阵中的位置

通过调用该方法,可以获取感兴趣区域的位置和偏移量信息,以便在需要时可以将其与其他图像进行对齐或合并等操作。

代码参考:https://docs.opencv.org/4.8.0/d3/d63/classcv_1_1Mat.html#a4b22e1c23af7a7f2eef8fa478cfa7434
在这里插入图片描述

locateROI​(Size wholeSize, Point ofs)
参数:
wholeSize 表示整个图像的大小,即包含感兴趣区域的完整图像的尺寸
ofs 表示感兴趣区域在整个图像中的偏移量,即感兴趣区域的左上角在整个图像中的坐标
        Mat A = Mat.eye(10, 10, CvType.CV_32S);Mat B = A.submat(new Range(0, A.rows()), new Range(1, 3));Mat C = B.submat(new Range(5, 9), new Range(0, B.cols()));Size size = new Size();Point ofs = new Point();C.locateROI(size, ofs);System.out.println("Size: " + size);System.out.println("Offset: " + ofs);

扩展:为了能直观的理解这个函数的作用,我这里整了个示例。这些函数作用目前不必追究,后面的章节中会说到。(自己本地找个图片替换执行下即可看到效果

//读取图片Mat imread = Imgcodecs.imread("C:\\Users\\admin\\Pictures\\Camera Roll\\generalized_hough_gui.jpg");//获取部分矩阵Mat submat = imread.submat(new Range(100, 300), new Range(100, 300));//定位//在原图中的偏移量Point point = new Point();submat.locateROI(imread.size(),point);//输出偏移量System.out.println("point = " + point);//绘制在原图中的位置Imgproc.rectangle(imread,new Rect((int) point.x, (int) point.y,submat.width(),submat.height()),new Scalar(255,0,0));//显示HighGui.imshow("submat",submat);HighGui.imshow("imread",imread);HighGui.waitKey();

五、其它函数

  请自行验证下方函数,部分函数就不代码举例了

1.isSubmatrix()

  检查当前矩阵是否是另一个矩阵的子矩阵

2.channels()

  返回图像的通道数

3.checkVector

   检查矩阵是否是一个合法的向量
在这里插入图片描述
我们以 checkVector​(int elemChannels, int depth, boolean requireContinuous)为例说明下。

checkVector​(int elemChannels, int depth, boolean requireContinuous)
参数:
elemChannels 向量元素的通道数
depth 向量元素的深度
requireContinuous 是否要求向量是连续的
如果矩阵是一个合法的向量,则返回向量的长度;否则返回-1

public class CheckVectorExample {static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}public static void main(String[] args) {// 创建一个3行1列的矩阵,表示一个向量Mat vector = new Mat(3, 1, CvType.CV_8UC1);// 检查向量是否合法int vectorLength = vector.checkVector(1, CvType.CV_8U, false);if (vectorLength != -1) {System.out.println("向量长度为:" + vectorLength);} else {System.out.println("矩阵不是一个合法的向量");}}
}

4.cols()

  返回矩阵的列数(宽度)

5.dataAddr()

  获取Mat对象的数据存储地址

6.depth()

  返回图像的像素深度。像素深度是指图像中每个像素的位数,表示每个像素可以存储的颜色信息的数量。常见的像素深度有8位(灰度图像)、24位(彩色图像)等。

7.dims()

  返回矩阵的维度数。

8.dump()

  将Mat对象的内容以字符串的形式输出

9.elemSize()

  返回每个元素(像素)的大小。返回值取决于矩阵的数据类型。例如,对于一个8位无符号整数的矩阵,每个元素的大小为1字节;对于一个32位浮点数的矩阵,每个元素的大小为4字节。

10.elemSize1()

  这个方法返回的是每个元素的字节数。和elemSize()有点类似。通过下方示例可以看出两者的具体区别。

        Mat mat = new Mat(5,5,CvType.CV_8UC2);System.out.println("mat.elemSize() = " + mat.elemSize());System.out.println("mat.elemSize1() = " + mat.elemSize1());

请自行验证,试着改变下数据类型

11. empty()

  检查Mat对象是否为空

12.finalize()

  释放资源

13.getNativeObjAddr()

  获取Mat对象的数据存储地址

14.height()

  获取矩阵的高度(行数)

15. isContinuous()

  用于检查矩阵是否是连续的

16.release()

  释放Mat对象所占用的内存空间

17.rows()

  返回矩阵的行数(高度)

18.size()

  获取Mat对象的尺寸大小

19. size​(int i)

  返回Mat对象在指定维度上的大小。

i 表示维度的索引,0表示行数,1表示列数。例如,如果Mat对象是一个3行4列的矩阵,那么调用size(0)将返回3,调用size(1)将返回4

20.step1()

  返回矩阵的步长(step)。步长是指在内存中,从一个元素到下一个元素的字节数

21.step1​(int i)

  返回矩阵指定维度上的步长(step)

i 表示维度的索引,0表示行数,1表示列数。

22.total()

  返回矩阵的总元素数量

23.type()

  获取图像的类型值。它表示图像的通道数和数据类型。

类型值由四个部分组成:CV_类型前缀、通道数、深度和符号位。
  CV_类型前缀指示了数据类型,例如CV_8U表示8位无符号整数,CV_32F表示32位浮点数。
  通道数表示图像的通道数,例如灰度图像只有一个通道,彩色图像有三个通道(BGR)。
  深度表示每个像素的位数,例如8位深度表示每个像素使用8位来表示。
  符号位表示数据是否有符号,例如无符号整数类型没有符号位。

24.width()

  获取矩阵的宽度(列数)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/294595.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:非比较排序

非比较排序都具有很大的局限性,包括技术排序,基数排序,桶排序等 计数排序 时间复杂度:O(N) 空间复杂度:O(range) 适用范围 数据的范围集中的数组进行排序,不适合数据分散的数组 方法 统计每个数据出现的次数为n 建立一个相同大小的数组,将每个数据都初始化为0 然后遍历…

混合现实(MR)开发工具

混合现实(MR)开发工具是一系列软件和框架,它们使得开发者能够创建和优化能够在虚拟与现实世界之间无缝交互的应用程序。以下是一些在MR领域内广泛使用的开发工具。 1.Microsoft Mixed Reality Toolkit (MRTK) MRTK是一个跨平台的工具包&…

【亚马逊云科技】使用 Vscode Amazon-Q 完成 GUI 界面粉笔脚本开发

前言 亚马逊云科技- Q ,可以快速获得紧迫问题的相关答案,解决问题,生成内容。当与 Q 聊天时,它会提供即时的相关信息和建议,以帮助简化任务、加快决策速度,并帮助激发工作中的创造力和创新。本次我们通过完…

实践笔记-harbor-01搭建(版本:2.9.0)

harbor搭建 1.下载安装包(版本:2.9.0)2.修改配置文件3.安装4.访问harbor5.可能用得上的命令: 环境:centos7 1.下载安装包(版本:2.9.0) 网盘资源:https://pan.baidu.com/s/1fcoJIa4x…

2024年MathorCup数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…

坚持刷题|分发饼干

文章目录 题目思路代码实现实现总结主要步骤时间复杂度 扩展问题 Hello,大家好,我是阿月。坚持刷题,老年痴呆追不上我,今天刷第一个贪心算法:分发饼干 题目 455.分发饼干 思路 要解决这个问题,可以使用…

企业客户信息反馈平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

Java | Leetcode Java题解之第4题寻找两个正序数组的中位数

题目&#xff1a; 题解&#xff1a; class Solution {public double findMedianSortedArrays(int[] A, int[] B) {int m A.length;int n B.length;if (m > n) { return findMedianSortedArrays(B,A); // 保证 m < n}int iMin 0, iMax m;while (iMin < iMax) {int…

Go 源码之互斥锁 Mutex

文章目录 一、总结二、源码&#xff08;一&#xff09;Mutex&#xff08;二&#xff09; Lock&#xff08;三&#xff09;Unlock 三、常见问题有劳各位看官 点赞、关注➕收藏 &#xff0c;你们的支持是我最大的动力&#xff01;&#xff01;&#xff01;接下来会不断更新 golan…

mongodb sharding分片模式的集群数据库,日志治理缺失导致写入数据库报错MongoWriteConcernException的问题总结(上)

一、背景 常见的mongodb集群模式有以下三种&#xff1a; 主从复制&#xff08;Master-Slave&#xff09;模式副本集&#xff08;Replica Set&#xff09;模式分片&#xff08;Sharding&#xff09;模式 公司测试环境搭建的集群采用分片模式&#xff0c;有同事反馈说&#xf…

数学矩阵(详解)

矩阵乘法 知阵乘法是《线性代数》中的基础内容&#xff0c;但在考察数学的算法题中也会出现。 本节我们学习基础的矩阵乘法规则。 每个矩阵会有一个行数和一个列数&#xff0c;只有当相乘的两个矩阵的左矩阵的列数等于右矩阵的行数 时&#xff0c;才能相乘&#xff0c;否则不允…

HCIA复习

OSI --开放式系统互联参考模型 --- 7层参考模型 TCP/IP协议栈道 --- 4层或5层 OSI&#xff1a; 应用层 抽象语言 -->编码 表示层 编码-->二进制 表示层以下都是二进制-----data&#xff08;数据&#xff09; 会话层 提供应用程序的会话地址 上三层为应用…

Go-Gin中优雅的实现参数校验,自定义错误消息提示

问题描述 在参数校验的时候我们一般会基于"github.com/go-playground/validator/v10"这个库给结构体加标签实现校验参数&#xff0c;当参数校验错误的时候&#xff0c;他的提示一般是英文的&#xff0c;怎么自定义参数错误提示呢&#xff1f;跟着我一步步来 注册校…

分析:两种不同的函数模板写法,其中一种为何不行

接上篇&#xff1a; 利用类型&#xff0c;做函数模板的“重载”-CSDN博客 比较两种模板的写法 为什么左边不可行&#xff1a; 注意&#xff0c;左边的写法的第二个模板参数&#xff0c;是默认参数的形式。为何这里采取了默认参数的形式呢&#xff0c;本意是想让编译器来走sfi…

扫地机器人(蓝桥杯)

文章目录 扫地机器人题目描述解题思路二分贪心 扫地机器人 题目描述 小明公司的办公区有一条长长的走廊&#xff0c;由 N 个方格区域组成&#xff0c;如下图所 示。 走廊内部署了 K 台扫地机器人&#xff0c;其中第 i 台在第 Ai 个方格区域中。已知扫地机器人每分钟可以移动…

互联网轻量级框架整合之JavaEE基础I

不得不解释得几个概念 JavaEE SUN公司提出来的企业版Java开发中间件&#xff0c;主要用于企业级互联网系统的框架搭建&#xff0c;同时因为Java语言优质的平台无关性、可移植性、健壮性、支持多线程和安全性等优势&#xff0c;其迅速成为构建企业互联网平台的主流技术&#x…

Oracle EBS AR接口和OM销售订单单价为空数据修复

最近,用户使用客制化Web ADI 批量导入销售订单行功能,把销售订单行的单价更新成空值,直到发运确认以后,财务与客户对帐才发现大量销售订单的单价空,同时我们检查AR接口发现销售订单的单价和金额均为空。 前提条件 采用PAC成本方式具体问题症状 销售订单行的单价为空 Path:…

【检索增强】Retrieval-Augmented Generation for Large Language Models:A Survey

本文简介 1、对最先进水平RAG进行了全面和系统的回顾&#xff0c;通过包括朴素RAG、高级RAG和模块化RAG在内的范式描述了它的演变。这篇综述的背景下&#xff0c;更广泛的范围内的法学硕士研究RAG的景观。 2、确定并讨论了RAG过程中不可或缺的核心技术&#xff0c;特别关注“…

C# WPF编程-Application类(生命周期、程序集资源、本地化)

C# WPF编程-Application类 应用程序的生命周期创建Application对象应用程序的关闭方式应用程序事件 Application类的任务显示初始界面处理命令行参数访问当前Application对象在窗口之间进行交互 程序集资源添加资源检索资源pack URI内容文件 每个运行中的WPF应用程序都由System…

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时&#xff0c;我们假定您已经具备了相应Android应用开发经验&#xff0c;使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…