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

专栏简介

💒个人主页
📰专栏目录

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

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


建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫
🧭文章导航🧭
⬆️ 5.Mat之像素读写
⬇️ 7.Mat之转换、重塑与计算

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.mzph.cn/news/789780.shtml

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

相关文章

小白水平理解面试经典题目1431. Kids With the Greatest Number of Candies【Array类】

1431. 拥有最多糖果的孩子 小白渣翻译 一群孩子手里拿 着不同数目的糖果。你打算额外给每个孩子一些糖果,然后再确定哪些孩子拥有最多的糖果。 给你一个数组 candies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。另给你一个整数 extraCandies &…

vue源码解析——vue如何将template转换为render函数

Vue 将模板(template)转换为渲染函数(render function)是 Vue 编译器的核心功能,它是 Vue 实现响应式和虚拟 DOM 的关键步骤。在 Vue 中,模板(template)是开发者编写的类似 HTML 的代…

HackTheBox-Machines--Wifinetic

文章目录 1 端口扫描2 测试思路3 21端口测试&权限获取4 权限提升方法一方法二: Wifinetic 测试过程 1 端口扫描 nmap -sC -sV 10.129.229.902 测试思路 目标开启了21、22、53端口,并且21端口FTP服务允许匿名登录,所以从21端口开始进行测试…

OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。 原文链接:OpenCV中八种不同的目标追踪算法 目标跟踪作为机器学习的一个重要分支,加之其在日常生活、军事行动中的广泛应用,受到…

STM32F4系列单片机的定时器讲解和计数器,PWM信号输出,PWM信号捕获的实现对电机进行控制和监测功能

1.定时器功能介绍: 在控制领域里面,我们可以用信号输出定时器,进行PWM的控制,从而达到控制电机的目的,通过输入捕获功能可以用来接收外部的数字信号,用于测量脉冲宽度、频率或周期等。在这里给大家介绍下&…

缺省参数

缺省参数 缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实 参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout<<a<<endl; } int main() {Func(); // 没有传…

Rust所有权和Move关键字使用和含义讲解,以及Arc和Mutex使用

Rust 所有权规则 一个值只能被一个变量所拥有&#xff0c;这个变量被称为所有者。 一个值同一时刻只能有一个所有者&#xff0c;也就是说不能有两个变量拥有相同的值。所以对应变量赋值、参数传递、函数返回等行为&#xff0c;旧的所有者会把值的所有权转移给新的所有者&#…

共襄盛举!400+组织携手发布「2024集成光子学路线图」

3月25日&#xff0c;麻省理工学院微光子中心与PhotonDelta基金会联合领导&#xff0c;携手全球400余家科技、学术及工业界组织&#xff0c;共同发布了2024年版集成光子学路线图。 该路线图被称为IPSR-I&#xff08;Integrated Photonics System Roadmap – International&#…

某眼实时票房接口获取

某眼实时票房接口获取 前言解决方案1.找到veri.js2.找到signKey所在位置3.分析它所处的这个函数的内容4.index参数的获取5.signKey参数的获取运行结果关键代码另一种思路票房接口:https://piaofang.maoyan.com/dashboard-ajax https://piaofang.maoyan.com/dashboard 实时票房…

Docker实例

华子目录 docker实例1.为Ubuntu镜像添加ssh服务2.Docker安装mysql docker实例 1.为Ubuntu镜像添加ssh服务 (1)访问https://hub.docker.com&#xff0c;寻找合适的Ubuntu镜像 (2)拉取Ubuntu镜像 [rootserver ~]# docker pull ubuntu:latest latest: Pulling from library/ub…

课程设计项目1.3:双音多频(DTMF)通信设计仿真

01.课程设计内容 02.代码效果图 %参考程序&#xff1a;DTMF信号的产生 kcsj131s.m 差分方程法产生DTMF信号 clear clc fs8000; w2*pi/8000*[941 1336;697 1209;697 1336;697 1477; ...770 1209;770 1336;770 1477;852 1209;852 1336;852 1477];%各信号对应的数字频率 tab[2*co…

iOS开发进阶(十三):脚手架创建iOS项目

文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期&#xff0c;需要搭建项目基本框架&#xff0c;为此离不开辅助工具&#xff0c;即脚手架。当然&#xff0c;IDE也可以实现新建空白项目&#xff0c;但是其新建后的项目结构可能不符合预期设计&#xff0…

权限问题(Windows-System)

方法&#xff1a;用命令来写一个注册表的脚本 &#xff1f;System是最高级用户&#xff0c;但不拥有最高级权限 编写两文档&#xff1a;system.reg 和 remove.reg,代码如下&#xff1a; system.reg&#xff1a; Windows Registry Editor Version 5.00[-HKEY_CLASSES_ROOT\*…

【Qt 学习笔记】认识QtSDK中的重要工具

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 认识QtSDK中的重要工具 文章编号&#xff1a;Qt 学习笔记 / 03 文章目…

图论基础(python蓝桥杯)

图的基本概念 图的种类 怎么存放图呢&#xff1f; 优化 DFS 不是最快/最好的路&#xff0c;但是能找到一条连通的道路。&#xff08;判断两点之间是不是连通的&#xff09; 蓝桥3891 import os import sys sys.setrecursionlimit(100000) # 请在此输入您的代码 n, m map(int,…

什么是工业协议转换软件?

在现代工业自动化领域&#xff0c;随着技术的不断革新和智能化水平的提升&#xff0c;各种工业设备和系统之间的通信变得日益重要。然而&#xff0c;由于历史、技术差异和标准多样化等原因&#xff0c;不同的工业设备和系统往往采用各自独特的通信协议&#xff0c;导致它们之间…

Android Studio 打开Local Changes界面

在编写代码的过程中&#xff0c;经常要回顾本地仓库做了那些修改。打开Local Changes界面&#xff0c;能做到一目了然&#xff0c;不用再去使用git命令查看。 File->Settings->Version control->Commit 把Use non-modal commit interface 选项 取消勾选 即可

如何使用VNC+Cpolar实现Windows电脑公网远程控制Ubuntu系统桌面

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

官宣!一文掌握2024百度CreateAI开发者大会最新议程

4月16日上午9:00&#xff0c;以“创造未来”为主题的2024百度Create AI开发者大会将在深圳国际会展中心&#xff08;宝安&#xff09;开幕。此次大会将是近十年来&#xff0c;粤港澳大湾区规格最高的AI大会&#xff0c;将聚焦炙手可热的AI话题&#xff0c;在大会主论坛、分论坛…

卡尔曼滤波笔记

资料&#xff1a;https://www.zhihu.com/question/47559783/answer/2988744371 https://www.zhihu.com/question/47559783 https://blog.csdn.net/seek97/article/details/120012667 一、基本思想 在对一个状态值进行估计的时候&#xff0c;如果想测量值更准&#xff0c;很自然…