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.hqwc.cn/news/595521.html

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

相关文章

单一职责原则

1.1 阅读干吗不直接用手机? 电子阅读器比较专注,而手机功能比较多,影响专注。 1.2 手机不纯粹 手机确实很方便。但是现在的手机就是一台小型智能电脑。它不仅能打电话,还能听音乐、看电影电视、与个人交流、与一群人群聊&#…

免费SSL证书申请指南

在互联网时代,HTTPS安全协议已成网站标配,而SSL/TLS证书是实现HTTPS的关键。以下是如何申请免费证书的简明流程: 1.选择证书颁发机构(CA):现今很多知名CA如JoySSL、Lets Encrypt等提供免费SSL证书服务。选定…

LeetCode题练习与总结:插入区间--57

一、题目描述 示例 1: 输入:intervals [[1,3],[6,9]], newInterval [2,5] 输出:[[1,5],[6,9]]示例 2: 输入:intervals [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval [4,8] 输出:[[1,2],[3,10],[…

深度学习-机器视觉part2

深度学习-机器视觉part2 文章目录 深度学习-机器视觉part2一、从卷积到卷积神经网络二、手撕卷积代码2.1 动机2.2 数据集2.3 卷积操作2.3.1 填充(padding)2.3.2 卷积块2.3.3 池化2.3.4 Softmax 2.4 完整CNN2.5 训练改进 三、经典CNN模型介绍四、CNN模型的…

IDEA删除块注释(文档注释)/**

1. 问题缘由 在使用java写LeetCode的时候,有些题会有一些封装好的类,在本地编写代码的时候,如果没有定义好这些类,就会爆红,看着很难受,此时可以把官方定义好的类拿过来,但是这些类是有块注释的…

VM虚拟机部署code-server服务+tailscale内网穿透,实现随处coding

1.Linux下安装code-server Releases coder/code-server (github.com)https://github.com/coder/code-server/releases先去发布页面查看最新的code-server版本,下载命令示例: wget https://github.com/coder/code-server/releases/download/v4.22.1/co…

KeyguardClockSwitch的父类

KeyguardClockSwitch 定义在KeyguardStatusView中, mClockView findViewById(R.id.keyguard_clock_container);KeyguardClockSwitch的父类为: Class Name: LinearLayout Class Name: KeyguardStatusView Class Name: NotificationPanelView Class Name: Notificat…

如何注册midjourney账号

注册Midjourney账号比较简单,准备好上网工具,进入官网 Midjourney访问地址: https://www.midjourney.com/ 目前没有免费使用额度了,会员最低 10 美元/月,一般建议使用30美元/月的订阅方案。了解如何订阅可以查看订阅…

hive的使用(本地数据上传到idea)

1.首先第一步是先启动hive,hive的启动指令如下 nohup hiveserver2 & 2.然后我们进入idea中 这里我们使用的是idea里的Apache Hive的插件,进行配置,等我们跟moba连接好后,就可以进行数据的导入了。 hive的sql和mysql里的sql语…

基于单片机电子硬币储存器的设计

**单片机设计介绍,基于单片机电子硬币储存器的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机电子硬币储存器的设计概要主要涵盖了硬件设计、软件设计、硬币识别、计数与储存等核心功能。以下是对该设…

ddres( ) 组站星双差方程和设计矩阵

1 ddres( )参数介绍 rtklib中进行的单频解算 双差观测值,单差的模糊度 单频点双差 DD (double-differenced) phase/code residuals ------------------------------ x 模糊度 P 方差-协方差阵 sat 共识卫星列表 ns 共识卫星数量 y…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】

随笔:这年头工作不好找咯,大家有学历提升的赶快了,还有外出人多注意身体,没错我在深圳这边阳了,真的绝啊,最尴尬的还给朋友传染了!!! 之前三种的监听情况,监听…