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

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

相关文章

openEuler 22.03 SP3 安装图像桌面 UKUI

UKUI 是麒麟软件团队历经多年打造的一款 Linux 桌面,主要基于 GTK 和 QT 开发。与其他 UI 界面相比,UKUI 更加注重易用性和敏捷度,各元件相依性小,可以不依赖其他套件而独自运行,给用户带来亲切和高效的使用体验。 UK…

day2 | 数组 part-2 | 977 有序数组的平方、209 长度最小的子数组、59 螺旋矩阵 II

今日任务 977 有序数组的平方 (题目: . - 力扣(LeetCode))209 长度最小的子数组 (题目: ​​​​​​​. - 力扣(LeetCode))59 螺旋矩阵 II (题目:. - 力扣(LeetCode)) 有序数组的平方 (双指针) 给你一个…

如何使用 Viggle AI 生成模特动作视频

Viggle AI 是一款基于骨骼动画的 AI 工具,可以将图片转换为流畅且一致的角色动画。 这意味着您可以上传一张模特全身照,然后指定该模特要执行的动作,Viggle AI 会自动生成一段由该模特执行该动作的视频。 步骤 1:准备工作 首先&…

基于VUE实现的餐厅经营游戏项目源码

WebMOOC 餐厅游戏 项目介绍 实现了一个类游戏的餐厅经营模拟,涉及的前端知识有移动端 HTML 页面布局及样式实现。实现了厨师、顾客等角色的关键操作,完成从顾客等位、点菜、烹饪、用餐、支付的一系列状态变更的数据、信息、交互、展现的变化及处理。 …

【Redis系列】Spring Boot 集成 Redis 实现缓存功能

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

c# wpf template itemtemplate+dataGrid

1.概要 2.代码 <Window x:Class"WpfApp2.Window8"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend…

SpringCloudAlibabaSeate处理分布式事务

SpringCloudAlibabaSeate处理分布式事务 1、部分面试题 微服务boot/cloud做的项目&#xff0c;你不可能只有一个数据库吧&#xff1f;那么多个数据库之间如何处理分布式事务的&#xff1f; 一个场景&#xff1a;在订单支付成功后&#xff0c;交易中心会调用订单中心的服务把订…

导入项目运行后,报错java: Cannot find JDK ‘XX‘ for module ‘XX‘

解决方案&#xff1a; 1、删除.idea和.iml文件 2、右击此module&#xff0c;点击 Open Module Settings 在 Module SDK 中选择所安装的java版本后&#xff0c;点击右下角 Apply 3、再运行试试吧&#xff0c;成功&#xff01;

蓝桥杯(4):python动态规划DF[1]

动态规划相当于正着想&#xff1f;dfs主要适用于位置的变化&#xff1f; 子问题&#xff01;状态&#xff0c;状态转移方程 1 一维DP 1.1 定义 重叠子问题&#xff01;转换成子问题 &#xff0c;与记忆化搜索很像 1.2 例子 1.2.1 上楼梯 子问题到最终的问题只能跨一步&…

用顺序表实现通讯录

前言 这次的通讯录是基于上一篇的动态顺序表的基础上实现的&#xff0c;如果对动态顺序表不熟悉&#xff0c;可以打开这个链接阅读http://t.csdnimg.cn/9zJ5g&#xff0c;这里我们会调用动态顺序表的函数。 如果想看静态顺序表实现通讯录&#xff0c;可以打开这个链接阅读http:…

Linux+HA高可用24X7的安全保证

一&#xff0e; 介绍作为服务器&#xff0c;需要提供一定的24X7的安全保证&#xff0c;这样可以防止关键节点的宕机引起系统的全面崩溃。利用OpenSource开源软件&#xff0c;完成系统的高可靠双机热备方案。基于linux的 HA软件可靠稳定&#xff0c;比使用商业版本的HA软件降低成…

CMakeLists.txt编写简单介绍:CMakeLists.txt同时编译.cpp和.cu

关于CMakeLists.txt的相关介绍,这里不赘诉,本人的出发点是借助于CMakeLists.txt掌握基本的C++构建项目流程,下面是本人根据网络资料以及个人实践掌握的资料。 CMakeList.txt构建C++项目 下图是一个使用CUDA实现hello world的项目,一般来说,一个标准的C++项目包括三个文件…

python标准数据类型--列表常用方法

在Python中&#xff0c;列表&#xff08;List&#xff09;是一种非常常用的数据类型&#xff0c;用于存储一组有序的元素。Python提供了许多内置方法来操作列表&#xff0c;使得对列表的处理变得非常灵活和便捷。在本篇博客中&#xff0c;我们将介绍一些常用的列表方法&#xf…

基本数据类型、包装类与字符串间的转换

&#xff08;1&#xff09;基本数据类型转为字符串 方式1&#xff1a;调用字符串重载的valueOf()方法 int a 10; //String str a;//错误的String str String.valueOf(a);方式2&#xff1a;更直接的方式 int a 10;String str a "";&#xff08;2&#xff09;…

COCO格式转YOLO格式训练

之前就转换过好几次&#xff0c;每次换设备训练&#xff0c;由于压缩包太大&#xff0c;u盘不够用。每次都要找教程从网上再下载一遍。因此这里记录一下&#xff0c;以免下次重新找教程。 在coco数据集中&#xff0c;coco2017train或coco2017val数据集中标注的目标(类别)位置在…

C++--对象作为返回值-----拷贝构造函数不执行的问题解决方案

1.问题现象 本来func函数返回p1&#xff0c;实际上p1会先拷贝一份传递给test函数里面的p,这个时候会执行拷贝构造函数&#xff0c;但是实际上的输出并没有&#xff1b; 而且执行拷贝构造函数的时候&#xff0c;因为生成p1的副本&#xff0c;所以我们打印的地址应该不相同&…

vue3源码解析——watch和watchEffect区别

watch和watchEffect是Vue 3.0中新增的两个响应式API&#xff0c;用于监听数据的变化。watch适用于需要获取新值和旧值&#xff0c;或者需要懒执行的场景&#xff0c;而watchEffect适用于需要监听多个数据源&#xff0c;并且需要立即执行的场景。它们之间的区别如下&#xff1a;…

CSS层叠样式表学习(文本属性)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS文本属性的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 四、CSS文本属性 4.1 文本颜色 4.2 对齐文本 4.3 装饰文本 4.4 文本缩进 4.5 行间距 4.6 文本…

苍穹外卖学习笔记(一)开发环境搭建

苍穹外卖技术框架 网关层&#xff1a; Nginx:反向代理负载均衡 nginx学习&#xff0c;看这一篇就够了&#xff1a;下载、安装。使用&#xff1a;正向代理、反向代理、负载均衡。常用命令和配置文件,很全-CSDN博客应用层&#xff1a; Spring Boot&#xff1a;简化spring程序的创…

计算机内存是如何管理的

计算内存的那些事儿——内存管理 大家回忆一下&#xff0c;计算机结构&#xff0c;或者说一个SoC&#xff08;system-on-chip&#xff09;芯片的结构。 cpu、memory、peripherals&#xff0c;这是计算机的主要部件&#xff0c;三者之间通过system bus勾搭在一起。 The main co…