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

【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。

文章目录

  • Scaramuzza相机模型标定效果
  • 2、原理和代码
    • 代码
      • 1、 2D映射到3D,函数输入为2D点坐标+OCAM参数
      • 代码功能详解
      • 2、3D --> 2D
  • 3、总结Scaramuzza 模型的核心思想
      • Scaramuzza 模型的核心思想
      • 与 Kannala-Brandt 模型的对比
      • Scaramuzza 模型的独特之处
      • Scaramuzza 的意图
  • 4、标定实践
  • 参考

从Scaramuzza的论文出发,详细介绍该模型。

参考论文-1:A Flexible Technique for Accurate Omnidirectional Camera Calibration and Structure from Motion (2006年,mei论文是2007年)
参考论文-2:A Toolbox for Easily Calibrating Omnidirectional Cameras (2006年)
参考论文-3:Omnidirectional Camera (2008年)

这3篇paper的一作都是Davide Scaramuzza,主讲的都是Scaramuzza 全向相机模型,paper-1是介绍该模型成像原理,paper-2是详细介绍该模型的标定过程(计算相机内参/外参),paper-3是针对全向相机内参模型的一篇综述。

作者在paper中声称Scaramuzza内参模型可以同时建模两种全向相机:(1) 反射折射 catadioptric(camera + mirror)(2) 纯折射 dioptric (fisheye),主要原因在于Scaramuzza模型用泰勒多项式来建模:某个3D点到光心O的向量与该点在图像坐标系下的坐标值(u,v),省去了fx / fy。paper中Scaramuzza的建模是根据2d–>3d,这和其他模型的推导是反着的

Scaramuzza相机模型标定效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、原理和代码

