【立体视觉(一)】之成像原理与镜头畸变

news2024/12/23 17:52:48

【立体视觉(一)】之成像原理与镜头畸变

  • 一、成像原理
    • 一)针孔模型
    • 二)坐标系转换
      • 1. 世界坐标系到相机坐标系
      • 2. 相机坐标系到图像坐标系
      • 3. 图像坐标系到像素坐标系
      • 4. 相机坐标系到像素坐标系
      • 5. 世界坐标系到像素坐标系
  • 二、镜头畸变
    • 一)径向畸变
      • 径向畸变矫正
    • 二)切向畸变
      • 切向畸变校正
    • 三)总畸变校正

此为个人学习笔记,在各处借鉴了不少好图好文(参考文献在文末),主要是对相关知识进行梳理,以期形成自己的体系。文字表述东拼西凑,符号公式手动输入,若有错误烦请指出。

一、成像原理

一)针孔模型

在科学研究中,一个现象内部的过程总是复杂而难以清晰看透,而聪明的学者们总会用最简单的模型去做初始描述,提出一个相对简单的模型。成像过程亦不例外,他们将三维世界中的坐标点映射到二维图像平面的过程用一个几何模型进行描述,这个模型有很多种,其中最简单的称为针孔模型。
在这里插入图片描述
注意,在探究成像过程中,常使用虚拟成像平面进行分析。

二)坐标系转换

在这里插入图片描述
从真实世界(世界坐标系)中一点到相片(像素坐标系)上的成像点涉及以下四个坐标系间的转换。

  • 世界坐标系(World Coordinate System, WCS):点在真实世界中的位置,描述相机位置,单位m。
  • 相机坐标系(Camera Coordinate System, CCS):相机sensor中心为原点,建立相机坐标系,单位m。
  • 图像坐标系(Film Coordinate System, FCS):以主点为原点的二维坐标系,单位mm。
  • 像素坐标系(Pixel Coordinate System, PCS):原点为相片左上角的二维坐标系,单位无或pixel。

接下来按以下步骤介绍相机成像过程中某点在各个坐标系间的变换。
在这里插入图片描述

1. 世界坐标系到相机坐标系

世界坐标系到相机坐标系(World to Camera,W2C),就是简单的三维坐标系转换(三个坐标轴方向与原点的变化)。世界坐标系上一点 P w ( U , V , W ) {P_{w}(U,V,W)} Pw(U,V,W) 到相机坐标系上一点 P c ( X , Y , Z ) {P_{c}(X,Y,Z)} Pc(X,Y,Z)

[ X Y Z ] = [ R 3 × 3 T 3 × 1 ] [ U V W 1 ] \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix}= \begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ \end{bmatrix} \begin{bmatrix} {U}\\ {V}\\ {W}\\ {1}\\ \end{bmatrix} XYZ =[R3×3T3×1] UVW1

或使用其次矩阵表达:

[ X Y Z 1 ] = [ R 3 × 3 T 3 × 1 O 1 ] [ U V W 1 ] \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ {O}&{1}\\ \end{bmatrix} \begin{bmatrix} {U}\\ {V}\\ {W}\\ {1}\\ \end{bmatrix} XYZ1 =[R3×3OT3×11] UVW1

其中, [ R 3 × 3 T 3 × 1 ] \begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ \end{bmatrix} [R3×3T3×1] (或 [ R 3 × 3 T 3 × 1 O 1 ] \begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ {O}&{1}\\ \end{bmatrix} [R3×3OT3×11])被称为相机的外参矩阵(Extrinsic Matrix),描述的是世界坐标中相机的位置( T 3 × 1 T_{3\times1} T3×1),及其指向方向( R 3 × 3 R_{3\times3} R3×3)。


2. 相机坐标系到图像坐标系

相机坐标系到图像坐标系( Camera to Film,C2F),这里由三维坐标 P c ( X , Y , Z ) {P_{c}(X,Y,Z)} Pc(X,Y,Z) 降维到二维坐标 p ( x , y ) {p(x,y)} p(x,y)
在这里插入图片描述

根据相似三角,得:

x X = y Y = f Z \frac{x}{X}=\frac{y}{Y}=\frac{f}{Z} Xx=Yy=Zf

则:
[ x y 1 ] = [ f Z 0 0 0 f Z 0 0 0 1 Z ] [ X Y Z ] \begin{bmatrix} {x}\\ {y}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {\frac{f}{Z}}&{0}&{0}\\ {0}&{\frac{f}{Z}}&{0}\\ {0}&{0}&{\frac{1}{Z}}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix} xy1 = Zf000Zf000Z1 XYZ


