当前位置: 首页 > news >正文

仿射变换 与 透视变换

仿射变换 与 透视变换

几种变换之间的关系


1、缩放 Rescale

1)变换矩阵

  缩放变换矩阵,形为 : S = \begin{bmatrix} s_x & 0 \\ 0 & s_y \\ \end{bmatrix} , 其中: s_xs_y 为 x轴 和 y轴的缩放因子,即 宽高的缩放因子

  图像中的每一个像素点 (x, y),经过矩阵变换(如下公式),会落到的新的位置(s_x \cdot x, \;\; s_y \cdot y)\begin{bmatrix} s_x & 0 \\ 0 & s_y \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ \end{bmatrix} = \begin{bmatrix} s_x \cdot x \\ s_y \cdot y \\ \end{bmatrix}

2)举例

  比如,一张图像尺寸为x_0 \times y_0, 经过变换矩阵 S = \begin{bmatrix} 0.8 & 0 \\ 0 & 0.6 \\ \end{bmatrix}变换之后 :

  • 其右下角点(x_0,y_0),落在新的位置 (0.8x_00.6y_0

  • 图像中的其他点,也会经历同样的变换

  • 对于图像原点 (0, 0),缩放之后,仍为原点 (0, 0)

3)代码演示

  注意: 图像默认的原点位置为图像的左上角点

import cv2
import numpy as npsrc_img = cv2.imread("img.jpg")
height, width = src_img.shape[:2]M = np.eye(2, 3)
M[0, 0] = 0.8
M[1, 1] = 0.6dst_img = cv2.warpAffine(src_img, M, (width, height))cv2.imshow("src_img", src_img)
cv2.imshow("dst_img", dst_img)
cv2.waitKey()
cv2.destroyAllWindows()


2、旋转 Rotation 

1)变换矩阵

  旋转变换矩阵,形为 : R = \begin{bmatrix} cos \theta & -sin \theta \\ sin \theta & cos \theta \\ \end{bmatrix} , 其中: \theta为顺时针旋转角度

  图像中的每一个像素点 (x, y),经过矩阵变换(如下公式),会落到的新的位置 (cos \theta \cdot x - sin \theta \cdot y, \;\; sin \theta \cdot x + cos \theta \cdot y)

  \begin{bmatrix} cos \theta & -sin \theta \\ sin \theta & cos \theta \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ \end{bmatrix} = \begin{bmatrix} cos \theta \cdot x - sin \theta \cdot y\\ sin \theta \cdot x + cos \theta \cdot y\\ \end{bmatrix}

2)举例

  比如,一张图像尺寸为 x_0 \times y_0, 旋转15^{\circ} ,变换矩阵为:R = \begin{bmatrix} cos(\frac{\pi}{12}) & -sin(\frac{\pi}{12}) \\ sin(\frac{\pi}{12}) & cos(\frac{\pi}{12}) \\ \end{bmatrix} , 变换之后 :

  • 其右上角点(x_0, 0),落在新的位置 (cos\frac{\pi}{12} \cdot x_0, \;\; sin\frac{\pi}{12} \cdot x_0)

  • 图像中的其他点,也会经历同样的变换

  • 对于图像原点 (0, 0), 旋转之后,仍为原点 (0, 0)

3)代码演示 

import cv2
import numpy as npsrc_img = cv2.imread("img.jpg")
height, width = src_img.shape[:2]M = np.eye(2, 3)
M[0, 0] = np.cos(np.pi / 12)
M[0, 1] = -np.sin(np.pi / 12)
M[1, 0] = np.sin(np.pi / 12)
M[1, 1] = np.cos(np.pi / 12)dst_img = cv2.warpAffine(src_img, M, (width, height))cv2.imshow("src_img", src_img)
cv2.imshow("dst_img", dst_img)
cv2.waitKey()
cv2.destroyAllWindows()


3、切变 Shear

1)变换矩阵

切变(Shear):切变通过在坐标系中,斜向拉伸对象来改变其形状 ,但不会改变对象的大小或旋转它,也不会改变原点位置。

   切变矩阵如下图所示:

