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

相机几何与标定:从三维世界到二维图像的映射

本系列课程将带领读者开启一场独特的三维视觉工程之旅。我们不再止步于教科书式的公式推导,而是聚焦于如何将抽象的数学原理转化为可落地的工程实践。通过解剖相机的光学特性、构建成像数学模型、解析坐标系转换链条,直至亲手实现参数标定代码,我们将层层剥开三维视觉系统的核心构造。

在这场旅程中,您将理解为何简单的针孔模型能衍生出自动驾驶的感知算法,掌握透镜畸变参数如何影响AR眼镜的虚实配准精度,洞悉坐标系转换矩阵怎样支撑工业机器人的空间定位。我们特别设计了"理论-建模-代码"三位一体的讲解框架,使三维重建的数学原理真正可编程、可调试、可优化。

第一章:相机几何与标定——为什么我们需要关注它?

想象一下,你正在用手机拍摄一张照片。你按下快门,咔嚓一声,一张美丽的风景照就诞生了。但你知道吗?在这看似简单的动作背后,隐藏着一个复杂的数学世界——相机几何。它就像是一把钥匙,帮我们打开从三维世界到二维图像的神秘之门。

1. 相机几何:从三维到二维的魔法

1.1 为什么我们需要相机几何?

我们生活在一个三维的世界里,但相机拍出来的照片却是二维的。那么,相机是如何把立体的世界“压扁”成平面的呢?这就是相机几何要解决的问题。

  • 针孔相机的启示
    想象一个小黑屋,墙上开了一个小孔,外面的光线通过这个小孔在屋内形成倒立的图像。这就是最简单的相机模型——针孔相机。它告诉我们,光线通过一个点(小孔)可以在平面上形成图像。

  • 透镜的加入
    但针孔相机有个问题:图像太暗了!于是,我们加入了透镜。透镜就像是一个魔法师,它能把更多的光线聚焦到成像平面上,让图像变得更亮。但魔法师也有自己的脾气——它引入了畸变失焦等问题。

1.2 相机几何的作用

相机几何的核心任务就是描述三维世界中的点如何映射到二维图像上。它帮我们回答以下问题:

  • 为什么远处的物体看起来更小?
  • 为什么平行的铁轨在照片中会相交?
  • 为什么我的照片边缘会变形?

2. 相机标定:相机的“体检报告”

2.1 什么是相机标定?

相机标定就像是给相机做一次全面的体检。我们需要知道相机的“健康状况”——它的焦距、主点位置、畸变参数等。这些参数决定了相机如何“看”世界。

2.2 为什么我们需要相机标定?

  • 精确建模
    如果你想让机器人用相机测量物体的距离,或者让无人机用相机导航,你必须知道相机的内部参数。否则,机器人可能会把1米误认为2米,无人机可能会撞墙。

  • 消除畸变
    透镜会引入畸变,让直线变弯。通过标定,我们可以校正这些畸变,让图像更真实。

  • 多相机协同
    在VR、AR或者电影特效中,常常需要多个相机协同工作。只有通过标定,才能确保这些相机“看”到的是同一个世界。

3. 相机几何与标定的应用场景

3.1 三维重建

通过多张照片,我们可以重建出三维场景。比如,考古学家可以用它重建古遗址,建筑师可以用它生成建筑物的三维模型。

3.2 自动驾驶

自动驾驶汽车依赖相机感知周围环境。通过相机几何,汽车可以计算其他车辆的距离和速度,避免碰撞。

3.3 虚拟现实(VR)与增强现实(AR)

在VR和AR中,相机几何帮我们精确地将虚拟物体叠加到现实世界中。比如,你可以在手机上看到虚拟的恐龙在你的房间里走来走去。

3.4 电影特效