3. 图像坐标系到像素坐标系

图像坐标系到像素坐标系(Film to Pixel,F2P)是一个简单的仿射变换 (Affine Transformation)过程,主要包括原点的移动和尺度的变换。
在这里插入图片描述
有:
u = x d x + u 0 , v = y d y + v 0 u=\frac{x}{d_x}+u_0, v=\frac{y}{d_y}+v_0 u=dxx+u0,v=dyy+v0

矩阵形式:
[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x y 1 ] \begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {\frac{1}{d_x}}&{0}&{u_0}\\ {0}&{\frac{1}{d_y}}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {x}\\ {y}\\ {1}\\ \end{bmatrix} uv1 = dx1000dy10u0v01 xy1


4. 相机坐标系到像素坐标系

现在开始回溯,接上一步,相机坐标系到像素坐标系(Camera to Film, C2F)有:
[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f Z 0 0 0 f Z 0 0 0 1 Z ] [ X Y Z ] = 1 Z [ f d x 0 u 0 0 f d y v 0 0 0 1 ] [ X Y Z ] \begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {\frac{1}{d_x}}&{0}&{u_0}\\ {0}&{\frac{1}{d_y}}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {\frac{f}{Z}}&{0}&{0}\\ {0}&{\frac{f}{Z}}&{0}\\ {0}&{0}&{\frac{1}{Z}}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix}=\frac{1}{Z} \begin{bmatrix} {\frac{f}{d_x}}&{0}&{u_0}\\ {0}&{\frac{f}{d_y}}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix} uv1 = dx1000dy10u0v01 Zf000Zf000Z1 XYZ =Z1 dxf000dyf0u0v01 XYZ

其中, f d x 、 f d y \frac{f}{d_x}、\frac{f}{d_y} dxfdyf 即焦距除以像素尺寸,单位为pixel,表示焦距在两个像元方向上的像素单位值。由于在相机标定过程中 f 、 d x 、 d y {f}、{d_x}、{d_y} fdxdy 是不能直接测量的,而其组合值 f d x 、 f d y \frac{f}{d_x}、\frac{f}{d_y} dxfdyf 可通过标定得到,故可用 f x = f d x 、 f y = f d y {f_x}=\frac{f}{d_x}、{f_y}=\frac{f}{d_y} fx=dxffy=dyf 来表示两个组合值。那么:
[ u v 1 ] = 1 Z [ f x 0 u 0 0 f y v 0 0 0 1 ] [ X Y Z ] \begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \frac{1}{Z} \begin{bmatrix} {f_x}&{0}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix} uv1 =Z1 fx000fy0u0v01 XYZ

若像素坐标系中两坐标轴不垂直(此时像元不是矩形,而是平行四边形),那么相机内参中还有一个偏斜系数 s s s(skew coefficient) s = f x t a n ( α ) s=f_x tan(\alpha) s=fxtan(α),有兴趣可以推导一下。

在这里插入图片描述
此时:
[ u v 1 ] = 1 Z [ f x s u 0 0 f y v 0 0 0 1 ] [ X Y Z ] \begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \frac{1}{Z} \begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix} uv1 =Z1 fx00sfy0u0v01 XYZ

其中, [ f x s u 0 0 f y v 0 0 0 1 ] \begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} fx00sfy0u0v01 为相机的内参矩阵(Intrinsics Matrix),描述相机坐标系到像素坐标系的变换关系,反应了相机自身的属性,通常用符号 K K K表示(注意,很多版本里的内参矩阵不含偏斜系数,即默认其为0)。在相机坐标系中, Z Z Z 对应为三维点的深度,常被称为尺度因子 λ \lambda λ,则相机坐标系到像素坐标系:
λ [ u v 1 ] = [ f x s u 0 0 f y v 0 0 0 1 ] [ X Y Z ] \lambda\begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix} λ uv1 = fx00sfy0u0v01 XYZ
令:
K = [ f x s u 0 0 f y v 0 0 0 1 ] K=\begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} K= fx00sfy0u0v01
有:
λ p = K P c \lambda p=KP_c λp=KPc

补充: Z = 1 Z=1 Z=1 的平面称为归一化平面,归一化平面上的坐标称为归一化坐标。


5. 世界坐标系到像素坐标系