2)举例

  比如,一张图像尺寸为 x_0 \times y_0,沿x轴拉伸15^{\circ},沿y轴不拉伸,则变换矩阵为 S = \begin{bmatrix} 1 & \tan{\frac{\pi}{12}} \\ 0 & 1 \\ \end{bmatrix} ,变换之后 :

  • 其右下角点 (x_0, \ y_0),落在新的位置 (x_0 + y_0\cdot \tan{\frac{\pi}{12}}, \;\; y_0)

  • 图像中的其他点,也会经历同样的变换

  • 对于图像原点 (0, 0), 切变之后,仍为原点 (0, 0)

3)代码演示

import cv2
import numpy as npsrc_img = cv2.imread("img.jpg")
height, width = src_img.shape[:2]M = np.eye(2, 3)
M[0, 1] = np.tan(np.pi / 12)dst_img = cv2.warpAffine(src_img, M, (width, height))cv2.imshow("src_img", src_img)
cv2.imshow("dst_img", dst_img)
cv2.waitKey()
cv2.destroyAllWindows()


总结一 : 线性变换

1、缩放、旋转、切变 都属于线性变换,他们的特点有以下:

  • 变换之前的原点(0, 0),在变换之后,仍为原点(0, 0)

  • 平直性 : 变换之前的直线,在变换之后 仍为直线

  • 平行性:变换之前的平行线,在变换之后,仍为平行线

2、在二维空间内,线性变换(缩放、旋转、切变)都可以通过 2x2 的变换矩阵,来实现相关的变换计算


4、平移 Translation

1)变换矩阵

  之前我们介绍的 缩放、旋转、切变 都可以通过 2x2 的变换矩阵 直接计算得到,而平移则不行。

  平移如果用公式表示的话,如下 :

  \begin{bmatrix} x \\ y \\ \end{bmatrix} + \begin{bmatrix} t_x \\ t_y \\ \end{bmatrix} = \begin{bmatrix} x + t_x\\ y + t_y \\ \end{bmatrix}      或      \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ \end{bmatrix} + \begin{bmatrix} t_x \\ t_y \\ \end{bmatrix} = \begin{bmatrix} x + t_x\\ y + t_y \\ \end{bmatrix}

  齐次坐标 (Homogeneous Coordinates)

由上可知,平移变换 不能通过 2x2 的转换矩阵 直接进行矩阵乘法得到,所以,我们引入了 “齐次坐标 (Homogeneous Coordinates)”。 在二维情况下,齐次坐标通常由三个值表示,即(x,y,w),其中:

  • x 和 y 是普通的笛卡尔坐标

  • w是一个额外的参数,通常设置为 1 。 也可以理解为,增加了一个维度 z,只不过对象(图像)在这个维度上的值恒为1,也就是在 z=1 这个平面上。

  这样,我们就可以将平移变换,写成如下公式表达 :

  \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} = \begin{bmatrix} x + t_x\\ y + t_y \\ \end{bmatrix}

  缩放、旋转、切变 的变换矩阵 也可以拓展为2x3矩阵,比如,旋转变换可以表示为 :

  \begin{bmatrix} cos \theta & -sin \theta & 0\\ sin \theta & cos \theta & 0\\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} = \begin{bmatrix} cos \theta \cdot x - sin \theta \cdot y\\ sin \theta \cdot x + cos \theta \cdot y\\ \end{bmatrix}

2)代码演示

import cv2
import numpy as npsrc_img = cv2.imread("img.jpg")
height, width = src_img.shape[:2]M = np.eye(2, 3)
M[0, 2] = 20
M[1, 2] = 40dst_img = cv2.warpAffine(src_img, M, (width, height))cv2.imshow("src_img", src_img)
cv2.imshow("dst_img", dst_img)
cv2.waitKey()
cv2.destroyAllWindows()


5、仿射变换

1)仿射变换

仿射变换为 缩放、旋转、切变、平移 4种变换的任意组合

  比如,下面就是 “缩放 + 旋转 + 平移” 的组合,因为 缩放、旋转 都是相对于 原点坐标来操作的,为了保证图像增强中,不会出现意外的结果,一般会将 平移操作放在最后, 即 先线性后平移

仿射变换有以下特点:

  • 变换之前的直线,在变换之后 仍为直线

  • 变换之前的平行线,在变换之后,仍为平行线