在这里插入图片描述
这个公式描述了一个全向相机(omnidirectional camera)的投影模型。全向相机能够捕捉到更广阔的视野,通常用于机器人、虚拟现实和增强现实等领域。让我们逐步解释这个公式的含义:

  1. 投影函数 g g g

    • 函数 g g g描述了传感器平面上的点 u ′ ′ u'' u′′与从视点 O O O到场景点 X X X的向量 p p p之间的关系。
    • 这个函数捕捉了相机如何将三维场景点 X X X投影到二维传感器平面上的过程。
  2. 全向相机模型
    λ ⋅ p = λ ⋅ g ( u ′ ′ ) = λ ⋅ g ( A u ′ + t ) = P X , λ > 0 \lambda \cdot p = \lambda \cdot g(u'') = \lambda \cdot g(Au' + t) = PX, \quad \lambda > 0 λp=λg(u′′)=λg(Au+t)=PX,λ>0

    • 这里, λ \lambda λ是一个正的比例因子,表示从视点 O O O到场景点 X X X的距离。
      - p p p是从视点 O O O到场景点 X X X的向量。
      - g ( u ′ ′ ) g(u'') g(u′′)是投影函数,将传感器平面上的点 u ′ ′ u'' u′′映射到向量 p p p
      - A u ′ + t Au' + t Au+t表示对传感器平面上的点 u ′ u' u进行仿射变换,其中 A A A是线性变换矩阵, t t t是平移向量。A = [c d ; e 1], t = [cx, cy],这里面已经没有fx fy 了,被建模进了 g ( u ′ ′ ) g(u'') g(u′′)中.
      - P P P是一个 3 × 4 3 \times 4 3×4的透视投影矩阵,用于将三维场景点 X X X(用齐次坐标表示)投影到二维图像平面上。
  3. 齐次坐标

    • 场景点 X X X用齐次坐标表示,即 X ∈ R 4 X \in \mathfrak{R}^4 XR4。齐次坐标允许我们用一个统一的框架表示点和向量,并且可以方便地进行透视投影和其他线性变换。
  4. 透视投影矩阵 P P P

    • 矩阵 P P P将三维空间中的点 X X X投影到二维图像平面上。这个矩阵包含了相机的内参(如焦距、主点)和外参(如相机的位置和方向)。

总的来说,这个公式描述了全向相机如何通过投影函数 g g g和透视投影矩阵 P P P将三维场景点 X X X映射到二维传感器平面上的过程。这个过程是计算机视觉和图像处理中的基础,用于从图像中恢复三维场景信息。

在这里插入图片描述

  1. 投影函数 g ( u ′ , v ′ ) g(u', v') g(u,v)
    g ( u ′ , v ′ ) = ( u ′ , v ′ , f ( u ′ , v ′ ) ) T g(u', v') = (u', v', f(u', v'))^T g(u,v)=(u,v,f(u,v))T

    • 这个函数将传感器平面上的点 ((u’, v’)) 映射到三维空间中的一个点 ((u’, v’, f(u’, v’)))。
    • 函数 f ( u ′ , v ′ ) f(u', v') f(u,v) 描述了传感器平面上的点如何映射到三维空间中的深度。
  2. 旋转对称性假设

    • 假设函数 f f f 仅通过 (\rho’ = \sqrt{u’^2 + v’^2}) 依赖于 u ′ u' u v ′ v' v
    • 这意味着函数 g g g 是关于传感器轴旋转对称的,即传感器的响应在圆周方向上是一致的。
  3. 坐标系和变换

    • 图1(a) 显示了反射折射相机系统中的坐标系。
    • 图1(b) 显示了传感器平面,使用度量坐标。
    • 图1© 显示了相机图像平面,使用像素坐标。
    • 图1(b) 和 © 之间通过仿射变换相关联,这意味着它们之间存在线性变换和平移。

在这里插入图片描述

  1. 多项式函数 f ( u ′ , v ′ ) f(u', v') f(u,v)
    f ( u ′ , v ′ ) = a 0 + a 1 ρ ′ ′ + a 2 ρ ′ 2 + … + a N ρ ′ N f(u', v') = a_0 + a_1 \rho'' + a_2 \rho'^2 + \ldots + a_N \rho'^N f(u,v)=a0+a1ρ′′+a2ρ′2++aNρN

    • 这个多项式函数描述了传感器平面上的点 ((u’, v’)) 如何映射到三维空间中的深度。
    • 系数 a i a_i ai 和多项式阶数 N N N 是通过校准确定的模型参数。
    • (\rho’’ > 0) 是从传感器轴到点的度量距离。
  2. 投影模型
    λ ⋅ [ u ′ v ′ w ′ ] = λ ⋅ g ( A u ′ + t ) = λ ⋅ [ ( A u ′ + t ) f ( u ′ , v ′ ) ] = P ⋅ X , λ > 0 \lambda \cdot \begin{bmatrix} u' \\ v' \\ w' \end{bmatrix} = \lambda \cdot g(\mathbf{A}u' + t) = \lambda \cdot \begin{bmatrix}(\mathbf{A}u' + t) \\ f(u', v') \end{bmatrix} = \mathbf{P} \cdot \mathbf{X}, \, \lambda > 0 λ uvw =λg(Au+t)=λ[(Au+t)f(u,v)]=PX,λ>0

    • 这个方程描述了如何将三维场景点 X \mathbf{X} X 投影到传感器平面上的点 ( u ′ , v ′ , w ′ ) (u', v', w') (u,v,w)
    • λ \lambda λ 是一个正的比例因子,表示从视点到场景点的距离。
    • A \mathbf{A} A 是线性变换矩阵, t t t 是平移向量。
    • P \mathbf{P} P 是透视投影矩阵,用于将三维场景点 X \mathbf{X} X 投影到二维图像平面上。

这些公式共同描述了一个反射折射相机系统的投影模型,包括如何将传感器平面上的点映射到三维空间中的深度,以及如何通过多项式函数和仿射变换来处理图像坐标。这种模型在计算机视觉和机器人学中非常重要,用于从全向图像中恢复三维场景信息。

代码

1、 2D映射到3D,函数输入为2D点坐标+OCAM参数

这个 MATLAB 函数 cam2world 实现了将图像平面上的二维点(像素坐标)转换为三维空间中的单位向量(即从相机中心出发的光线方向)。这个过程通常用于全向相机(如鱼眼相机或反射折射相机)的模型,目的是将图像点映射到相机的单位球面上。
2D --> 3D是用ρ来进行多项式近似

代码功能详解

  1. 输入参数

    • m:图像平面上的二维点(像素坐标),大小为 (2 \times N),其中 (N) 是点的数量。
    • ocam_model:一个结构体,包含相机的内参和畸变参数,具体包括:
      • ss:多项式系数,用于描述相机的畸变模型。
      • xc, yc:图像中心点的坐标(主点)。
      • width, height:图像的宽度和高度。
      • c, d, e:仿射变换矩阵的参数。
  2. 主要步骤

    • 提取参数

      ss = ocam_model.ss;
      xc = ocam_model.xc;
      yc = ocam_model.yc;
      c = ocam_model.c;
      d = ocam_model.d;
      e = ocam_model.e;
      

      这些参数用于描述相机的内参和畸变模型。

    • 仿射变换

      A = [c,d; e,1];
      T = [xc;yc]*ones(1,n_points);
      m = A^-1*(m-T);
      

      这里,A 是一个仿射变换矩阵,用于将图像平面上的点从像素坐标系转换到归一化的度量坐标系。T 是平移向量,用于将图像中心点对齐到坐标系原点。

    • 计算三维光线方向

      M = getpoint(ss,m);
      

      调用 getpoint 函数,将归一化的二维点映射到三维空间中的光线方向。

    • 归一化到单位球面

      M = normc(M);
      

      将三维向量归一化,使其长度为 1,表示这些向量位于单位球面上。

  3. getpoint 函数

    • 这个函数的作用是根据相机的畸变模型(多项式 ss),将归一化的二维点映射到三维空间中的光线方向。
    • 具体实现:
      w = [m(1,:) ; m(2,:) ; polyval(ss(end:-1:1), sqrt(m(1,:).^2 + m(2,:).^2)) ];
      
      • m(1,:)m(2,:) 是归一化的二维点的 (x) 和 (y) 坐标。
      • polyval(ss(end:-1:1), sqrt(m(1,:).^2 + m(2,:).^2)) 计算径向畸变,使用多项式 ss 来描述畸变模型。
      • 最终返回的三维向量 w 表示从相机中心出发的光线方向。
        将 MATLAB 代码 w = [m(1,:) ; m(2,:) ; polyval(ss(end:-1:1), sqrt(m(1,:).^2 + m(2,:).^2)) ]; 转换为数学公式,可以表示为:

完整的数学表达式为:

w = [ u ′ v ′ a 0 + a 1 ρ ′ + a 2 ρ ′ 2 + … + a N ρ ′ N ] w = \begin{bmatrix} u' \\ v' \\ a_0 + a_1 \rho' + a_2 \rho'^2 + \ldots + a_N \rho'^N \end{bmatrix} w= uva0+a1ρ+a2ρ′2++aNρN
其中:

  • u ′ = m ( 1 , : ) u' = m(1,:) u=m(1,:) 是归一化的二维点的 x x x 坐标。
  • v ′ = m ( 2 , : ) v' = m(2,:) v=m(2,:) 是归一化的二维点的 y y y 坐标。
  • ρ ′ = u ′ 2 + v ′ 2 \rho' = \sqrt{u'^2 + v'^2} ρ=u′2+v′2 是从图像中心到点 ( u ′ , v ′ ) (u', v') (u,v) 的径向距离。
  • f f f 是一个多项式函数,表示相机的畸变模型,
  • a 0 , a 1 , … , a N a_0, a_1, \ldots, a_N a0,a1,,aN 是多项式系数,描述相机的畸变模型。

这个公式表示将归一化的二维点 ( u ′ , v ′ ) (u', v') (u,v) 映射到三维空间中的光线方向 w w w,其中第三维 f f f 由多项式畸变模型计算得出。

  1. 全部代码
function M=cam2world(m, ocam_model)n_points = size(m,2);
ss = ocam_model.ss;
xc = ocam_model.xc;
yc = ocam_model.yc;
width = ocam_model.width;
height = ocam_model.height;
c = ocam_model.c;
d = ocam_model.d;
e = ocam_model.e;A = [c,d;e,1];
T = [xc;yc]*ones(1,n_points);m = A^-1*(m-T);
M = getpoint(ss,m);
M = normc(M); %normalizes coordinates so that they have unit length (projection onto the unit sphere)function w=getpoint(ss,m)% Given an image point it returns the 3D coordinates of its correspondent optical
% rayw = [m(1,:) ; m(2,:) ; polyval(ss(end:-1:1),sqrt(m(1,:).^2+m(2,:).^2)) ];

这个函数的主要功能是将图像平面上的二维点(像素坐标)转换为三维空间中的单位向量(光线方向)。具体步骤包括:

  1. 通过仿射变换将像素坐标转换为归一化的度量坐标。
  2. 使用多项式畸变模型将归一化的二维点映射到三维空间中的光线方向。
  3. 将三维向量归一化到单位球面上。

这种转换通常用于全向相机的几何校正和三维重建任务中。

2、3D --> 2D

3D --> 2D是用θ来进行多项式近似,θ是入射光线和图像平面的夹角,这个和泰勒(Kannala-Brandt模型)很像(θ是入射光线和Z轴的夹角),只不过多项式阶数更高(190度的鱼眼相机:一般为12阶以上)。这个比较简单,我就不多介绍了。可以看出,Scaramuzza的作者Davide Scaramuzza 想传达的思路在于2D鱼眼图片向其他坐标系转换的一种思路吗。

function m = world2cam_fast(M, ocam_model)ss = ocam_model.ss;
xc = ocam_model.xc;
yc = ocam_model.yc;
width = ocam_model.width;
height = ocam_model.height;
c = ocam_model.c;
d = ocam_model.d;
e = ocam_model.e;
pol = ocam_model.pol;npoints = size(M, 2);
theta = zeros(1,npoints);NORM = sqrt(M(1,:).^2 + M(2,:).^2);ind0 = find( NORM == 0); %these are the scene points which are along the z-axis
NORM(ind0) = eps; %this will avoid division by ZERO latertheta = atan( M(3,:)./NORM );rho = polyval( pol , theta ); %Distance in pixel of the reprojected points from the image centerx = M(1,:)./NORM.*rho ; % 和fisheyey一样也利用了入射光线和x轴夹角等于像素坐标系上该点的x夹角
y = M(2,:)./NORM.*rho ;%Add center coordinates
m(1,:) = x*c + y*d + xc;
m(2,:) = x*e + y   + yc;

3、总结Scaramuzza 模型的核心思想

Scaramuzza 模型的核心思想

Scaramuzza 的模型主要用于将 2D 鱼眼图像上的点 转换为 3D 空间中的光线方向(即从相机中心出发的单位向量)。这个模型的核心在于:

  1. 2D 到 3D 的映射

    • 通过多项式函数 f ( ρ ′ ) f(\rho') f(ρ) 来描述鱼眼图像的畸变特性。
    • 这里的 $\rho’ = \sqrt{u’^2 + v’^2} $ 是归一化的图像平面上的径向距离。
    • 多项式 f ( ρ ′ ) f(\rho') f(ρ) ρ ′ \rho' ρ映射到第三维(即光线方向的 ( z ) 分量),从而将 2D 图像点转换为 3D 光线方向。
  2. 高阶多项式

    • 对于大视角(如 190 度的鱼眼相机),Scaramuzza 模型通常使用高阶多项式(如 12 阶或更高)来精确描述畸变。
    • 这是因为鱼眼相机的畸变在大视角下非常显著,低阶多项式无法准确拟合。
  3. 目标

    • Scaramuzza 模型的主要目标是将鱼眼图像上的点映射到 3D 空间中的光线方向,从而为后续的几何校正、三维重建或其他计算机视觉任务提供基础。

与 Kannala-Brandt 模型的对比

Kannala-Brandt 模型也是一种经典的鱼眼相机模型,但它更侧重于 3D 到 2D 的投影

  1. 3D 到 2D 的映射

    • Kannala-Brandt 模型使用入射光线与相机光轴(Z 轴)的夹角 ( \theta ) 来描述投影过程。
    • 通过多项式函数 r ( θ ) r(\theta) r(θ) θ \theta θ 映射到图像平面上的径向距离 r r r
  2. 多项式近似

    • Kannala-Brandt 模型的多项式通常阶数较低(如 4 阶或 6 阶),因为它的目标是描述 3D 到 2D 的投影,而不是直接处理鱼眼图像的畸变。
  3. 目标

    • Kannala-Brandt 模型的主要目标是建模相机的投影过程,用于相机标定和几何校正。

Scaramuzza 模型的独特之处

Scaramuzza 模型的独特之处在于:

  1. 2D 到 3D 的逆向映射

    • 它直接从鱼眼图像上的 2D 点出发,通过多项式映射到 3D 空间中的光线方向。
    • 这种思路更适合处理鱼眼图像的畸变校正和几何变换。
  2. 高精度拟合

    • 由于鱼眼图像的畸变在大视角下非常复杂,Scaramuzza 模型使用高阶多项式来确保高精度拟合。
  3. 灵活性

    • Scaramuzza 模型不依赖于具体的相机几何结构(如 Kannala-Brandt 模型中的光轴夹角 θ \theta θ,而是直接从图像数据出发,因此更具灵活性。

Scaramuzza 的意图

Scaramuzza 的模型确实传达了一种思路:通过多项式映射将鱼眼图像上的 2D 点转换为其他坐标系(如 3D 光线方向或单位球面)。这种思路的核心在于:

  1. 直接处理鱼眼图像的畸变

    • 通过高阶多项式精确描述鱼眼图像的畸变特性。
  2. 为后续任务提供基础

    • 将鱼眼图像上的点映射到 3D 空间中的光线方向,可以为几何校正、三维重建、视觉里程计等任务提供基础。

Scaramuzza 的模型和 Kannala-Brandt 模型都使用多项式来描述鱼眼相机的投影过程,但它们的思路和应用场景不同:

  • Scaramuzza 模型侧重于 2D 到 3D 的逆向映射,适合处理鱼眼图像的畸变校正和几何变换。
  • Kannala-Brandt 模型侧重于 3D 到 2D 的投影,适合相机标定和几何校正。

Scaramuzza 的模型通过高阶多项式和高灵活性,为鱼眼图像的处理提供了一种有效的思路,尤其是在大视角和复杂畸变的情况下。

4、标定实践

论文 《A Toolbox for Easily Calibrating Omnidirectional Cameras》是这么设置的,设置了一个包含 6x8=48 个角点的棋盘平面。图案的尺寸为 150x210 毫米。作为相机模型,我们选择一个 4 阶多项式,其参数根据校准真实全向相机获得的参数进行设置。然后,我们将虚拟相机的图像分辨率设置为 900x1200 像素。

通过校准全向相机,我们指的是估计参数[A, t, a0, a1, a2 ,…, an ].

按照论文的步骤;
1、求解相机外​​部参数:
总之,校准的第一步可以找到校准模式每个姿势的外部参数 [r11,r12,r21,r22,r31,r32,t1,t2],除了平移参数 t3 。

2、求解相机内部参数:
描述模型的内部参数 [a1,a2,a3,…,an] 。为了计算最佳多项式次数 N,我们实际上从 N=2 开始。然后,我们以单位步长增加 N,并计算所有校准点的重投影误差的平均值。当找到最小误差时,该过程停止。

C. 内在和外在参数的线性细化。线性最小化步骤找出相机的内在参数,并同时估计剩余的外在 t3 。

D. 迭代中心检测

E. 非线性细化

参考

OCamCalib: Omnidirectional Camera Calibration Toolbox for Matlab
https://blog.csdn.net/ouyangandy/article/details/107088939
https://zhuanlan.zhihu.com/p/578678136

相关文章:

【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。

文章目录 Scaramuzza相机模型标定效果2、原理和代码代码1、 2D映射到3D,函数输入为2D点坐标OCAM参数代码功能详解2、3D --> 2D 3、总结Scaramuzza 模型的核心思想Scaramuzza 模型的核心思想与 Kannala-Brandt 模型的对比Scaramuzza 模型的独特之处Scaramuzza 的意…...

LVS 负载均衡集群(NAT模式)

一、环境准备 四台主机(一台 LVS、两台 RS、一台客户端) 注意每个虚拟机都需要关闭防火墙和 selinux 1.1.LVS 主机 LVS 主机(两块网卡) 第一块:NAT模式(内网) 第二块:添加网卡&am…...

MATLAB中的APPdesigner绘制多图问题解析?与逻辑值转成十进制

在matlab APPdesigner中绘图可以用UIAxes组件进行绘图,但是当想多张图时,只能提前绘制图像区域不方便。下面是几种办法: 为了操作可以添加Panl组件,方便操作。 1、当是要求的几个图像大小都是相同时刻采用函数: til…...

9种慢慢被淘汰的编程语言...

技术不断进步,我们使用的编程语言也不例外。 随着人工智能的兴起以及对编程语言使用的影响,我们更加关注哪些语言将在未来继续流行,哪些会被淘汰。 Python、Java 和 JavaScript 等多功能编程语言正在主导市场,而其他一些语言则逐…...

vue知识点5

1.如何让组件里的样式与其他组件互相不干扰 scope范围的意思 <style scope> </style> 2.vue的生命周期 创建 挂载 更新 销毁 3.vue的四个生命周期详解 创建beforeCreate,created 挂载 beforeMount,mounted 更新 beforeUpdate,updated 销毁 beforeDest…...

rdiff-backup备份

目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…...

UE_C++ —— Metadata Specifiers

声明UClasses、UFunctions、UProperties、UEnums和UInterfaces时使用的元数据关键词&#xff0c;表示其与引擎和关卡编辑器诸多方面的互动方式&#xff1b; 当声明classe、interfaces、structs、enums、enum values、functions、or propertie时&#xff0c;可添加 Metadata Spe…...

【算法与数据结构】并查集详解

目录 一&#xff0c;什么是并查集 二&#xff0c;并查集的结构 三&#xff0c;并查集的代码实现 1&#xff0c;并查集的大致结构和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;优化 小结&#xff1a; 四&#xff0c;并查集的应用场景 省份…...

deepseek多列数据对比,联想到excel的高级筛选功能

目录 1 业务背景 ​2 deepseek提示词输入 ​3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题&#xff0c;系统导入的数据和线下的EXCEL数据是否一致&#xff0c;如果不一致&#xff0c;如何快速找到差异值&#xff0c;原来脑海第一反应就是使用公…...

Windows操作系统部署Tomcat详细讲解

Tomcat是一个开源的Java Servlet容器&#xff0c;用于处理Java Web应用程序的请求和响应。以下是关于Tomcat的用法大全&#xff1a; 一、安装Tomcat 下载 访问Apache Tomcat官方网站&#xff08;https://tomcat.apache.org/&#xff09;&#xff0c;根据你的操作系统&#xf…...

每日Attention学习23——KAN-Block

模块出处 [SPL 25] [link] [code] KAN See In the Dark 模块名称 Kolmogorov-Arnold Network Block (KAN-Block) 模块作用 用于vision的KAN结构 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as F import mathclass Swish(nn.Module)…...

今日写题04work

题目&#xff1a;移除链表元素 两种实现思路 思路一 使用双指针&#xff0c;prev&#xff0c;cur快慢指针解决。当cur不等于val&#xff0c;两个指针跳过。当等于val时&#xff0c;要考虑两种情况&#xff0c;一种是pos删&#xff0c;一种是头删除。 pos删除就是正常情况&am…...

Managed Lustre 和 WEKA:高性能文件系统的对比与应用

Managed Lustre 和 WEKA&#xff1a;高性能文件系统的对比与应用 1. 什么是 Managed Lustre&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 2. 什么是 WEKA&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 3. Managed Lustre 和 WEKA 的对比4. 如何选择 Managed…...

LeetCode541 反转字符串2

一、题目描述 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。具体规则如下&#xff1a; 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等…...

MAC 系统关闭屏幕/睡眠 后被唤醒 Wake Requests

问题&#xff1b;查看wake 日志 pmset -g log | grep "Wake Requests" 为 Wake Requests [*processdasd requestSleepService...info"com.apple.alarm.user-invisible-com.apple.calaccessd...电源设置命令参考&#xff1a; pmset -g sched //查看定时…...

论文笔记:Multi-Head Mixture-of-Experts

2024 neurips 1 背景 稀疏混合专家&#xff08;SMoE&#xff09;可在不显著增加训练和推理成本的前提下提升模型的能力【比如Mixtral 8*7B&#xff0c;表现可以媲美LLaMA-2 70B】 但它也有两个问题 专家激活率低&#xff08;下图左&#xff09; 在优化时只有一小部分专家会被…...

vue和Django快速创建项目

一、VUE 1.创建 Vue 3 JavaScript 项目 npm create vitelatest 项目名称 -- --template vue创建 Vue 3 TypeScript 项目 npm create vitelatest 项目名称 -- --template vue-ts 2.然后 cd 项目名称 npm install npm install axios # 发送 API 请求 npm install pinia …...

Java LinkedList(单列集合)

LinkedList 是 Java 中实现了 List 接口的一个类&#xff0c;它属于 java.util 包。与 ArrayList 不同&#xff0c;LinkedList 是基于双向链表实现的&#xff0c;适合于频繁进行插入和删除操作的场景。 1. LinkedList 的基本特性 基于链表实现&#xff1a;LinkedList 使用双向…...

多线程基础面试题剖析

一、线程的创建方式有几种 创建线程的方式有两种&#xff0c;一种是继承Thread&#xff0c;一种是实现Runable 在这里推荐使用实现Runable接口&#xff0c;因为java是单继承的&#xff0c;一个类继承了Thread将无法继承其他的类&#xff0c;而java可以实现多个接口&#xff0…...

.NET SixLabors.ImageSharp v1.0 图像实用程序控制台示例

使用 C# 控制台应用程序示例在 Windows、Linux 和 MacOS 机器上处理图像&#xff0c;包括创建散点图和直方图&#xff0c;以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 1.0.4&#xff09;添加到.NET Core 3.1/ …...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...