在电影中,特效师用相机几何将CG角色无缝地融入实景拍摄中。比如,《阿凡达》中的潘多拉星球就是通过相机几何与现实场景完美结合的。

    4. 总结:相机几何与标定——连接现实与数字的桥梁

    相机几何与标定不仅仅是枯燥的数学公式,它是连接现实世界与数字世界的桥梁。无论是拍一张照片,还是让机器人自主导航,都离不开它。所以,下次当你按下快门时,不妨想一想:在这张照片背后,隐藏着一个多么神奇的数学世界

    第二章  光圈,景深,焦距

    1. 光圈(Aperture)

    光圈是镜头中调节进光孔大小的装置,通常用f值表示,例如f/1.4、f/2.8、f/8等。光圈值越小,光圈越大,进光量越多;光圈值越大,光圈越小,进光量越少。光圈不仅控制进光量,还影响景深。大光圈(如f/1.4)会产生浅景深,背景虚化效果明显;小光圈(如f/16)则会产生深景深,背景和前景都较为清晰

    2. 景深(Depth of Field, DOF)

    景深是指照片中清晰成像的范围。景深的大小受光圈、焦距和拍摄距离的影响:

    • 光圈:光圈越大(f值越小),景深越浅;光圈越小(f值越大),景深越深。
    • 焦距:焦距越长,景深越浅;焦距越短,景深越深。
    • 拍摄距离:拍摄距离越近,景深越浅;拍摄距离越远,景深越深。

    景深的计算公式为:

    其中,N是光圈值,c是容许弥散圆直径,m是放大倍率

    3. 焦距(Focal Length)

    焦距是指镜头中心到成像平面的距离,通常以毫米(mm)为单位。焦距决定了镜头的视角和放大倍率:

    • 短焦距​(如24mm):视角广,适合拍摄风景或大场景。
    • 长焦距​(如200mm):视角窄,适合拍摄远距离物体或特写。

    焦距还影响景深,长焦距镜头更容易产生浅景深,而短焦距镜头则更容易产生深景深。

    总结

    • 光圈控制进光量和景深,大光圈适合拍摄人像,小光圈适合拍摄风景。
    • 景深决定了照片中清晰的范围,受光圈、焦距和拍摄距离的影响。
    • 焦距决定了镜头的视角和放大倍率,短焦距适合广角拍摄,长焦距适合远摄。

    第三章:相机成像模型

    相机成像模型是计算机视觉的基石,它描述了三维世界中的点如何映射到二维图像上。在这一章中,我们将从直观理解出发,逐步深入到数学公式,最后用Python代码实现一个简单的相机成像模型。

    1. 针孔相机模型:最简单的成像原理

    1.1 什么是针孔相机模型?

    针孔相机模型是相机成像的最基础模型。它假设光线通过一个极小的孔(针孔)在成像平面上形成图像。

    • 核心思想
      光线从物体上的某一点出发,通过针孔,最终在成像平面上形成一个点。所有点的集合就构成了完整的图像。

    • 特点

      • 图像是倒立的
      • 没有透镜,因此没有畸变
      • 图像亮度较低(因为只有少量光线通过针孔)

    1.2 数学建模

    假设三维空间中的点 P=(X,Y,Z) 通过针孔相机投影到成像平面上的点 p=(x,y)。

    根据相似三角形原理,可以得到:

    其中,f 是焦距,表示针孔到成像平面的距离。

    1.3 针孔相机的局限性

    针孔相机局限性主要体现在以下几个方面,这些局限性不仅影响了其成像效果,也限制了其应用场景:

    1. 光圈限制:针孔相机的光圈大小受到针孔直径的限制,无法调节。这意味着在光线较暗的环境下,针孔相机需要更长的曝光时间,导致照片模糊。此外,小光圈也限制了相机的进光量,使得拍摄动态场景或高速运动物体时难以捕捉清晰的图像

    2. 分辨率限制:由于针孔的直径有限,针孔相机的分辨率相对较低,无法捕捉非常精细的图像细节。针孔直径越小,虽然成像的细节越清晰,但光线通过的数量也越少,需要更长的曝光时间。反之,针孔直径越大,光线通过的数量越多,但成像的细节就越模糊
    3. 无法实时调整:针孔相机无法进行实时调整,如调整焦距和光圈大小等参数。这使得拍摄者需要事先对光线和构图等方面进行充分的计算和准备,增加了拍摄的难度

    4. 衍射效应:当针孔直径过小时,光线通过针孔时会发生衍射现象,导致图像模糊。因此,针孔直径的选择需要在清晰度和进光量之间找到平衡。

    2. 透镜的作用原理与机制

    2.1 为什么需要透镜?

    为了解决针孔相机图像太暗的问题,我们引入了透镜。透镜能够将更多的光线聚焦到成像平面上,从而提高图像的亮度。

    2.2 透镜的基本原理

    透镜通过折射改变光线的传播方向,使得从物体发出的光线能够汇聚到成像平面上的某一点。

    • 焦点(Focal Point)​
      平行于光轴的光线通过透镜后会汇聚到一点,称为焦点。

    • 焦距(Focal Length)​
      透镜中心到焦点的距离,记作 f。焦距决定了透镜的聚光能力和成像的大小。

    • 成像公式
      透镜成像遵循以下公式:

    • 其中,u 是物体到透镜的距离,v 是像到透镜的距离。

    2.3 透镜带来的好处

    • 提高亮度:透镜能够汇聚更多光线,使图像更亮。
    • 选择性聚焦:通过调整透镜位置,可以选择性地聚焦在某个距离的物体上。

    2.4. 透镜存在的问题

    失焦(Defocus)

    上图中红圈部分出现了失焦。当物体不在焦平面上时,成像会变得模糊。这是因为光线没有汇聚到同一个点,而是形成了一个光斑。

    • 景深(Depth of Field)​
      能够清晰成像的物体距离范围。景深越大,能够清晰成像的物体距离范围越广。
    径向畸变(Radial Distortion)

    透镜的曲率会导致图像边缘的直线变弯,这种现象称为径向畸变。

    上图中,左图为桶形畸变,右图为枕形畸变。

    • 桶形畸变(Barrel Distortion)​
      图像边缘向内弯曲,像桶的形状。

    • 枕形畸变(Pincushion Distortion)​
      图像边缘向外弯曲,像枕头的形状。

    • 数学模型
      径向畸变可以用多项式模型来描述

     

    2.5 色差(Chromatic Aberration)

    不同波长的光通过透镜时折射率不同,导致颜色分离。这种现象称为色差。

    第四章:坐标系转换——从三维世界到二维像素的数学与代码实现

    1、为什么需要坐标系转换?

    在计算机视觉和摄影测量中,相机的成像过程本质上是将三维世界中的物体映射到二维图像平面的过程。这一过程涉及多个坐标系的转换,原因如下:

    1. 视角适配:物体在世界坐标系中的位置是固定的,但相机的视角可能随时变化,需要通过坐标系转换描述物体在相机视角下的位置。
    2. 三维到二维映射:三维空间中的点需要投影到二维图像平面(如相机传感器)上,形成最终的像素坐标。
    3. 多传感器融合:在自动驾驶、机器人导航等场景中,不同传感器(如相机、激光雷达)的数据需要统一到同一坐标系中。

    2、核心坐标系的定义与理解

    2.1. 世界坐标系(World Coordinate System)

    • 定义:描述物体在真实三维空间中的绝对位置,通常以场景中的某个固定点(如地面原点)为基准。

    2.2. 相机坐标系(Camera Coordinate System)

    • 定义:以相机光心为原点,光轴为Z轴,描述物体相对于相机的位置。
    • 符号:Pc​=(Xc​,Yc​,Zc​)。

    2.3. 图像坐标系(Image Coordinate System)

    • 定义:以相机成像平面为中心,描述点在图像平面上的物理位置(单位为米)。
    • 符号:pi​=(x,y)。

    2.4. 像素坐标系(Pixel Coordinate System)

    • 定义:以图像左上角为原点,描述点在数字图像中的像素位置。
    • 符号:pp​=(u,v)。

    3、坐标系转换的全过程

    从世界坐标系到像素坐标系的转换分为三步,涉及刚体变换、透视投影和像素缩放。

    3.1. 世界坐标系 → 相机坐标系(刚体变换)

    数学公式

    • R:3×3旋转矩阵,描述相机姿态。
    • t:3×1平移向量,描述相机位置。

    代码实现

    import numpy as np# 世界坐标系中的点(齐次坐标)
    P_w = np.array([2.0, 3.0, 5.0, 1.0])  # (X_w, Y_w, Z_w, 1)# 定义相机的旋转矩阵和平移向量
    R = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])  # 无旋转
    t = np.array([0, 0, 10])    # 相机沿Z轴平移10米# 构建刚体变换矩阵
    T = np.eye(4)
    T[:3, :3] = R
    T[:3, 3] = t# 转换为相机坐标系
    P_c = T @ P_w  # 结果为齐次坐标 [X_c, Y_c, Z_c, 1]

    3.2. 相机坐标系 → 图像坐标系(透视投影)

    数学公式

    # 相机内参矩阵(示例:焦距500像素,主点在图像中心)
    K = np.array([[500, 0, 320],[0, 500, 240],[0, 0, 1]])# 提取相机坐标系中的点(非齐次坐标)
    X_c, Y_c, Z_c = P_c[:3]# 透视投影到图像坐标系
    x = (K[0,0] * X_c + K[0,1] * Y_c + K[0,2] * Z_c) / Z_c
    y = (K[1,0] * X_c + K[1,1] * Y_c + K[1,2] * Z_c) / Z_c

    3.3. 图像坐标系 → 像素坐标系(物理尺寸缩放)

    数学公式

    • dx,dy:单个像素的物理尺寸(例如0.001米/像素)。
    # 假设像素物理尺寸为0.001米(即1毫米/像素)
    dx, dy = 0.001, 0.001# 转换为像素坐标
    u = x / dx + K[0,2]  # K[0,2]是u_0
    v = y / dy + K[1,2]  # K[1,2]是v_0
    print(f"像素坐标: ({u:.1f}, {v:.1f})")

     4、完整代码示例

    import numpy as npdef world_to_pixel(P_w, R, t, K, dx=0.001, dy=0.001):"""将世界坐标系中的点转换到像素坐标系"""# 齐次坐标转换P_w_homogeneous = np.append(P_w, 1.0)# 刚体变换:世界坐标系 → 相机坐标系T = np.eye(4)T[:3, :3] = RT[:3, 3] = tP_c_homogeneous = T @ P_w_homogeneousX_c, Y_c, Z_c = P_c_homogeneous[:3]# 透视投影:相机坐标系 → 图像坐标系x = (K[0,0] * X_c + K[0,1] * Y_c + K[0,2] * Z_c) / Z_cy = (K[1,0] * X_c + K[1,1] * Y_c + K[1,2] * Z_c) / Z_c# 物理尺寸缩放:图像坐标系 → 像素坐标系u = x / dx + K[0,2]v = y / dy + K[1,2]return (u, v)# 示例参数
    P_w = np.array([2.0, 3.0, 5.0])  # 世界坐标系中的点
    R = np.eye(3)                     # 无旋转
    t = np.array([0, 0, 10])          # 相机沿Z轴平移10米
    K = np.array([[500, 0, 320],[0, 500, 240],[0, 0, 1]])         # 内参矩阵# 转换并输出结果
    u, v = world_to_pixel(P_w, R, t, K)
    print(f"世界坐标 {P_w} → 像素坐标 ({u:.1f}, {v:.1f})")

    5. 补充:图像坐标系到像素坐标系的深入解析


    5.1、问题背景:为什么说“物理尺寸缩放”容易被误解?

    在之前的坐标系转换流程中,图像坐标系到像素坐标系的转换被简化为以下公式:

    其中 dx,dy 表示单个像素的物理尺寸(如0.001米/像素)。
    这一步骤看似简单,但实际隐含了对相机内参矩阵 K 的深度理解。许多初学者会在此处混淆以下问题:

    1. 内参矩阵 K 中的 fx​,fy​ 是否已包含像素物理尺寸?
    2. 为什么需要额外的 dx,dy 缩放?
    3. 主点偏移 u0​,v0​ 的物理意义是什么?

    以下将深入剖析这一过程。


    5.2、内参矩阵 K 的物理意义

    5.2.1. 内参矩阵的标准形式

    5.3、修正后的转换流程

    5.3.1. 相机坐标系 → 图像坐标系(物理单位:米)

    此时 x物理​,y物理​ 的单位为米。

    5.3.2. 图像坐标系 → 像素坐标系(单位转换)

    但这一步骤实际上已被内参矩阵 K ​提前完成
    正确的做法是直接使用内参矩阵 K 一步到位

    5.3.3. 物理意义验证

    假设相机参数如下:

    • 物理焦距 f物理​=0.05米(50毫米镜头)
    • 像素尺寸 dx=dy=0.0001米(10微米/像素)

    则内参矩阵应为:

    与代码中的 K = [[500, 0, 320], [0, 500, 240]] 一致。此时:

    • 世界点 (2,3,5) 在相机坐标系中为 (2,3,5−10)=(2,3,−5)(注意Z轴方向)。
    • 投影到图像平面

    但结果为负值,表明该点位于相机视野外。需调整参数确保 Zc​>0。


    5.4、常见问题解答

    5.4.1. 为什么内参矩阵 K 能隐含像素物理尺寸?

    因为 fx​=f物理​/dx,已通过焦距和像素尺寸的比值将物理单位转换为像素单位。

    5.4.2. 何时需要显式使用 dx,dy?

    仅在以下场景需要:

    • 需要从像素坐标反推物理坐标(如三维重建)。
    • 相机标定过程中计算内参矩阵 K。
    5.4.3. 主点偏移 u0​,v0​ 的实际意义?
    • 表示光轴与图像平面的交点在像素坐标系中的位置。
    • 对于理想相机,u0​=图像宽度/2, v0​=图像高度/2。

     下一篇 : 相机的参数标定

    相关文章:

    相机几何与标定:从三维世界到二维图像的映射

    本系列课程将带领读者开启一场独特的三维视觉工程之旅。我们不再止步于教科书式的公式推导,而是聚焦于如何将抽象的数学原理转化为可落地的工程实践。通过解剖相机的光学特性、构建成像数学模型、解析坐标系转换链条,直至亲手实现参数标定代码&#xff0…...

    SCI期刊推荐 | 免版面费 | 计算机领域:信息系统、软件工程、自动化和控制

    在学术研究领域,选择合适的SCI期刊对科研成果的传播与认可至关重要。了解SCI期刊的研究领域和方向是基础,确保投稿内容与期刊主题相符。同时,要关注期刊的影响因子和评估标准,选择具有较高影响力和学术认可度的期刊。阅读期刊的投…...

    Cryptography 与 PyCryptodome 源码级解析

    目录 Cryptography 与 PyCryptodome 源码级解析一、引言二、Cryptography 库源码解析2.1 Cryptography 库概述与设计理念2.2 核心模块与数据流分析2.2.1 目录结构与模块划分2.2.2 以 AES-GCM 模式为例的加解密实现2.2.3 源码示例解析 2.3 错误处理与边界检测 三、PyCryptodome …...

    std::string的模拟实现

    目录 string的构造函数 无参数的构造函数 根据字符串初始化 用n个ch字符初始化 用一个字符串的前n个初始化 拷贝构造 用另一个string对象的pos位置向后len的长度初始化 [ ]解引用重载 迭代器的实现 非const版本 const版本 扩容reserve和resize reserve resize p…...

    GPU、NPU与LPU:大语言模型(LLM)硬件加速器全面对比分析

    引言:大语言模型计算基础设施的演进 随着大语言模型(LLM)的快速发展与广泛应用,高性能计算硬件已成为支撑LLM训练与推理的关键基础设施。目前市场上主要有三类处理器用于加速LLM相关任务:GPU(图形处理单元…...

    常见限流算法

    限流是指在高并发、大流量请求的情况下,限制新的流量对系统的访问,以保证系统服务的安全性。常见的限流算法及其详细介绍如下: 计数器算法(Fixed Window Counter) 原理:使用一个固定时间窗口内的计数器来…...

    美国国家航空航天局(NASA)的PUNCH任务

    地球浸没在来自太阳的物质流中。这种被称为太阳风的流正在冲刷我们的星球,造成令人叹为观止的极光,影响太空中的卫星和宇航员,甚至影响地面基础设施。 美国宇航局 (NASA) 的 PUNCH(统一日冕和日球层旋光仪 Polarimeter to Unify the Corona and Heliosphere)任务将首次…...

    REST API前端请求和后端接收

    1、get请求&#xff0c;带"?" http://localhost:8080/api/aop/getResult?param123 GetMapping("getResult")public ResponseEntity<String> getResult(RequestParam("param") String param){return new ResponseEntity<>("12…...

    OpenBMC:BmcWeb构造connect对象

    OpenBMC:BmcWeb server.run-CSDN博客 server在接收了tcp连接请求后,会构造一个ConnectionType对象,然后通过post调度,运行该对象的start函数 1.ConnectionType类型 其实也就是using ConnectionType = Connection<Adaptor, Handler>;类型 由于ConnectionType实例化于…...

    ESLint 深度解析:原理、规则与插件开发实践

    在前端开发的复杂生态中&#xff0c;保障代码质量与规范性是构建稳健、可维护项目的基石。ESLint 作为一款强大的代码检查工具&#xff0c;其默认规则与插件能满足多数常见需求&#xff0c;但面对特定团队规范或项目独特要求&#xff0c;自定义 ESLint 插件便成为有力的扩展手段…...

    ios使用swift调用deepseek或SiliconFlow接口

    调用SiliconFlow API 注册并获取API密钥&#xff1a;打开硅基流动平台官网Models&#xff0c;进行注册和认证。登录后&#xff0c;进入首页&#xff0c;点击左上角三个横杠&#xff0c;选择API密钥&#xff0c;生成密钥并复制。配置第三方应用&#xff1a;打开安装好的Chatbox…...

    贪心算法一

    > 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…...

    Java进阶:Dubbo

    分布式RPC框架Apache Dubbo 1. 软件架构的演进过程 软件架构的发展经历了由单体架构、垂直架构、SOA架构到微服务架构的演进过程&#xff0c;下面我们分别了解一下这几个架构。 1.1 单体架构 架构说明&#xff1a; 全部功能集中在一个项目内&#xff08;All in one&#xf…...

    【Day9】make/makeFile如何让项目构建自动化起飞

    【Day9】make/makeFile如何让项目构建自动化起飞 使用make命令编写makefile文件依赖管理增量构建makefile注释&#xff1a;#makefile其他语法 make/makefile递归式工作过程 在Linux中&#xff0c;项目自动化构建是指使用一系列工具和脚本来自动执行软件项目的编译、测试、打包和…...

    SCI1区TOP:自适应学习粒子群算法SLPSO,深度解析+性能实测

    目录 1.摘要2.改进策略3.自适应学习粒子群算法4.结果展示5.参考文献6.获取代码 1.摘要 粒子群算法&#xff08;PSO&#xff09;是一种基于种群的随机搜索方法&#xff0c;广泛应用于科学和工程领域的连续空间优化问题&#xff0c;并已证明其高效性和有效性。许多实际问题的往往…...

    迷你世界脚本显示板管理接口:DisPlayBoard

    显示板管理接口&#xff1a;DisPlayBoard 迷你世界 更新时间: 2023-04-26 10:21:14 具体函数名及描述如下: 序号 函数名 函数描述 1 showBoard(...) 对玩家显示显示板 2 hideBoard(...) 对玩家隐藏显示板 3 setBoardPicture 对玩家设置显示板的图片…...

    如何使用 LLM 生成的术语自动在搜索应用程序上构建 autocomplete 功能

    作者&#xff1a;来自 Elastic Michael Supangkat 了解如何在 Elastic Cloud 中&#xff0c;通过使用 LLM 生成的词汇&#xff0c;为搜索应用增强自动补全功能&#xff0c;实现更智能、更动态的搜索建议。 自动补全是搜索应用中的一项关键功能&#xff0c;它通过在用户输入时实…...

    电路基础:【1】PN结二极管制作电桥点亮LED灯

    第一章&#xff1a;PN结二极管制作电桥点亮LED灯 文章目录 第一章&#xff1a;PN结二极管制作电桥点亮LED灯前言一、电路原理二、电路图与元器件1.电路图 做实验总结 前言 在本章中&#xff0c;我们将探讨如何通过PN结二极管制作电桥电路&#xff0c;并利用该电路点亮LED灯。L…...

    蓝桥与力扣刷题(蓝桥 门牌制作)

    题目&#xff1a;小蓝要为一条街的住户制作门牌号。 这条街一共有 2020 位住户&#xff0c;门牌号从 1 到 2020编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符&#xff0c;最后根据需要将字符粘贴到门牌上&#xff0c;例如门牌 1017 需要依次粘贴字符 1、0、1、7&…...

    unity console日志双击响应事件扩展

    1 对于项目中一些比较长的日志&#xff0c;比如前后端交互协议具体数据等&#xff0c;这些日志内容可能会比较长&#xff0c;在unity控制面板上查看不是十分方便&#xff0c;我们可以对双击事件进行扩展&#xff0c;将日志保存到一个文本中&#xff0c;然后用系统默认的文本查看…...

    基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程

    一、Django项目初始化 1.创建Django项目 Django-admin startproject 项目名 2.安装 djangorestframework pip install djangorestframework 解释: Django REST Framework (DRF) 是基于 Django 框架的一个强大的 Web API 框架&#xff0c;提供了多种工具和库来构建 RESTf…...

    unittest框架 核心知识的系统复习及与pytest的对比

    1. unittest 介绍 是什么&#xff1a;Python 标准库自带的单元测试框架&#xff0c;遵循 xUnit 架构&#xff08;类似Java的JUnit&#xff09;。 核心概念&#xff1a; TestCase&#xff1a;测试用例的基类&#xff0c;所有测试类需继承它。 TestSuite&#xff1a;测试套件&a…...

    嵌入式硬件设计SPI时需要注意什么?

    嵌入式硬件设计SPI时需要注意什么? 1. 硬件设计注意事项 关键点注意事项1. 信号完整性- 缩短SCK、MOSI、MISO的走线长度,避免反射干扰。- 使用屏蔽线或差分信号(高速场景)。- 阻抗匹配(特别是高频信号,如50Ω端接)。2. 电源与地线- 电源去耦:每个SPI芯片的VCC附近放置0…...

    vscode远程ssh链接服务器

    前提&#xff1a;安装并配置好 ssh 服务,并且远程主机和本地主机在同一个局域网。 降级到1.85.2版本并禁用自动更新&#xff0c;因为最新的vscode不支持remote SSH。 【VS Code】VS Code不再支持remote SSH 1.在vscode 扩展中搜索Remote - SSH,下载安装扩展 2.点击 远程资源管理…...

    97k倍区间

    97k倍区间 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;暴力&#xff0c;2017省赛 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {static int N 100010;public static void main(String[] args) {Scanner sc new Scanner(System.…...

    绝美焦糖暖色调复古风景画面Lr调色教程,手机滤镜PS+Lightroom预设下载!

    调色教程 通过 Lr 软件丰富的工具和功能&#xff0c;对风景照片在色彩、影调等方面进行调整。例如利用基本参数调整选项&#xff0c;精准控制照片亮度、对比度、色温、色调等基础要素&#xff1b;运用 HSL 面板可对不同色彩的色相、饱和度以及明亮度进行单独调节&#xff1b;利…...

    双王炸爆单,问界M8、M9怎么选?

    文 | AUTO芯球 作者 | 雷慢 问界M8一小时小订7500台&#xff0c; 新问界M9一小时订单3800台。 余承东这次直接把一对王炸打了出来&#xff0c; 来看这对大小王&#xff0c; 问界M8预售价36.8万到45.8万&#xff0c; 问界M9预售价47.8万到57.8万&#xff0c; 这两款车&…...

    【自学笔记】OpenStack基础知识点总览-持续更新

    提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 OpenStack基础知识点总览一、OpenStack概述1.1 OpenStack起源1.2 OpenStack的目标与优势1.3 OpenStack的常见核心项目 二、OpenStack的节点类型2.1 控制节点2.2 网络…...

    同步 Fork 仓库的命令

    同步 Fork 仓库的命令 要将您 fork 的仓库的 main 分支与原始仓库&#xff08;fork 源&#xff09;同步&#xff0c;您可以使用以下命令&#xff1a; 首先&#xff0c;确保您已经添加了原始仓库作为远程仓库&#xff08;如果尚未添加&#xff09;&#xff1a; git remote add…...

    2025-03-04 学习记录--C/C++-C语言 判断是否是素数

    合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; C语言 判断是否是素数 一、代码 ⭐️ #include <stdio.h> #include <stdbool.h> // 使用 bool 类型// 判断是否是…...

    1、CI/CD 平台安装部署(Gitlab+Jenkins)

    CI/CD 平台安装部署 安装部署Gitlab安装Gitlab添加组、创建用户、创建项目 Jenkins 安装Maven 安装和配置Tomcat 安装和配置Jenkins 构建 Maven 项目自由风格项目构建 什么是CI/CD&#xff1f; 通俗来说就是启动一个服务&#xff0c;能够监听代码变化&#xff0c;然后自动执行构…...

    数据集路径出错.yaml‘ images not found , missing path

    方法一&#xff1a;删除settings.yaml 方法二&#xff1a;dataset_name.yaml改用绝对路径&#xff0c;如最后一张图 错误分析&#xff1a; dataset_name.yaml中的path的路径仅支持绝对路径&#xff0c;写相对路径就会搜索不到&#xff0c;使用settings.json中的路径&#xff0…...

    零基础学习Python 之类(Class)和实例(Instance)_我的学习Python记录12

    零基础学习Python 之类&#xff08;Class&#xff09;和实例&#xff08;Instance&#xff09;_我的学习Python记录12 目录 什么是类和实例&#xff1f;类的作用如何定义类&#xff1f;如何创建实例&#xff1f;类的属性和方法 属性方法 实际案例 案例 1&#xff1a;学生信息…...

    Map<String,Object>转换为XML报文的方法

    1. 使用 JAXB (Java Architecture for XML Binding) JAXB 是 Java 标准库的一部分&#xff0c;支持将 Java 对象与 XML 相互转换。虽然 JAXB 主要用于将 Java 对象转换为 XML&#xff0c;但可以通过一些技巧将 Map<String, Object> 转换为 XML。 示例代码 import java…...

    Linux:如何安装虚拟机

    Linux&#xff1a;如何安装虚拟机 第一步首先打开阿里巴巴开源镜像网站然后点击相应要下载链接 选择自己需要的 这个是完整版 这个是联网进行安装系统 这个是基础版只有命令行界面 这里我选择下载基础版 下载好打开vmwareworkstation 开始安装...

    HTML 编辑器推荐与 VS Code 使用教程

    在进行 HTML 编程时&#xff0c;选择一款合适的 HTML 编辑器能极大地提高开发效率。以下为大家推荐几款常用且功能强大的 HTML 编辑器&#xff0c;同时详细介绍如何使用 VS Code 创建和预览 HTML 文件。 一、HTML 编辑器推荐 VS Code&#xff1a;由微软开发&#xff0c;是一款…...

    Python的Pandas和matplotlib库:让数据可视化贼简单

    在数据爆炸的时代&#xff0c;数据可视化已成为数据分析的关键环节。Python 作为强大的编程语言&#xff0c;拥有众多用于数据可视化的库&#xff0c;而 pandas 库在其中扮演着重要角色。它不仅能高效处理和分析数据&#xff0c;还具备强大的数据可视化功能&#xff0c;让我们轻…...

    私有云基础架构与运维(二)

    二.私有云基础架构 【项目概述】 经过云计算基础知识及核心技术的学习后&#xff0c;希望进一步了解 IT 基础架构的演变过 程&#xff0c;通过学习传统架构、集群架构以及私有云基础架构的相关知识&#xff0c;认识企业从传统 IT 基 础架构到私有云基础架构转型的必要性。…...

    Java Maven 项目问题:org.dom4j:dom4j:pom:2.1.3 failed to transfer from...

    问题与处理策略 问题描述 IDEA 中打开一个 Java 项目&#xff0c;使用 Maven 构建时&#xff0c;报如下错误 org.dom4j:dom4j:pom:2.1.3 failed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local r…...

    DeepSeek group-limited expert routing和负载均衡

    Ref https://github.com/deepseek-ai/DeepSeek-V3/blob/main/inference/model.py GitHub - deepseek-ai/EPLB: Expert Parallelism Load Balancer DeepSeek-V3 Technical Report DeepSeek的路由方法 class Gate(nn.Module):def __init__(self, args: ModelArgs):super().__…...

    nvidia驱动升级-ubuntu 1804

    升级 1.从官网下载*.run驱动文件 2.卸载原始驱动 sudo /usr/bin/nvidia-uninstall sudo apt-get --purge remove nvidia-\* # 可能不需要加-\ sudo apt-get purge nvidia-\* # 可能不需要加-\ sudo apt-get purge libnvidia-\* # 可能不需要…...

    金融合规测试:金融系统稳健运行的“定海神针“

    一、什么是金融合规测试&#xff1f; 金融行业是受监管最严格的领域之一&#xff0c;各国政府和监管机构&#xff08;如中国人民银行、银保监会、证监会、美国SEC、欧盟ESMA等&#xff09;都制定了严格的法律法规&#xff0c;要求金融机构确保系统安全、交易透明、公平竞争&am…...

    [Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑

    参考原文&#xff1a;[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑 还在为多台电脑需要多套键盘鼠标而烦恼吗&#xff1f;是不是在操控 Windows、macOS、Linux 不同系统电脑时手忙脚乱&#xff1f;现在&#xff0c;这些问题通通能解决&#xff01;Deskflow 软件闪亮登…...

    vue3 组合式API:透传 Attributes(v-bing与:)—setup() 上下文对象ctx.attrs

    一、概念及举例说明透传 attribute与模板语法中的Attribute(v-bind) 透传 attribute:传递给一个组件没有通过 props 与 emits 的attribute或者v-on事件监听(常见的:calss、style、id) 举例:当一个组件以单个元素为根元素渲染时,透传 attribute 会自动被添加到根元素上 …...

    记录一次利用条件索引优化接口性能的实践

    一、业务背景 某表数据量达到4000w&#xff0c;需要每天定时任务处理20w条。前2周内SQL执行无任何问题&#xff0c;非常快&#xff0c;效率比较高。随着处理完的数据量变大&#xff0c;处理完数据状态设置为1&#xff0c;SQL执行效率越来越差&#xff0c;已经达到了惊人的4.6秒…...

    Anaconda 部署 DeepSeek

    可以通过 Anaconda 环境部署 DeepSeek 模型&#xff0c;但需结合 PyTorch 或 TensorFlow 等深度学习框架&#xff0c;并手动配置依赖项。 一、Anaconda 部署 DeepSeek 1. 创建并激活 Conda 环境 conda create -n deepseek python3.10 # 推荐 Python 3.8-3.10 conda activate…...

    MATLAB中lookAheadBoundary函数用法

    目录 语法 说明 示例 匹配指定模式之前的位置 匹配指定模式之前的边界以外的边界 lookAheadBoundary函数的功能是匹配指定模式之前的边界。 语法 newpat lookAheadBoundary(pat) 说明 newpat lookAheadBoundary(pat) 创建匹配 pat 的开头的模式。结果中不包含 pat 匹…...

    Unity HDR颜色、基础颜色、强度强度、HDR面板Intensity之间的相互转换

    目录 前言&#xff1a; 一、UnityHDR面板的规律 二、HDR与基础颜色转换&#xff0c;HDR强度获取&#xff0c;输入设置强度获取 1.基础色->HDR颜色 2.HDR颜色->基础色 3.获取HDR颜色在面板中的强度 4.获取HDR颜色在面板设置输入时的强度 前言&#xff1a; HDR&#…...

    nvm 让 Node.js 版本切换更灵活

    有很多小伙伴前端开发进程中&#xff0c;我们常常会遇到不同项目依赖不同版本 Node.js 的情况。我们不可能去卸载重新安装适应的版本去安装依赖或者启动项目。为了避免版本冲突带来的一系列麻烦&#xff0c;在这里给大家推荐一款Node.js 版本管理工具——nvm&#xff08;Node V…...

    微机惊魂记

    春天午后的阳光懒洋洋地洒在教学楼的走廊上&#xff0c;我跟着同学们排着队往四楼的微机教室走去。楼梯间的窗户开着&#xff0c;飘进来阵阵樱花的香气&#xff0c;让人昏昏欲睡。 微机教室在一栋普通的五层教学楼里&#xff0c;墙壁刷着淡绿色的漆&#xff0c;墙角还有些剥落…...