世界坐标系到像素坐标系(World to Pixel,W2P),整个串起来:
λ [ u v 1 ] = [ f x s u 0 0 f y v 0 0 0 1 ] [ X Y Z ] = [ f x s u 0 0 f y v 0 0 0 1 ] [ R 3 × 3 T 3 × 1 ] [ U V W 1 ] \lambda\begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix}=\begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix}\begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ \end{bmatrix} \begin{bmatrix} {U}\\ {V}\\ {W}\\ {1}\\ \end{bmatrix} λ uv1 = fx00sfy0u0v01 XYZ = fx00sfy0u0v01 [R3×3T3×1] UVW1

世界坐标系到像素坐标系的转换实际上表达的是透视投影中空间点到像点的投影关系,所以把该转换矩阵叫做投影矩阵(Projection Matrix),常用 M M M表示 ,通过矩阵运算可知投影矩阵是一个3x4的矩阵,它是内参矩阵和外参矩阵的乘积。

λ p = K [ R 3 × 3 T 3 × 1 ] [ P w 1 ] = M [ P w 1 ] \lambda {p}=K \begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ \end{bmatrix} \begin{bmatrix} {P_w}\\ {1}\\ \end{bmatrix}=M\begin{bmatrix} {P_w}\\ {1}\\ \end{bmatrix} λp=K[R3×3T3×1][Pw1]=M[Pw1]

另外,若使用其次矩阵表达,矩阵维度会有所变化。
在这里插入图片描述


二、镜头畸变

由于透镜的固有特性(凸透镜汇聚光线、凹透镜发散光线)导致成像直线会变成曲线。

镜头畸变主要有径向畸变(radial distortion)和切向畸变 (tangential distortion)。

畸变特性:

  • 径向畸变主要由于镜头的几何形状改变了直线的形状。
  • 切向畸变主要由于镜头安装的时候没有与图像平面完美平行。
  • 实际经验中,图像几何更加关注径向畸变,因此有时候畸变图像校正的过程可能会忽略切向畸变。
    在这里插入图片描述

一)径向畸变

径向畸变主要包括:

  • 桶形畸变 (barrel distortion)
  • 枕形畸变 (pincushion distortion)
  • 八字胡畸变 (mustache distortion)
    在这里插入图片描述

可以看出,径向畸变图像的特点是:

  • 中心对称
  • 直线变曲
畸变特点场景
桶形畸变中心放大了,离光心越远,图像放大率越小鱼眼镜头,广角/全景图片
枕形畸变枕形畸变挤压了图片,(就像压扁的枕头)长焦镜头经常会出现枕形畸变,以消除球体效应
八字胡畸变上述两种类型的混合,它开始时是靠近光轴的桶形畸变,然后逐渐向图像边缘枕形畸变

径向畸变矫正

一般情况下,图像的径向畸变可用一个低阶多项式模型来表示:

x u n d i s t = x d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y u n d i s t = y d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) x_{undist}=x_{dist}(1+k_1r^2+k_2r^4+k_3r^6) \\ y_{undist}=y_{dist}(1+k_1r^2+k_2r^4+k_3r^6) xundist=xdist(1+k1r2+k2r4+k3r6)yundist=ydist(1+k1r2+k2r4+k3r6)

其中 r 2 = x d i s t 2 + y d i s t 2 r^2=x_{dist}^2+y_{dist}^2 r2=xdist2+ydist2 ( x d i s t , y d i s t ) (x_{dist},y_{dist}) (xdistydist) 是归一化后的相机坐标系的点,即坐标原点已经移到主点,并且像素坐标除以焦距, x d i s t = X Z = u − u o f x x_{dist}=\frac{X}{Z}=\frac{u-u_o}{f_x} xdist=ZX=fxuuo y d i s t = Y Z = v − v o f y y_{dist}=\frac{Y}{Z}=\frac{v-v_o}{f_y} ydist=ZY=fyvvo,可以从畸变的图像中得到。 k 1 、 k 2 、 k 3 k_1、k_2、k_3 k1k2k3 是径向畸变参数(也属于相机的内参,一般可使用多项式前两项,如鱼眼等畸变较大的相机会使用第三项,默认用三项总是没错的),可以用过棋盘格标定得到。

二)切向畸变

切向畸变由相机senser与镜头不平行导致。
在这里插入图片描述

切向畸变校正

