【鱼眼镜头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)的投影模型。全向相机能够捕捉到更广阔的视野,通常用于机器人、虚拟现实和增强现实等领域。让我们逐步解释这个公式的含义:
-
投影函数 g g g:
- 函数 g g g描述了传感器平面上的点 u ′ ′ u'' u′′与从视点 O O O到场景点 X X X的向量 p p p之间的关系。
- 这个函数捕捉了相机如何将三维场景点 X X X投影到二维传感器平面上的过程。
-
全向相机模型:
λ ⋅ 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(用齐次坐标表示)投影到二维图像平面上。
- 这里, λ \lambda λ是一个正的比例因子,表示从视点 O O O到场景点 X X X的距离。
-
齐次坐标:
- 场景点 X X X用齐次坐标表示,即 X ∈ R 4 X \in \mathfrak{R}^4 X∈R4。齐次坐标允许我们用一个统一的框架表示点和向量,并且可以方便地进行透视投影和其他线性变换。
-
透视投影矩阵 P P P:
- 矩阵 P P P将三维空间中的点 X X X投影到二维图像平面上。这个矩阵包含了相机的内参(如焦距、主点)和外参(如相机的位置和方向)。
总的来说,这个公式描述了全向相机如何通过投影函数 g g g和透视投影矩阵 P P P将三维场景点 X X X映射到二维传感器平面上的过程。这个过程是计算机视觉和图像处理中的基础,用于从图像中恢复三维场景信息。
-
投影函数 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′) 描述了传感器平面上的点如何映射到三维空间中的深度。
-
旋转对称性假设:
- 假设函数 f f f 仅通过 (\rho’ = \sqrt{u’^2 + v’^2}) 依赖于 u ′ u' u′ 和 v ′ v' v′。
- 这意味着函数 g g g 是关于传感器轴旋转对称的,即传感器的响应在圆周方向上是一致的。
-
坐标系和变换:
- 图1(a) 显示了反射折射相机系统中的坐标系。
- 图1(b) 显示了传感器平面,使用度量坐标。
- 图1© 显示了相机图像平面,使用像素坐标。
- 图1(b) 和 © 之间通过仿射变换相关联,这意味着它们之间存在线性变换和平移。
-
多项式函数 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) 是从传感器轴到点的度量距离。
-
投影模型:
λ ⋅ [ 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 λ⋅ u′v′w′ =λ⋅g(Au′+t)=λ⋅[(Au′+t)f(u′,v′)]=P⋅X,λ>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是用ρ来进行多项式近似
代码功能详解
-
输入参数:
m
:图像平面上的二维点(像素坐标),大小为 (2 \times N),其中 (N) 是点的数量。ocam_model
:一个结构体,包含相机的内参和畸变参数,具体包括:ss
:多项式系数,用于描述相机的畸变模型。xc
,yc
:图像中心点的坐标(主点)。width
,height
:图像的宽度和高度。c
,d
,e
:仿射变换矩阵的参数。
-
主要步骤:
-
提取参数:
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,表示这些向量位于单位球面上。
-
-
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= u′v′a0+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 由多项式畸变模型计算得出。
- 全部代码
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)) ];
这个函数的主要功能是将图像平面上的二维点(像素坐标)转换为三维空间中的单位向量(光线方向)。具体步骤包括:
- 通过仿射变换将像素坐标转换为归一化的度量坐标。
- 使用多项式畸变模型将归一化的二维点映射到三维空间中的光线方向。
- 将三维向量归一化到单位球面上。
这种转换通常用于全向相机的几何校正和三维重建任务中。
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 空间中的光线方向(即从相机中心出发的单位向量)。这个模型的核心在于:
-
2D 到 3D 的映射:
- 通过多项式函数 f ( ρ ′ ) f(\rho') f(ρ′) 来描述鱼眼图像的畸变特性。
- 这里的 $\rho’ = \sqrt{u’^2 + v’^2} $ 是归一化的图像平面上的径向距离。
- 多项式 f ( ρ ′ ) f(\rho') f(ρ′) 将 ρ ′ \rho' ρ′映射到第三维(即光线方向的 ( z ) 分量),从而将 2D 图像点转换为 3D 光线方向。
-
高阶多项式:
- 对于大视角(如 190 度的鱼眼相机),Scaramuzza 模型通常使用高阶多项式(如 12 阶或更高)来精确描述畸变。
- 这是因为鱼眼相机的畸变在大视角下非常显著,低阶多项式无法准确拟合。
-
目标:
- Scaramuzza 模型的主要目标是将鱼眼图像上的点映射到 3D 空间中的光线方向,从而为后续的几何校正、三维重建或其他计算机视觉任务提供基础。
与 Kannala-Brandt 模型的对比
Kannala-Brandt 模型也是一种经典的鱼眼相机模型,但它更侧重于 3D 到 2D 的投影:
-
3D 到 2D 的映射:
- Kannala-Brandt 模型使用入射光线与相机光轴(Z 轴)的夹角 ( \theta ) 来描述投影过程。
- 通过多项式函数 r ( θ ) r(\theta) r(θ)将 θ \theta θ 映射到图像平面上的径向距离 r r r。
-
多项式近似:
- Kannala-Brandt 模型的多项式通常阶数较低(如 4 阶或 6 阶),因为它的目标是描述 3D 到 2D 的投影,而不是直接处理鱼眼图像的畸变。
-
目标:
- Kannala-Brandt 模型的主要目标是建模相机的投影过程,用于相机标定和几何校正。
Scaramuzza 模型的独特之处
Scaramuzza 模型的独特之处在于:
-
2D 到 3D 的逆向映射:
- 它直接从鱼眼图像上的 2D 点出发,通过多项式映射到 3D 空间中的光线方向。
- 这种思路更适合处理鱼眼图像的畸变校正和几何变换。
-
高精度拟合:
- 由于鱼眼图像的畸变在大视角下非常复杂,Scaramuzza 模型使用高阶多项式来确保高精度拟合。
-
灵活性:
- Scaramuzza 模型不依赖于具体的相机几何结构(如 Kannala-Brandt 模型中的光轴夹角 θ \theta θ,而是直接从图像数据出发,因此更具灵活性。
Scaramuzza 的意图
Scaramuzza 的模型确实传达了一种思路:通过多项式映射将鱼眼图像上的 2D 点转换为其他坐标系(如 3D 光线方向或单位球面)。这种思路的核心在于:
-
直接处理鱼眼图像的畸变:
- 通过高阶多项式精确描述鱼眼图像的畸变特性。
-
为后续任务提供基础:
- 将鱼眼图像上的点映射到 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 的意…...
WPF创建自定义类和控件及打包成dll引用
WPF创建自定义类和控件及打包成dll引用 一、前言二、创建自定义类和控件并生成dll文件2.1创建类库项目2.2创建自定义类和控件2.3生成dll文件 三、在其他项目中引用3.1添加dll文件引用3.2cs文件中引用命名空间3.3XAML文件中引用命名空间 一、前言 出于一些代码复用的需求&#…...
家里WiFi信号穿墙后信号太差怎么处理?
一、首先在调制解调器(俗称:猫)测试网速,网速达不到联系运营商; 二、网线影响不大,5类网线跑500M完全没问题; 三、可以在卧室增加辅助路由器(例如小米AX系列)90~200元区…...
C++初阶——简单实现string
简单实现std::string类及一些常用的成员函数。 迭代器,使用指针简单代替。 目录 1、String.h 2、String.cpp 3、Test.cpp 1、String.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1#include <iostream> #include <assert.h>using namespace s…...
浏览器支持的通讯协议
浏览器支持的通讯协议 1. HTTP(HyperText Transfer Protocol) 版本 HTTP/1.0:每次请求都需要重新建立连接。HTTP/1.1:支持持久连接(Keep-Alive),减少连接开销。HTTP/2:多路复用&am…...
18.Python实战:实现年会抽奖系统
目录结构 python/ ├── sql/ │ └── table.sql # 创建数据库及数据表 ├── config/ │ └── __init__.py # 数据库和Flask配置 ├── static/ │ ├── style.css # 样式文件 │ └── script.js # JavaScript脚本…...
微信小程序地图标记点,安卓手机一次性渲染不出来的问题
问题描述: 如果微信小程序端,渲染的标记物太多,安卓手机存在标记物不显示的问题,原因初步判断是地图还没有渲染完,标记物数据已经加载完了,导致没有在地图上显示。 解决办法: 使用map组件的b…...
机器翻译同样的文本,是从英语翻译成日语更准确还是中文翻译成日语更准确
在大多数情况下,从英语翻译成日语会比从中文翻译成日语更准确,原因如下: 1. 语言结构的相似性 英语和日语的句子结构更接近,特别是在语法、从句使用、定语位置等方面。例如,日语和英语都使用 SVO 结构(主…...
ROS基本功能
1.Topic话题与Message消息(主要通讯方式) 基本规则 发布消息的步骤 常用工具 话题的订阅 使用launch启动多个节点...
C++字符串处理指南:从基础操作到性能优化——基于std::string的全面解析
博主将从C标准库中的 std::string 出发,详细探讨字符串的处理方法,涵盖常见操作、性能优化和实际应用场景。以下内容将围绕std::string 的使用展开,结合代码示例进行说明。 一、std::string 的基本操作 1.1 创建与初始化 std::string 提供了…...
语言大模型基础概念 一(先了解听说过的名词都是什么)
SFT(监督微调)和RLHF(基于人类反馈的强化学习)的区别 STF(Supervised Fine-Tuning)和RLHF(Reinforcement Learning from Human Feedback)是两种不同的模型训练方法,分别…...
sql语句的执行顺序
完整的sql语句执行顺序 SELECT DISTINCT column1, column2, aggregate_function(column3) FROM table1JOIN table2 ON table1.column table2.column WHERE condition GROUP BY column1, column2 HAVING group_condition ORDER BY column1, column2 LIMIT offset, count;FROM子…...
更高效实用 vscode 的常用设置
VSCode 可以说是文本编辑神器, 不止程序员使用, 普通人用其作为文本编辑工具, 更是效率翻倍. 这里分享博主对于 VSCode 的好用设置, 让 VSCode 如虎添翼 进入设置 首先进入设置界面, 后续都在这里进行配置修改 具体设置 每项配置通过搜索关键字, 来快速定位配置项 自动保存…...
Next.js【详解】CSS 样式方案
全局样式 Global CSS 默认已创建,即 src\app\globals.css,可根据需要修改 默认在全局布局中导入 src\app\layout.tsx import "./globals.css";组件样式 CSS Modules 新建文件 src\app\test\styles.module.css .red {color: red;}导入目标页面…...
铁塔电单车协议对接电单车TCP json协议对接成熟充电桩系统搭建低速充电桩TCP 接口规范
低速充电桩 TCP 接口规范 2019 年 9 月 10 日 目录 低速充电桩 1 2) 概述 2 • 协议服务器(IOT_Server) 6 • 通讯报文原则 6 • 报文协议说明 6 报文中所有数值类型为十进制; 6报文中不允许使用转义字符,如\n、\t、\r、\s; 6 • 报文类型…...
CTF-web:java-h2 堆叠注入rce -- N1ctf Junior EasyDB
代码存在sql注入 // 处理登录表单的POST请求PostMapping({"/login"})public String handleLogin(RequestParam String username, RequestParam String password, HttpSession session, Model model) throws SQLException {// 验证用户凭据if (this.userService.valid…...
【异或数列——博弈论】
题目 思路 异或和为0(即每一位都有偶数个1):平局最高有效位只有唯一的1:先手必胜最高有效位有奇数个1,偶数个0:先手必胜 若先选1产生优势,则剩下偶数个1,偶数个0:对手选…...
2024 年 9 月青少年软编等考 C 语言三级真题解析
目录 T1. 爆气球思路分析T2. 乘法小宇宙思路分析T3. 有多少坑思路分析T4. 势均力敌思路分析T5. 买地攻略思路分析T1. 爆气球 爆气球对孩子们来说是很好玩的游戏。假设有 n n n 只气球被布置在一条直线上,游戏的目标很简单,就是爆掉尽可能多的气球。但是这里我们加一条特殊的…...
JavaScript设计模式 -- 外观模式
在实际开发中,往往会遇到多个子系统协同工作时,直接操作各个子系统不仅接口繁琐,还容易导致客户端与内部实现紧密耦合。**外观模式(Facade Pattern)**通过为多个子系统提供一个统一的高层接口,将复杂性隐藏…...
在 Vue 项目中使用 SQLite 数据库的基础应用
目录 一、环境准备二、数据库连接与操作1. 创建数据库连接2. 创建表3. 插入数据4. 查询数据5. 更新数据6. 删除数据 三、在 Vue 组件中使用 SQLite 一、环境准备 安装 Node.js 和 npm:确保已安装 Node.js 和 npm。 创建 Vue 项目:使用 Vue CLI 创建一个…...
《安富莱嵌入式周报》第350期:Google开源Pebble智能手表,开源模块化机器人平台,开源万用表,支持10GHz HRTIM的单片机,开源CNC控制器
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1YPKEeyEeM/ 《安富莱嵌入式周报》第350期:Google开…...
多线程基础面试题剖析
一、线程的创建方式有几种 创建线程的方式有两种,一种是继承Thread,一种是实现Runable 在这里推荐使用实现Runable接口,因为java是单继承的,一个类继承了Thread将无法继承其他的类,而java可以实现多个接口࿰…...
C++ Primer 函数重载
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
10bit VS 8bit 视频:色彩深度的较量,谁才是视觉盛宴的王者?
10bit 和 8bit 视频 10bit 视频和 8bit 视频的主要区别在于色彩深度和细节表现能力。10bit 视频具有更高的色彩深度和更丰富的细节表现,能够提供更平滑的色彩过渡和更真实的图像质量,但需要更多的存储空间和带宽。8bit 视频则在存储和传输方面更加高效,适合于对存储空间和带…...
从零开始-将小爱接入大模型
文章目录 前言一、学习教程二、docker安装二、项目下载和配置三、文件修改文件.env.exampledeepseek模型 注册gitee并获取密钥 文件.migpt.example.js连接小爱同学 三、运行项目创建目录启动docker容器 总结 前言 基于当前人工智能的发展,大模型使用越来越方便&…...
关于 IoT DC3 中设备(Device)的理解
在物联网系统中,设备(Device)是一个非常宽泛的概念,它可以指代任何能够接入系统并进行数据交互的实体。包括但不限于手机、电脑、服务器、网关、硬件设备甚至是某些软件程序等所有能接入到该平台的媒介。 内容 定义 目的 示例 …...
北斗导航 | 周跳探测算法(matlab源码)
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 周跳 1. 高次差法2. 相位减伪距法3. TurboEdit算法(MW+GF组合)4. 多项…...
Centos搭建python环境
在 CentOS 上配置 Python 环境可以通过以下步骤完成: 1. 检查系统自带 Python 版本 CentOS 7/8 可能已经自带了 Python: python3 --version 如果没有,或者版本过低,可以手动安装。 2. 安装 Python(推荐࿰…...
Python 字典思维导图
在本章中,你将学习能够将相关信息关联起来的Python字典。你将学习如何访问和修改字典中的信息。鉴于字典可存储的信息量几乎不受限制,因此我们会演示如何遍 历字典中的数据。另外,你还将学习存储字典的列表、存储列表的字典和存储字典的字典。…...
springboot与springcloud对应版本
Spring Boot 与 Spring Cloud Alibaba 版本对应关系 请根据您使用的 Spring Boot 版本,选择兼容的 Spring Cloud Alibaba 版本: Spring Boot Version Spring Cloud Alibaba Version Spring Cloud Version 3.0.2 2022.0.0.0 Spring Cloud 2022.0.0 3.0.2…...
verilog程序设计及SystemVerilog验证
1.Verilog测试程序设计基础 1.1Testbench及其结构 在仿真的时候Testbench用来产生测试激励给待验证设计( Design Under Verification, DUV),或者称为待测设计(Design UnderTest, DUT) 。 测试程序的一般结构: Testbench是一个测试平台,信号…...
游戏引擎学习第104天
Z轴有点悬而未决 我们正在进行渲染器相关的工作。之前我们已经完成了法线贴图的代码,虽然基本完成,但还有一些与光照相关的工作待完成。目前,天空和地面部分的光照处理已经相对正常,但局部光源的处理还没有做好。 为了进行光照部…...
OpenAI GPT-4.5技术详解与未来展望
一、GPT-4.5的技术突破 OpenAI在人工智能领域的持续创新再次引领了技术潮流。近期,OpenAI内部已经成功实现了GPT-4.5的开发,这一版本相较于前代在多个方面实现了显著的技术突破。 GPT-4.5在算法优化和数据处理上进行了多项创新,使得模型在对自然语言的理解上,尤其是在…...
【科技革命】颠覆性力量与社会伦理的再平衡
目录 2025年科技革命:颠覆性力量与社会伦理的再平衡目录技术突破全景图认知智能的范式转移量子霸权实现路径生物编程技术革命能源结构重构工程 产业生态链重构医疗健康新范式教育系统智能进化金融基础设施变革制造范式革命 科技伦理与文明演进 2025年科技革命&#…...
好好说话:深度学习扫盲
大创项目是和目标检测算法YOLO相关的,浅浅了解了一些有关深度学习的知识。在这里根据本人的理解做一些梳理。 深度学习是什么? 之前经常听到AI,机器学习,深度学习这三个概念,但是对于三者的区别一直很模糊。 AI&…...
一款基于若依的wms系统
Wms-Ruoyi-仓库库存管理 若依wms是一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单。毫无保留给个人及企业免费使用。 前端采用Vue、Element UI。后端采用Spring Boot、Spring Security、Redis & Jwt。权限认证使用Jwt,支持多终…...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑥】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase06 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-006测试用例 用例ID测试场景验证要点参考条款预期…...
img标签的title和alt
img标签的title和alt 显示上 title:鼠标移入到图片上时候显示的内容; alt:图片无法加载时候显示的内容; <div class"box"><div><!-- title --><h3>title</h3><img src"./image/poster.jpg" title"这是封…...
redis cluster测试
集群节点信息这时候停掉一个master 172.30.60.31 从集群信息集中我们可以看到172.30.60.31的slave是172.30.60.41,查看41的日志,发现他成为了新的master 这时候我们在将172.30.60.41也杀死,会发现集群异常了 尝试把172.30.60.31启动ÿ…...
harmonyOS的文件的增、删、读、写相关操作(fs/content)
注意: 操作harmonyOS的文件只能对app沙箱内的文件进行操作 牵扯到两个支持点: fs和content这两个API; 具体的操作方法看下图: 创建文件 //js 引入 import fs from "ohos.files.fs" import featureAbility from "ohos.ability.featureAbility"; // 上下…...
12. Function Call实践
本文主要讲解大模型的function call能力,包括使用国内外在线模型和本地模型,以及如何微调以增强大模型的function call能力。 回顾下大模型学习思路: 1. 环境准备 1.1 平台上【模型调试】中创建 2. 调用国内外大模型测试 2.1 调用GPT-4 代…...
随机生成多孔介质matlab程序
matlab生成随机分布纤维代码,用于后续模拟处理 资源文件列表 随机生成多孔介质matlab程序.pdf , 5821...
华为云kubernetes基于keda自动伸缩deployment副本(监听redis队列长度)
1 概述 KEDA(Kubernetes-based Event-Driven Autoscaler,网址是https://keda.sh)是在 Kubernetes 中事件驱动的弹性伸缩器,功能非常强大。不仅支持根据基础的CPU和内存指标进行伸缩,还支持根据各种消息队列中的长度、…...
是时候说再见了
说再见 2018 to 2025 2018:学习 2018年开始读研。师兄师姐们说可以写写CSDN博客,对找工作也有帮助。于是在12月4日,发布了自己的第一篇文章[翻译] 神经网络与深度学习 首页 - Index。当时还在学习各种基础知识,看到了这个英文文…...
数据结构与算法-栈与队列的应用递归表达式求值
参考学习:B站-逊哥带你学编程 栈与队列的应用 题1: 答案:B 题2: 答案:C 题3: 答案:D 题4: 答案:C 题5: 答案:B 题6: 答案&…...
vue3.x 的shallowReactive 与 shallowRef 详细解读
在 Vue 3.x 中,shallowReactive 和 shallowRef 是两个用于创建浅层响应式数据的 API。它们与 reactive 和 ref 类似,但在处理嵌套对象时的行为有所不同。以下是它们的详细解读和示例。 1. shallowReactive 作用 shallowReactive 创建一个浅层响应式对…...
前缀和(Prefix Sum)算法笔记C++
前缀和(Prefix Sum)算法介绍 前缀和是一种预处理技术, 用于快速计算数组中任意子区间的元素之和. 它通过一次遍历创建一个辅助数组来存储从数组起始位置到当前索引位置所有元素的累加和, 从而使得后续查询操作的时间复杂度降低至 O ( 1 ) O(1) O(1). 定义 对于给定的数组 n…...
负载测试工具有哪些?
Apache JMeter Apache JMeter 是一款开源的性能测试工具,主要用于对 Web 应用程序进行功能、负载和压力测试。JMeter 支持多种协议和技术,包括 HTTP, HTTPS, FTP 和 WebSocket 等。通过模拟大量并发用户访问来评估应用程序的表现1。 jmeter -n -t testp…...
ROS进阶:使用URDF和Xacro构建差速轮式机器人模型
前言 本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。 差速轮式机器人:两轮差速底盘由两个动力轮位于底盘左…...
windows编译使用gtest
下载: Release v1.12.1 google/googletest GitHub 编译: 编译源码中的CMakeLists.txt: 编译后生成的目录是BUILD: *(编译之前需要安装cmake: ) 关注下面这两个目录: 在vs中打开: 配置属性: 点击编译&a…...