当前位置: 首页 > 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/ …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...