图像的切向畸变也可用一个低阶多项式模型来表示:
x undist  = x dist  + [ 2 p 1 x dist  y dist  + p 2 ( r 2 + 2 x dist  2 ) ] y undist  = y dist  + [ p 1 ( r 2 + 2 y dist  2 ) + 2 p 2 x dist  y dist  ] x_{\text {undist }}=x_{\text {dist }}+\left[2 p_{1} x_{\text {dist }} y_{\text {dist }}+p_{2}\left(r^{2}+2 x_{\text {dist }}^{2}\right)\right]\\y_{\text {undist }}=y_{\text {dist }}+\left[p_{1}\left(r^{2}+2 y_{\text {dist }}^{2}\right)+2 p_{2} x_{\text {dist }} y_{\text {dist }}\right ] xundist =xdist +[2p1xdist ydist +p2(r2+2xdist 2)]yundist =ydist +[p1(r2+2ydist 2)+2p2xdist ydist ]

p 1 p_1 p1 p 2 p_2 p2 为切向畸变参数。

三)总畸变校正

同时考虑镜像畸变和切向畸变:

x u n d i s t = x d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ 2 p 1 x d i s t y d i s t + p 2 ( r 2 + 2 x d i s t 2 ) ] y u n d i s t = y d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ p 1 ( r 2 + 2 y d i s t 2 ) + 2 p 2 x d i s t y d i s t ] x_{{undist }}=x_{dist}(1+k_1r^2+k_2r^4+k_3r^6)+\left[2 p_{1} x_{{dist }} y_{{dist }}+p_{2}\left(r^{2}+2 x_{dist }^{2}\right)\right]\\ y_{ {undist }}=y_{dist}(1+k_1r^2+k_2r^4+k_3r^6)+\left[p_{1}\left(r^{2}+2 y_{{dist }}^{2}\right)+2 p_{2} x_ {dist }y_{ {dist }}\right] xundist=xdist(1+k1r2+k2r4+k3r6)+[2p1xdistydist+p2(r2+2xdist2)]yundist=ydist(1+k1r2+k2r4+k3r6)+[p1(r2+2ydist2)+2p2xdistydist]
共有5个畸变参数 k 1 、 k 2 、 k 3 、 p 1 、 p 2 k_1、k_2、k_3、p_1、p_2 k1k2k3p1p2,这5个畸变参数与内参矩阵一起,都是需要相机标定的相机内参。但是在OpenCV相机标定时输出顺序是 k 1 、 k 2 、 p 1 、 p 2 、 k 3 k_1、k_2、p_1、p_2、k_3 k1k2p1p2k3,因为 k 3 k_3 k3 不重要,很多情况下不需要。(是不是很真实?)


参考:
[1] CSE/EE486 Computer Vision I
[2] 一文详解相机标定算法原理
[3] 立体视觉入门指南(1):坐标系与相机参数
[4] 相机标定(Camera calibration)原理及步骤

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

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

相关文章

数据结构 | 图的遍历(C语言)

一、数据结构定义 1、图 #define MaxVertexNum 100 // 最大可存储的节点数目/*图*/ typedef char VexterType; typedef int EdgeType;typedef struct GraphMatrix {VexterType Vexs[MaxVertexNum]; //结点 EdgeType Edges[MaxVertexNum][MaxVertexNum]; //边int vexnum, a…

【区块链】以太坊L2扩容方案与零知识证明

以太坊L2扩容方案与零知识证明 简介 简要概述以太坊L2层现有解决方案简要概述以太坊L2未来扩容的方向简要概述零知识证明的基本概念和零知识证明在以太坊的运用简要概述stark ware的两个产品,但并不推荐现有使用和研究简要概述polygon zkEVM,推荐使用和…

纷享销客斩获“2022-2023年度用户推荐SaaS品牌”

近日,纷享销客受邀出席CSIC2023第八届SaaS应用大会暨云领奖颁奖典礼活动。纷享销客作为国内领先的CRM 云厂商,凭借产品创新以及强大的行业解决方案能力,以绝对实力荣获“2022-2023年度用户推荐SaaS品牌”。 据悉, C SIC云领奖自 …

【SQL武林秘籍】玩转表及其数据