2)举例

  我们以“缩放 + 旋转 + 平移” 的组合为例,对图像中的点 P = (x, y, 1)^T 进行连续变换:

  • 先做 缩放变换,缩放变换矩阵 记为 S

  • 再做 旋转变换,旋转变换矩阵记为 R

  • 最后做 平移变换,平移变换矩阵记为 T

变换后 P点的新位置为P' ,整体的变换表达公式为 : P' = T \cdot (R \cdot (S\cdot P))

1)为了使 P' = T \cdot (R \cdot (S\cdot P)) 可以矩阵连乘,S、R、T 都要拓展为 3x3 的变换矩阵:

  • S 形为: \begin{bmatrix} a_{11} & 0 & 0\\ 0 & a_{22} & 0\\ 0 & 0 & 1\\ \end{bmatrix}

  • R 形为: \begin{bmatrix} a_{11} & a_{12} & 0\\ a_{21} & a_{22} & 0\\ 0 & 0 & 1\\ \end{bmatrix}

  • T形为: \begin{bmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1\\ \end{bmatrix}

2)因为矩阵乘法满足 乘法结合律 (AB)C=A(BC),所以,上面的变换公式 可写为: P' = T \cdot R \cdot S\cdot P

  我们令 M= T \cdot R \cdot S,即 M 为整体的变换矩阵,P' = M \cdot P

  3)变换矩阵的位置不可更换 (因为矩阵乘法不满足交换律 $AB=BA),变换矩阵的顺序决定着 变换的操作顺序

   尤其是 平移变换,因为 平移变换始终都是最后做,所以,平移变换矩阵的位置始终都在第一个位置

yolov5 中相关代码示例 :(其中 C 表示将坐标原点 从图像左上角点转换到图像中心点)

2)代码演示

import cv2
import numpy as npsrc_img = cv2.imread("img.jpg")
height, width = src_img.shape[:2]# 旋转矩阵
S = np.eye(3, 3)
S[0, 0] = 0.8
S[1, 1] = 0.6# 旋转矩阵
R = np.eye(3, 3)
R[0, 0] = np.cos(np.pi / 12)
R[0, 1] = -np.sin(np.pi / 12)
R[1, 0] = np.sin(np.pi / 12)
R[1, 1] = np.cos(np.pi / 12)# 平移矩阵
T = np.eye(3, 3)
T[0, 2] = 40
T[1, 2] = 20# 仿射变换矩阵
M = T @ R @ S# 操作变换
dst_img = cv2.warpAffine(src_img, M[:2], (width, height))cv2.imshow("src_img", src_img)
cv2.imshow("dst_img", dst_img)
cv2.waitKey()
cv2.destroyAllWindows()


6、透视变换 Perspective

仿射变换可以将矩形图片映射为平行四边形 ,而 透视变换 可以将矩形图片映射为任意四边形

1)变换矩阵

  透视变换矩阵,形为 : P= \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ a_{31} & a_{32} & 1 \\ \end{bmatrix}

  透视变换分为 2 步 :

  

对于透视变换 以上2步的理解 :

  对于齐次坐标 (x, y, z) ,我们是增加了一个维度 z (这时,z = 1),原始图像是在 z = 1 这个平面上的

  • 第一步,我们将图像,根据变换矩阵,投射到了三维空间中,黄色图像为结果图像,图像中像素点的坐标为 (x, \;y,\; a_{31}x + a_{32}y + 1)

  • 第二步,再将三维空间上的点,给映射回 z = 1 平面上。 这种映射是基于视觉原理的映射,这时人的视线为 z轴,将第1步得到的结果图像,往z = 1 平面上进行映射,示意图如下:

2)代码演示

import cv2
import numpy as npsrc_img = cv2.imread("img.jpg")
height, width = src_img.shape[:2]M = np.eye(3, 3)
M[2, 0] = 0.0002
M[2, 1] = 0.0002dst_img = cv2.warpPerspective(src_img, M, (width, height))cv2.imshow("src_img", src_img)
cv2.imshow("dst_img", dst_img)
cv2.waitKey()
cv2.destroyAllWindows()


总结二 :变换矩阵

  对于 变换矩阵 M,其中的每一个部分,都控制着不同的变换 :

 操作顺序一般为 : 先做透视变换、最后做平移变换, 如 yolov5 数据增强中的代码,也是先做透视变换,最后做平移变换 (C 为将原点位置调整到图片中心)

