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());
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024HW --->反序列化漏洞!

对于反序列化,这个漏洞也是常用的,不过涉及到的方面非常非常广,比其他漏洞也难很多 于是本篇文章就分成PHP和JAVA的反序列化来讲讲 1.反序列化 想要理解反序列化,首先就要理解序列化 序列化:把对象转换为字节序列的过…

Redis -- 缓存雪崩问题

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 可能原因 : 同一时间大量的key到期 ; 解决方案: 给不同的Key的TTL添加随机值 利用Redis集群提高服务的可用性 给缓存业务添加降…

【C++】哈希思想的应用(位图、布隆过滤器)及海量数据处理方法

文章目录 前言位图什么是位图简单实现一个自己的位图位图的应用场景 布隆过滤器位图的缺陷及布隆过滤器的提出布隆过滤器的概念简单实现一个自己的布隆过滤器布隆过滤器的优缺点布隆过滤器的应用场景 海量数据处理 前言 哈希思想的在实际中的应用除了哈希表这个数据结构之外还…

分享一个知识 -- bean的静态属性不会被封装返回

public class TeacherChartDataVo {private String name;// bateacherNameprivate List<Integer> data;private static String type "line";private static String stack "Total"; }比如&#xff1a;type 和stack 不会被返回。

LangChain Demo | 如何调用stackoverflow并结合ReAct回答代码相关问题

背景 楼主决定提升与LLM交互的质量&#xff0c;之前是直接prompt->answer的范式&#xff0c;现在我希望能用上ReAct策略和能够检索StackOverflow&#xff0c;让同一款LLM发挥出更大的作用。 难点 1. 怎样调用StackOverflow step1 pip install stackspi step 2 from la…

RuoYi-Cloud下载与运行

一、源码下载 若依官网:RuoYi 若依官方网站 鼠标放到"源码地址"上,点击"RuoYi-Cloud 微服务版"。 跳转至Gitee页面,点击"克隆/下载",复制HTTPS链接即可。 源码地址为:https://gitee.com/y_project/RuoYi-Cloud.git 点击复制 打开IDEA,选…

计算机视觉之三维重建(7)---多视图几何(下)

文章目录 一、透视结构恢复问题1.1 概述1.2 透视结构恢复歧义1.3 代数方法1.4 捆绑调整 二、P3P问题三、随机采样一致性 一、透视结构恢复问题 1.1 概述 1. 透视结构恢复问题&#xff1a;摄像机为透视相机&#xff0c;内外参数均未知。 2. 问题&#xff1a;已知 n n n 个三维…

java 线程池实现方式

线程和数据库连接这些资源都是非常宝贵的资源。那么每次需要的时候创建&#xff0c;不需要的时候销 毁&#xff0c;是非常浪费资源的。那么我们就可以使用缓存的策略&#xff0c;也就是使用线程池。 newCachedThreadPool 创建一个可根据需要创建新线程的线程池&#xff0c;但…

基于单片机的有害气体检查系统设计

**单片机设计介绍&#xff0c;基于单片机的有害气体检查系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的有害气体检查系统设计旨在实现对环境中各种有害气体的实时监测与报警&#xff0c;保障人员健康和环境…

什么是原生IP?原生IP的作用是什么?

原生IP&#xff08;Native IP&#xff09;是指直接从互联网服务提供商&#xff08;ISP&#xff09;获得的IP地址&#xff0c;而非通过代理服务器、VPN或其他中间层方式获取。这种IP地址直接与用户的设备或网络关联&#xff0c;无需经过任何中间服务器或代理的转发或隐藏&#x…

物联网实战--驱动篇之(一)EEPROM存储器(AT24C64)

目录 一、驱动概述 二、AT24C64简介 三、驱动编写 四、驱动应用 一、驱动概述 这是驱动篇的第一篇&#xff0c;所以先说明下驱动篇的作用和书写计划。之前的净化器项目已有提及&#xff0c;向ESP8266、SHT30这些都属于驱动设备&#xff0c;主芯片STM32是核心&#xff0c;相…

C++入门4.引用

目录 1.引用概念&#xff1a; 2.引用特性&#xff1a; 3.常引用&#xff1a; 4.使用场景&#xff1a; 引用和指针的区别&#xff1a; 1.引用概念&#xff1a; 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空…

BLE协议—HID

BLE协议—HID HID设备HOGP&#xff08;HID Over GATT Profile&#xff09;HID服务HID infoHID ModeHID ReportHID MAP HID设备 HID&#xff08;Human Interface Device&#xff0c;人机接口设备&#xff09;是USB设备中常用的设备类型&#xff0c;是直接与人交互的USB设备&…

谷歌AI搜寻背后的资本战:收费传言引爆行业震荡|TodayAI

考虑对其AI驱动的搜索工具收费&#xff0c;这一消息在某种程度上让人感到惊讶。毕竟&#xff0c;谷歌超过一半的总收入来自搜索业务&#xff0c;几乎是其次大收入来源的五倍。YouTube订阅、Pixel手机、Play商店佣金以及Gmail存储空间的收入加起来&#xff0c;与搜索业务的价值相…

机台数据传输共享存在哪些问题?机台数据管控怎么做?

一些金融机构、大型制造业以及晶圆制造厂里面&#xff0c;都会存在大量的机台设备&#xff0c;这些机台会产⽣庞⼤⽽属性不同的数据&#xff0c;这些数据需要定期的进行采集和利用。机台数据在传输分享过程中&#xff0c;会面临各种问题和调整&#xff0c;所以需要做好机台数据…

Java 线程池的基本用法

线程池 池化思想&#xff1a;线程池、数据连接池等&#xff0c;比如我们 Spark 的 Executor 就是典型的线程池&#xff0c;用户在启动 Spark 作业的同时启动线程池&#xff0c;这样 Spark 的 Task 就可以直接获取资源&#xff0c;而不用像 MR 程序那样等待容器上的进程开启了。…

一、持续集成介绍

持续集成介绍 一、什么是持续集成二、持续集成的流程三、持续集成的组成要素四、持续集成的好处 一、什么是持续集成 持续集成&#xff08;CI&#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干。持续集成的目的&#xff0c;就是让产品可…

JavaScript前端学习大全

一、概念 JavaScript简称为JS&#xff0c;这门语言诞生主要用于完成页面的数据验证&#xff0c;因此运行在客户端&#xff0c;需要浏览器来解析JavaScript的代码。是世界上最流行的脚本语言。JavaScript 是一种让网页变得有趣和动态的编程语言。比如&#xff0c;当你在网页上点…

学习【RabbitMQ入门】这一篇就够了

目录 1. RabbitMQ入门1-1. 同步调用1-2. 异步调用1-3. MQ技术选型1-4. RabbitMQ介绍消息模式 1-5. SpringAMQPBasic QueueWork QueueFanout ExchangeDirect ExchangeTopic Exchange消息转换器 1. RabbitMQ入门 1-1. 同步调用 优势&#xff1a; 时效性强&#xff0c;等待到结…

当前2024阿里云服务器哪个地域价格比较优惠,哪个地域便宜?

目前2024年阿里云服务器地域对比哪个价格更优惠&#xff1f;华北6&#xff08;乌兰察布&#xff09;、华北3&#xff08;张家口&#xff09;、华北1&#xff08;青岛&#xff09;和华南2&#xff08;河源&#xff09;地域更便宜&#xff0c;云服务器吧yunfuwuqiba.com整理阿里云…