目录 📖前言 😀数据库约束类型 1️⃣not null 非空约束 2️⃣unique 唯一约束 3️⃣default 默认值约束 4️⃣primary key 主键约束 5️⃣foreign key 外键约束 6️⃣check 限制约束 😉新增(insert select) 😄查询(进…

Podman 是 Docker 的直接替代品吗?

在许多地方,你可以读到Podman是Docker的替代品。但是,真的像听起来那么简单吗?在这篇文章中,你将从一个可以立即投入生产使用的Dockerfile开始,并执行Podman命令,就像你使用Docker时会做的那样。让我们看看…

【Vite环境变量】import.meta.env 和 loadEnv使用和区别

前言 我们在做项目时需要各种配置信息(如应用标题、API 地址等),这些配置信息可能在不同环境下有所不同(如开发环境和生产环境)。 如果每次更改开发或者更改生产环境需要修改源代码中的相关配置,这会导致…

老生常谈:接口幂等性,防止并发插入重复数据

分布式系统中,接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。不知道你有没有遇到过这些场景: 有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据&a…

AI时代的三类人:探索掌握AIGC,引领未来的人才之路

(本文阅读时间:6 分钟) 1 AI时代:ChatGPT引领AIGC技术革命 对于那些热衷于探索新技术的小伙伴而言,ChatGPT早已超越了抽象的概念,我们对其能力已有所了解。那么,ChatGPT究竟能够做些什么呢&…

Java 集合全教程

一、集合简介 集合(有时称为容器)只是将多个元素分组到单个单元中的对象。集合用于存储、检索、操作和传达聚合数据。通常,它们表示形成自然组的数据项,例如扑克手(纸牌集合)、邮件文件夹(字母…

【Java多线程进阶】synchronized工作原理

前言 本期讲解 synchronized 工作的原理以及常见的锁优化机制,相信大家在看完这篇博文后对 synchronized 工作流程有一定的理解。话不多说,让我们快速进入学习吧~ 目录 1. 锁的工作流程 2. 偏向锁 3. 轻量级锁和重量级锁 3.1 轻量级锁 3.2 重量级锁…

Kubernetes基本存储

Kubernetes基本存储 容器的生命周期可能很短,会被频繁地创建和销毁,容器销毁时,保存在容器中的数据也会被清除。为了持久化保存容器中数据,引入Volume概念。 Volume时Pod中多个容器共同访问的共享目录,它被定义在Pod中…

“碳”寻青蓝锦色,锦江酒店(中国区)用行动点亮酒店可持续发展

第52个世界环境日之际,为响应“减塑捡塑”号召,锦江酒店(中国区)以“‘碳’寻青蓝锦色”为主题,在6月5日至6月11日期间,开启第二届“绿色生活创益周”,通过线上线下联动,倡导时尚低碳…

2023智源大会议程公开丨类脑计算论坛

6月9日,2023北京智源大会,将邀请这一领域的探索者、实践者、以及关心智能科学的每个人,共同拉开未来舞台的帷幕,你准备好了吗?与会知名嘉宾包括,图灵奖得主Yann LeCun、图灵奖得主Geoffrey Hinton、OpenAI创…

Mocha AE:Clip 模块

Clip(剪辑)模块主要用于对素材或遮罩文件的格式进行查看或设置,包括视频格式、时间码格式、色彩空间等,还可以进行裁剪。 General 常规 Input 输入 当前图层素材。 Matte for Layer n 图层 n 的遮罩 Name 名称 显示素材的名称。 …

通信大史记:互联网的起源故事

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 文案 / 朱峰 产品统筹 / bobo 这是一期“两年更”的节目,通信大史记录完第一期后,因为资料准备和主播时间的关系一直没有后续更新。今天,我们…

nodejs的path模块

path路径模块 path模块是Node.js官方提供的,用来处理路径的模块。提供一系列的方法和属性,用来满足用户对路径的处理需求。 例如: 如果在js代码中,使用path模块来处理路径,需要先导入 const pathrequire(path)常用的…

chatgpt赋能python:Python如何调成白色的SEO文章

Python 如何调成白色的 SEO 文章 介绍 Python 是一种流行的编程语言,在数据分析、人工智能、Web 开发以及其他许多领域都有广泛的应用。然而,很少有人会把 Python 与 SEO 联系起来。 事实上,Python 是一个强大的工具,可以帮助 …

软件工程师,学会封装不香么

什么是封装 从面向对象编程的角度来说,封装是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与…

rk3568 TF卡启动

rk3568 SD卡启动 SD卡启动系统,它可以让rk3568在没有硬盘或其他存储设备的情况下启动和运行操作系统。这使得rk3568变得与树梅派一样灵活切换系统,与此同时进行故障排查和修复,而不需要拆卸设备或者使用专业的烧录工具。SD卡启动还可以方便地…

音视频同步的方法:深入探索基于FFmpeg的音视频同步策略

音视频同步艺术:深入探索基于FFmpeg的同步策略 (一)音视频同步的基本概念与重要性(Basic Concepts and Importance of Audio-Video Synchronization)1.1 音视频同步的定义与影响(Definition and Impact of …