相关文章:

仿射变换 与 透视变换

仿射变换 与 透视变换 几种变换之间的关系 1、缩放 Rescale 1)变换矩阵 缩放变换矩阵,形为 : , 其中: 、 为 x轴 和 y轴的缩放因子,即 宽高的缩放因子 图像中的每一个像素点 (x, y),经过矩阵…...

Vue.js---嵌套的effect与effect栈

4.3嵌套的effect与effect栈 1、嵌套的effect effect是可以发生嵌套的 01 effect(function effectFn1() { 02 effect(function effectFn2() { /* ... */ }) 03 /* ... */ 04 })有这么一段代码: 01 // 原始数据 02 const data { foo: true, bar: true } 03 /…...

jQuery知识框架

一、jQuery 基础 核心概念 $ 或 jQuery:全局函数,用于选择元素或创建DOM对象。 链式调用:多数方法返回jQuery对象,支持连续操作。 文档就绪事件: $(document).ready(function() { /* 代码 */ }); // 简写 $(function…...

【Java学习笔记】hashCode方法

hashCode方法 注意:C要大写 作用:返回对象的哈希码值(可以当作是地址,真实的地址在 Java 虚拟机上),支持此方法是为了提高哈希表的性能 底层实现:实际上,由Object类定义的hashCod…...

[思维模式-37]:什么是事?什么是物?什么事物?如何通过数学的方法阐述事物?

一、基本概念 1、事(Event) “事”通常指的是人类在社会生活中的各种活动、行为、事件或情况,具有动态性和过程性,强调的是一种变化、发展或相互作用的流程。 特点 动态性:“事”往往涉及一系列的动作、变化和发展过程。例如&a…...

STM32-USART串口通信(9)

一、通信接口介绍 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。 当STM32想要实现一些功能,但是需要外挂一些其他模块才能实现,这就需要在两个设备之间连接上一根或多跟通信线,通过通信线路发送或者接…...

【内网渗透】——NTML以及Hash Relay

【内网渗透】——NTLM以及Hash Relay 文章目录 【内网渗透】——NTLM以及Hash Relay[toc]前情提要1.NTML网络认证机制1.1NTML协议1.2NET NTMLv21.3NTML的认证方式1.4NTLM hash的生成方法: 2.PTH(pass the hash)2.1原理2.2漏洞原理2.3实验环境2.4攻击过程…...

速查 Linux 常用指令 II

目录 一、网络管理命令1. 查看和配置网络设备:ifconfig1)重启网络命令2)重启网卡命令 2. 查看与设置路由:route3. 追踪网络路由:traceroute4. 查看端口信息和使用情况1)netstat 命令2)lsof 命令…...

基于 GPUGEEK平台进行vLLM环境部署DeepSeek-R1-70B

选择 GPUGEEK 平台的原因 算力资源丰富:GPUGEEK 提供多样且高性能的 GPU 资源,像英伟达高端 GPU 。DeepSeek - R1 - 70B 模型推理计算量巨大,需要强大算力支持,该平台能满足其对计算资源的高要求,保障推理高效运行。便…...

深入理解ThingsBoard的Actor模型

1、ThingsBoard系统中定义了哪些Actor ✅ ThingsBoard Actor 创建机制与作用对照表: Actor 类型 何时创建 由谁创建 是否缓存 作用描述 SystemActor 系统启动时 DefaultActorService / ActorSystem ✅ 是 ★ ThingsBoard 平台服务级别管理器:负责创建所有的Actor AppActor...

虚幻引擎5-Unreal Engine笔记之Qt与UE中的Meta和Property

虚幻引擎5-Unreal Engine笔记之Qt与UE中的Meta和Property code review! 文章目录 虚幻引擎5-Unreal Engine笔记之Qt与UE中的Meta和Property1.Qt 中的 Meta(元对象系统)1.1 主要功能1.2 如何实现1.2.1 例子1.2.2 访问 meta 信息 2.UE5 中的 Meta&#xff…...

技术中台-核心技术介绍(微服务、云原生、DevOps等)

