7.java openCV4.x 入门-Mat之转换、重塑与计算

专栏简介

💒个人主页
📰专栏目录

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

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


建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫
🧭文章导航🧭
⬆️ 6.Mat之局部区域读写及Range和Rect介绍
⬇️ 8.Mat之多维元组(Tuple)

Mat之转换与算法

  • 一、转换
    • 1.类型转换
      • convertTo​
    • 2.对象转换(转置矩阵)
      • t()
  • 二、 重塑
    • reshape​
  • 三、计算
    • 1.乘积
      • 1.矩阵的乘积
        • 1.matMul​(Mat m)
      • 2.逐元素乘积
        • 1.mul
    • 2.叉积
      • cross​(Mat m)
    • 3.点积(点乘运算)
      • dot​(Mat m)
    • 4.逆矩阵(求逆运算)
      • inv​(int method)

  

一、转换

1.类型转换

convertTo​

   该方法用于将输入的Mat对象转换为指定的数据类型,并进行缩放和平移操作。

convertTo​(Mat m, int rtype, double alpha, double beta)
参数:
m 输入的矩阵对象
rtype 转换后的Mat对象的数据类型。可以使用 CV_8U、 CV_8S、 CV_16U、 CV_16S、 CV_32F、 CV_64F等
alpha 像素值的缩放因子
beta 像素值的偏移量
        //转换 类型转化 -用于转换数据类型Mat mat = new Mat(3,3,CvType.CV_8UC1);mat.put(0,0,1,2,3,4,0,6,7,8,9);Mat convertToMat = new Mat();mat.convertTo(convertToMat,CvType.CV_16F,1,-1 );System.out.println("mat = " + mat);System.out.println("convertToMat = \n" + convertToMat);System.out.println("mat.dump() = \n" + mat.dump());System.out.println("convertToMat.dump() = \n" + convertToMat.dump());

   请自行验证结果,具体来说,该方法会将输入的Mat对象m转换为指定的数据类型rtype,并应用线性变换,即将每个像素值乘以alpha并加上beta。最后,结果将存储在原始的Mat对象m中。(ps:通过它可以调节图像的亮度,产生一个曝光的效果)

2.对象转换(转置矩阵)

t()

  转置矩阵是将原矩阵的行和列互换得到的新矩阵。这个方法返回一个新的Mat对象,其中包含原始矩阵的转置矩阵数据。转置矩阵的行数等于原矩阵的列数,列数等于原矩阵的行数。

        Mat mat = new Mat(3,3,CvType.CV_8UC1);mat.put(0,0,1,2,3,4,5,6,7,8,9);Mat t = mat.t();System.out.println("mat.dump() = \n" + mat.dump());System.out.println("t.dump() = \n" + t.dump());

二、 重塑

reshape​

  该方法的作用是将矩阵重塑为具有指定通道数的新矩阵。重塑后的矩阵将具有相同的总元素数,但通道数将改变
这个方法在处理图像时非常有用,可以用于改变图像的通道数,例如将RGB图像转换为灰度图像。
  部分方法就不代码举例了,请自行验证
1.指定通道数

reshape​(int cn)
参数:
cn通道数

2.指定通道数和行数

reshape​(int cn, int rows)
参数:
cn通道数
rows 新矩阵的行数
3.指定通道数和行数、列数
reshape​(int cn, int[] newshape)
参数:
cn 通道数
rtype 一个整数数组,指定重塑后的矩阵的行数和列数
        Mat mat = new Mat(3,3,CvType.CV_8UC2);System.out.println("mat.() = " + mat.size());mat.put(0,0,1,2,3,4,5,6,7,8);System.out.println("mat.dump() = \n" + mat.dump());int [] newshap={2,3};Mat reshape = mat.reshape(3,newshap);System.out.println("reshape = " + reshape);System.out.println("reshape.dump() = \n" + reshape.dump());

三、计算

1.乘积

1.矩阵的乘积

1.matMul​(Mat m)

  计算两个矩阵的乘积

matMul​(Mat m)
参数:
m 另一个Mat对象,表示要与当前矩阵进行乘法运算的矩阵

2.逐元素乘积

1.mul

  执行逐元素的乘法运算
在这里插入图片描述