在企业数字化中台建设中,技术中台是支撑业务中台、数据中台及其他上层应用的底层技术基础设施,其核心目标是提供标准化、可复用的技术能力,降低业务开发门槛,提升系统稳定性与扩展性。技术中台的技术栈需覆盖从开发、运维到治理的…...

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作获取第二维度,第三维度

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作获取第1 维度,第二维度 attention_weights = torch.ones_like(prompt_embedding[:, :, 0]) 这行代码的作用是创建一个与 prompt_embedding[:, :, 0] 形状相同且所有元素都为 1 的张量,它用于初始化…...

2025年中国DevOps工具选型指南:主流平台能力横向对比

在数字化转型纵深发展的2025年,中国企业的DevOps工具选型呈现多元化态势。本文从技术架构、合规适配、生态整合三个维度,对Gitee、阿里云效(云效DevOps)、GitLab CE(中国版)三大主流平台进行客观对比分析&a…...

国产ETL数据集成软件和Informatica 相比如何

数据集成领域Informatica名号可谓无人不知无人不晓。作为国际知名的ETL工具,凭借其强大的功能和多年的市场积累,赢得了众多企业的信赖。然而,随着国内企业数字化转型的加速以及对数据安全、成本控制和本地化服务的需求日益增长,国…...

FFMPEG 与 mp4

1. FFmpeg 中的 start_time 与 time_base start_time 流的起始时间戳(单位:time_base),表示第一帧的呈现时间(Presentation Time)。通常用于同步多个流(如音频和视频)。 time_base …...

在RAG中 如何提高向量搜索的准确性?

在RAG(Retrieval-Augmented Generation)系统中,提高向量搜索的准确性需要从数据预处理、模型选择、算法优化和后处理等多个维度进行综合改进。以下是具体策略的详细分析: 一、优化数据质量与预处理 1. 数据清洗与结构化 去噪与规范化:去除停用词、拼写纠错、统一大小写和…...

Python调用SQLite及pandas相关API详解

前言 SQLite是一个轻量级的嵌入式关系数据库,它不需要独立的服务器进程,将数据存储在单一的磁盘文件中。Python内置了sqlite3模块,使得我们可以非常方便地操作SQLite数据库。同时,pandas作为Python数据分析的重要工具&#xff0c…...

【Java学习笔记】finalize方法

finalize 方法 说明:实际开发中很少或者几乎不会重写finalize方法,更多的是应对面试考点 说明 (1)当对象被回收时,系统会自动调用该对象的 finalize 方法。子类可以重写该方法,做一些额外的资源释放操作&…...

MySQL之基础索引

目录 引言 1、创建索引 2、索引的原理 2、索引的类型 3、索引的使用 1.添加索引 2.删除索引 3.删除主键索引 4.修改索引 5.查询索引 引言 当一个数据库里面的数据特别多,比如800万,光是创建插入数据就要十几分钟,我们查询一条信息也…...

MCU程序加密保护(二)ID 验证法 加密与解密

STM32 微控制器内部具有一个 96 位全球唯一的 CPU ID,不可更改。开发者可利用此 ID 实现芯片绑定和程序加密,增强软件安全性。 ID 验证法就是利用这个 UID,对每颗芯片的身份进行识别和绑定,从而防止程序被复制。 实现方式&#xf…...

SparkSQL的基本使用

SparkSQL 是 Apache Spark 的一个模块,用于处理结构化数据。它提供了一个高性能、分布式的 SQL 查询引擎,可以轻松处理各种数据源,包括结构化数据、半结构化数据和非结构化数据12。 SparkSQL 的特点 易整合:SparkSQL 无缝整合了…...

QListWedget控件使用指南

QListWedget公共函数 函数签名功能描述QListWidget(QWidget *parent nullptr)构造函数,创建一个QListWidget对象,可指定父部件(默认为nullptr)。virtual ~QListWidget()虚析构函数,释放QListWidget对象及其资源。voi…...

primitive创建图像物体

本节我们学习使用entity来创建物体 我们以矩形为例,在输入矩形的四个点后运行程序 //使用entity创建矩形var rectangle viewer.entities.add({rectangle: {coordinates:Cesium.Rectangle.fromDegrees(//西边的经度90,//南边维度20,//东边经度110,//北边维度30 ),material:Ces…...

MySQL 服务器配置和管理(上)

MySQL 服务器简介 通常所说的 MySQL 服务器指的是mysqld(daemon 守护进程)程序,当运⾏mysqld后对外提供MySQL 服务,这个专题的内容涵盖了以下关于MySQL 服务器以及相关配置的内容,包括: • 服务器⽀持的启动选项。可以在命令⾏和…...

跨区域智能电网负荷预测:基于 PaddleFL 的创新探索

跨区域智能电网负荷预测:基于 PaddleFL 的创新探索 摘要: 本文聚焦跨区域智能电网负荷预测,提出基于 PaddleFL 框架的联邦学习方法,整合多地区智能电网数据,实现数据隐私保护下的高精度预测,为电网调度优化提供依据,推动智能电网发展。 一、引言 在当今社会,电力作为经…...

Java 重试机制详解

文章目录 1. 重试机制基础1.1 什么是重试机制1.2 重试机制的关键要素1.3 适合重试的场景2. 基础重试实现2.1 简单循环重试2.2 带延迟的重试2.3 指数退避策略2.4 添加随机抖动2.5 使用递归实现重试2.6 可重试异常过滤3. 常用重试库介绍3.1 Spring Retry3.1.1 依赖配置3.1.2 编程…...

Spark缓存---cache方法

在Spark 中,cache() 是用于优化计算性能的核心方法之一,但它有许多细节需要深入理解。以下是关于 cache() 的详细技术解析: 1. cache() 的本质 简化的 persist():cache() 是 persist(StorageLevel.MEMORY_ONLY) 的快捷方式&#…...

一分钟了解大语言模型(LLMs)

一分钟了解大语言模型(LLMs) A Minute to Know about Large Language Models (LLMs) By JacksonML 自从ChatGPT上线发布以来,在短短的两年多时间里,全球ChatBot(聊天机器人)发展异常迅猛,更为…...

当数控编程“联姻”AI:制造工厂的“智能大脑”如何炼成?

随着DeepSeek乃至AI人工智能技术在企业中得到了广泛的关注和使用,多数企业开始了AI探索之旅,迅易科技也不例外,且在不断地实践中强化了AI智能应用创新的强大能力。许多制造企业面临着工艺知识传承困难、编程效率低下等诸多挑战, 今…...

鸿蒙OSUniApp 实现的二维码扫描与生成组件#三方框架 #Uniapp

UniApp 实现的二维码扫描与生成组件 前言 最近在做一个电商小程序时,遇到了需要扫描和生成二维码的需求。在移动应用开发中,二维码功能已经成为标配,特别是在电商、社交和支付等场景下。UniApp作为一个跨平台开发框架,为我们提供…...

【Python 内置函数】