mul​(Mat m, double scale)
参数:
m 另一个Mat对象,表示要与当前矩阵进行乘法运算的矩阵
scale可选的缩放因子,用于在乘法运算后缩放结果矩阵。默认值为 1.0,表示不进行缩放
public static void main(String[] args) {//创建3X3矩阵Mat mat1=new Mat(new Size(3,3), CvType.CV_32FC1);mat1.put(0,0,1,2,3,4,5,6,7,8,9);Mat mat2= new Mat();//赋值矩阵mat1.copyTo(mat2);System.out.println("mat1.dump() :\n" + mat1.dump());System.out.println("mat2.dump() :\n " + mat2.dump());Mat mat = mat1.mul(mat2,2);System.out.println("mat.dump() :\n " + mat.dump());}

2.叉积

cross​(Mat m)

  cross 方法用于计算两个 3x1 或者 1x3 向量矩阵的叉积(Cross Product)。这个方法接受一个 Mat 对象作为参数,并返回一个新的 Mat 对象,表示计算得到的叉积结果。
叉积在二维空间中是一个向量运算,但在 OpenCV 中,这个方法用于计算两个三维向量矩阵的叉积。在三维空间中,叉积可以用来表示旋转和方向。
cross 方法要求输入矩阵的尺寸必须为 3x1

3.点积(点乘运算)

dot​(Mat m)

  计算两个矩阵的点积(内积),返回结果为一个标量值

public static void main(String[] args) {// 创建两个矩阵Mat mat1 = new Mat(3, 3, CvType.CV_32F);mat1.put(0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);Mat mat2 = new Mat(3, 3, CvType.CV_32F);mat2.put(0, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1);// 计算两个矩阵的点积double result = mat1.dot(mat2);// 打印结果System.out.println("mat1.dump() :\n " + mat1.dump());System.out.println("mat2.dump() :\n" + mat2.dump());System.out.println("Dot product: " + result);}

4.逆矩阵(求逆运算)

inv​(int method)

  设A是一个n阶矩阵,若存在另一个n阶矩阵B,使得: AB=BA=E ,则称方阵A可逆,并称方阵B是A的逆矩阵。更多内容请查看 百度学科。
  逆矩阵的作用是可以用来解决线性方程组、求解特征值、特征向量、矩阵的对角化等问题。通过计算矩阵的逆矩阵,我们可以求解线性方程组Ax=b的解,其中b是一个列向量,x是未知向量,A是系数矩阵。具体地,如果A是可逆的,则方程组有唯一解x=A^-1b。
仅列举其中一个方法进行说明

Mat inv​(int method)
参数:
method计算方法,可以是以下值之一:
Core.DECOMP_LU:使用 LU 分解法计算逆矩阵。(默认方法)
Core.DECOMP_SVD:使用奇异值分解法计算逆矩阵.
更多查看:Core.DECOMP_

该方法仅支持CV_64F和CV_32F类型


import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;/*** @author lvyq* @version 1.0* Create by 2023-12-31 9:05*/
public class InvExample {static {String libraryPath = System.getProperty("user.dir") + "\\lib\\opencv_java460.dll";System.load(libraryPath);}public static void main(String[] args) {// 创建矩阵Mat mat = new Mat(3, 3, CvType.CV_32FC1);//矩阵赋值mat.put(0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);//计算矩阵的逆矩阵Mat inv = mat.inv(Core.DECOMP_SVD);System.out.println("mat.dump() :\n " + mat.dump());System.out.println("inv.dump() :\n " + inv.dump());}
}

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

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

相关文章

全国土壤类型分布数据/土壤有机质/土壤含水量分布/土壤温度/土壤质地/土壤PH

数据下载链接:数据下载链接 引言 土壤是指地球表面的一层疏松的物质,由各种颗粒状矿物质、有机物质、水分、空气、微生物等组成, 能生长植物。土壤是一个国家最重要的自然资源,它是农业发展的物质基础。我国幅员辽阔,自…

SD-WAN组网面临的安全挑战?如何提供有效的安全措施

SD-WAN(软件定义广域网)技术的广泛应用,企业面临着越来越多的网络安全挑战。尽管SD-WAN带来了灵活性和效率的提升,但其开放性和基于云的特性也带来了一系列安全威胁。本文将探讨SD-WAN组网面临的安全挑战,并提供一些有…

0201基础集成与使用-微信支付-支付模块-项目实战

文章目录 一、前言二、springboot集成2.1 配置信息与配置类2.2 微信相关枚举信息2.3 工具类2.4 业务接口 三、演示-支付与退款结语 一、前言 下面我以微信支付v3为例,通过spirngboot集成到我们的项目中,不依赖其他第三方框架。当然适用简单项目&#xf…

Linux多进程通信(4)——消息队列从入门到实战!

Linux多进程通信总结——进程间通信看这一篇足够啦! 1.基本介绍 1)消息队列的本质其实是一个内核提供的链表,内核基于这个链表,实现了一个数据结构,向消息队列中写数据,实际上是向这个数据结构中插入一个…

Vue项目登录页实现获取短信验证码的功能

之前我们写过不需要调后端接口就获取验证码的方法,具体看《无需后端接口,用原生js轻松实现验证码》这个文章。现在我们管理后台有个需求,就是登录页面需要获取验证码,用户可以输入验证码后进行登录。效果如下,当我点击获取验证码后能获取短信验证码: 这里在用户点击获取…

win11安装WSL UbuntuTLS

win11安装WSL WSL 简介WSL 1 VS WSL 2先决要求安装方法一键安装通过「控制面板」安装 WSL 基本命令Linux发行版安装Ubuntu初始化相关设置root用户密码网络工具安装安装1panel面板指导 WSl可视化工具问题总结WSL更新命令错误Ubuntu 启动初始化错误未解决问题 WSL 简介 Windows …

Sybase ASE中的char(N)的坑以及与PostgreSQL的对比

1背景 昨天,一朋友向我咨询Sybase ASE中定长字符串类型的行为,说他们的客户反映,同样的char类型的数据,通过jdbc来查,Sybase库不会带空格,而PostgreSQL会带。是不是这样的?他是PostgreSQL的专业大拿,但因为他手头没有现成的Sybase ASE环境,刚好我手上有,便于一试。 …

hive 慢sql 查询

hive 慢sql 查询 查找 hive 执行日志存储路径(一般是 hive-audit.log ) 比如:/var/log/Bigdata/audit/hive/hiveserver/hive-audit.log 解析日志 获取 执行时间 执行 OperationId 执行人 UserNameroot 执行sql 数据分隔符为 \001 并写入 hiv…

vuepress-theme-hope 添加谷歌统计代码

最近做了个网站,从 cloudflare 来看访问量,过去 30 天访问量竟然有 1.32k 给我整懵逼了,我寻思不应该呀,毕竟这个网站内容还在慢慢补充中,也没告诉别人,怎么就这么多访问?搜索了下, cloudflare 还会把爬虫的请求也就算进来,所以数据相对来说就不是很准确 想到了把 Google An…

如何同时安全高效管理多个谷歌账号?

您的业务活动需要多个 Gmail 帐户吗?出海畅游,Gmail账号是少不了的工具之一,可以关联到Twitter、Facebook、Youtube、Chatgpt等等平台,可以说是海外网络的“万能锁”。但是大家都知道,以上这些平台注册多账号如果产生关…

Cisco交换机安全配置

Cisco交换机安全配置 前提 我们以下命令一般都要先进入Config模式 S1> enable S1# conf t S1(config)#端口安全保护 禁用未使用的端口 以关闭fa0/1到fa0/24的端口为例 S1(config)# interface range fa0/1-24 S1(config-if-range)# shutdown缓解MAC地址表攻击 防止CAM…

蓝桥杯刷题第六天(昨天忘记发了)

今天想从不一样的角度来解题:从时间紧张暴力求解到思路阔达直接通过所有案例 暴力方法: 思路第一眼看到这个问题我就想到了第一个思路就是先用两个数组一个存石子数一个存颜色状态,每次遍历一遍看看有没有相邻石子颜色一样且为和最小的。 im…

前端订阅后端推送WebSocket定时任务

0.需求 后端定时向前端看板推送数据,每10秒或者30秒推送一次。 1.前言知识 HTTP协议是一个应用层协议,它的特点是无状态、无连接和单向的。在HTTP协议中,客户端发起请求,服务器则对请求进行响应。这种请求-响应的模式意味着服务器…

Spring-IoC 基于注解

基于xml方法见:http://t.csdnimg.cn/dir8j 注解是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理,简化 Spring的 XML配置。 格式:注解(属性1"属性值1",...) 可以加在类上…

纯C代码模板

一、快排 void QuickSort(int *a,int left,int right){if(left>right) return;else{int low left,high right;int pivot a[low];while(low<high){while(a[high] > pivot && low < high){high--;}a[low] a[high]; //必须先动a[low]while(a[low] < …

工厂方法模式与抽象工厂模式的深度对比

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自&#xff1a;设计模式深度解析&#xff1a;工厂方法模式与抽象工厂模式的深…

intellij idea 使用git撤销(取消)commit

git撤销(取消) 未 push的 commit Git&#xff0c;选择分支后&#xff0c;右键 Undo Commit &#xff0c;会把这个 commit 撤销。 git撤销(取消) 已经 push 的 commit 备份分支内容&#xff1a; 选中分支&#xff0c; 新建 分支&#xff0c;避免后续因为操作不当&#xff0c;导…

Spring重点知识(个人整理笔记)

目录 1. 为什么要使用 spring&#xff1f; 2. 解释一下什么是 Aop&#xff1f; 3. AOP有哪些实现方式&#xff1f; 4. Spring AOP的实现原理 5. JDK动态代理和CGLIB动态代理的区别&#xff1f; 6. 解释一下什么是 ioc&#xff1f; 7. spring 有哪些主要模块&#xff1f;…

layui框架实战案例(26):layui-carousel轮播组件添加多个Echarts图标的效果

在Layui中&#xff0c;使用layui-carousel轮播组件嵌套Echarts图表来实现多个图表的展示。 css层叠样式表 调整轮播图背景色为白色&#xff1b;调整当个Echarts图表显示loading…状态&#xff1b;同一个DIV轮播项目添加多个Echarts的 .layui-carousel {background-color: #f…

前端路径问题总结

1.相对路径 不以/开头 以当前资源的所在路径为出发点去找目标资源 语法: ./表示当前资源的路径 ../表示当前资源的上一层路径 缺点:不同位置,相对路径写法不同2.绝对路径 以固定的路径作为出发点作为目标资源,和当前资源所在路径没关系 语法:以/开头,不同的项目中,固定的路径…