Python 内置函数是语言核心功能的直接体现,无需导入即可使用。以下是精选的 10 大类、50 核心内置函数详解,涵盖日常开发高频场景: 一、数据类型转换 函数示例说明int()int("123") → 123字符串/浮点数转整数float()float("3…...

鸿蒙OSUniApp开发支持多语言的国际化组件#三方框架 #Uniapp

使用UniApp开发支持多语言的国际化组件 在全球化的今天,一个优秀的应用往往需要支持多种语言以满足不同地区用户的需求。本文将详细讲解如何在UniApp框架中实现一套完整的国际化解决方案,从而轻松实现多语言切换功能。 前言 去年接手了一个面向国际市场…...

MySQL之基础事务

目录 引言: 什么是事务? 事务和锁 mysql数据库控制台事务的几个重要操作指令(transaction.sql) 1、事物操作示意图: 2.事务的隔离级别 四种隔离级别: 总结一下隔离指令 1. 查看当前隔离级别​​ …...

OpenHarmony系统HDF驱动开发介绍(补充)

一、HDF驱动简介 HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。 简单来说:HDF框架的驱动和Linux的驱动比较相似都是由配置文件和驱动…...

深度学习中的查全率与查准率:如何实现有效权衡

📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型辅助生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认…...

文件名是 ‪E:\20250512_191204.mp4, EV软件录屏,未保存直接关机损坏, 如何修复?

去github上下载untrunc 工具就能修复 https://github.com/anthwlock/untrunc/releases 如果访问不了 本机的 hosts文件设置 140.82.112.3 github.com 199.232.69.194 github.global.ssl.fastly.net 就能访问了 实在不行,从这里下载,传上去了 https://do…...

界面控件DevExpress WinForms v24.2 - 数据处理功能增强

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…...

Web UI测试效率低?来试Parasoft Selenic的智能修复与分析!

如果你正在使用Selenium进行Web UI测试,但被测试维护的繁琐、测试不稳定以及测试执行缓慢等问题困扰,不妨试试Parasoft Selenic! Parasoft Selenic能够通过智能修复与分析功能,帮你自动检测并修复测试中的不稳定因素,…...

计算机视觉最不卷的方向:三维重建学习路线梳理

提到计算机视觉(CV),大多数人脑海中会立马浮现出一个字:“卷”。卷到什么程度呢?2022年秋招CV工程师岗位数下降了16%,但求职人数增加了23%,求职人数与招聘岗位的比例达到了恐怖的15:1&#xff0…...

国产 ETL 数据集成厂商推荐—谷云科技 RestCloud

数字化转型加速推进的商业环境中,数据已成为企业最为关键的资产之一。然而,随着企业信息化的建设不断深入,各个业务系统之间数据分散、格式不一、难以互通等问题日益凸显,严重制约了企业对数据价值的深度挖掘与高效利用。在此背景…...

vscode extention踩坑记

# npx vsce package --allow-missing-repository --no-dependencies #耗时且不稳定 npx vsce package --allow-missing-repository #用这行 code --install-extension $vsixFileName --force我问ai:为什么我的.vsix文件大了那么多 ai答:因为你没有用 --n…...

AI时代的弯道超车之第十二章:英语和编程重要性?

在这个AI重塑世界的时代,你还在原地观望吗?是时候弯道超车,抢占先机了! 李尚龙倾力打造——《AI时代的弯道超车:用人工智能逆袭人生》专栏,带你系统掌握AI知识,从入门到实战,全方位提升认知与竞争力! 内容亮点: AI基础 + 核心技术讲解 职场赋能 + 创业路径揭秘 打破…...

关于数据湖和数据仓的一些概念

一、前言 随着各行业数字化发展的深化,数据资产和数据价值已越来越被深入企业重要发展的战略重心,海量数据已成为多数企业生产实际面临的重要问题,无论存储容量还是成本,可靠性都成为考验企业数据治理的考验。本文来看下海量数据存储的数据湖和数据仓,数据仓库和数据湖,…...

hbase shell的常用命令

一、hbase shell的基础命令 # 客户端登录 [rootCloud-Hadoop-NN-02 hbase]$ ./bin/hbase shell# 查看所有表 hbase> list### 创建数据表student,包含Sname、Ssex、Sage、Sdept、course列族/列 ### 说明:列族不指定列名时,列族可以直接成为…...

高并发内存池(四):Page Cache结构设计

目录 一,项目整体框架回顾 Thread Cache结构 Central Cache结构 二,Page Cache大致框架 三,Page Cache申请内存实现 Central Cache向Page Cache申请内存接口 从Page Cache中获取span接口 Page Cache加锁问题 申请内存完整过程 源码&a…...

易学探索助手-项目记录(九)

本文介绍本地大模型推理数据集构成 (一)古籍数据获取 以44种竖向从右至左排列的繁体古文为研究对象,通过OCR识别、XML结构化处理,最终生成符合大模型训练要求的数据集。 1.技术路线设计 图像处理层:PaddleOCR识别竖…...

Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码

Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码 一、设置编码 1、步骤: File -> Setting -> Editor -> File encodings --> 设置编码二、配置文件中文乱码 1、步骤: File -> Setting -> Editor -> File encodings ->…...

Redis缓存穿透、雪崩、击穿的解决方案?

Redis 缓存问题解决方案及Java实现 一、缓存穿透解决方案 (缓存穿透指查询不存在数据,绕过缓存直接访问数据库) 1. 布隆过滤器 空值缓存 注意点: 1.布隆过滤器是需要预热数据的,就是需要输入当前数据库已经存在的…...

第29节:现代CNN架构-Inception系列模型

引言 Inception系列模型是卷积神经网络(CNN)发展历程中的重要里程碑,由Google研究人员提出并不断演进。这一系列模型通过创新的架构设计,在保持计算效率的同时显著提升了图像识别任务的性能。从最初的Inception v1到最新的Inception-ResNet,每一代Inception模型都引入了突破…...