计算机视觉7——齐次坐标与相机内外参
一、透视投影
透视投影(Perspective Projection)是计算机视觉和图形学中描述三维物体在二维平面成像的基础模型,其核心思想是模拟人类视觉系统的成像原理——中心投影。具体而言,三维空间中的点通过一个固定的投影中心(相机光心)投射到成像平面上,形成近大远小的视觉效果。
(一)透视投影的性质
1.中心投影特性
透视投影的所有投影线(从物体点到投影中心的连线)交汇于一点,即投影中心 O c O_c Oc(在相机模型中对应光心)。设成像平面为 Z = f Z = f Z=f(焦距为 f f f),投影中心位于原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0),则三维点 P ( X , Y , Z ) P(X,Y,Z) P(X,Y,Z) 在成像平面的投影点 p ( x , y ) p(x,y) p(x,y) 满足:
x = f X Z , y = f Y Z x = f \frac{X}{Z}, \quad y = f \frac{Y}{Z} x=fZX,y=fZY
其中 Z Z Z 是点 P P P 到投影中心的深度值,决定了投影的缩放比例。
2.非线性比例变换
透视投影对不同深度的物体产生非线性缩放:深度 Z Z Z 越大(物体越远),投影后的尺寸越小。例如,两个相同大小的物体,距离相机更远的那个在图像中显得更小,这符合人类视觉的近大远小直觉。
3.平行线汇聚于消逝点
三维空间中平行于某一方向的直线,在透视投影下会汇聚于图像平面上的一个点,称为消逝点(Vanishing Point)。例如,铁轨在远处汇聚于地平线的一点,这是透视投影最典型的视觉特征。
4.保直线性
三维空间中的直线经过透视投影后仍为直线,但曲线可能变为曲线(如圆可能投影为椭圆)。
5.有限视野与透视缩短
透视投影的视野范围由成像平面的大小和焦距决定,超出视野的物体不会被投影。此外,与成像平面不垂直的物体(如倾斜的长方体)会发生"透视缩短",即物体在深度方向的尺寸在图像中被压缩。
(二)消逝点的概念
1. 消逝点的定义
消逝点是三维空间中一组平行直线在透视投影下的汇聚点。数学上,设三维空间中平行直线的方向向量为 d = ( d x , d y , d z ) \mathbf{d} = (d_x, d_y, d_z) d=(dx,dy,dz),则其对应的消逝点是该方向向量在投影平面上的"无穷远点"的投影。
2. 消逝点的计算
假设相机光心在原点,成像平面为 Z = f Z = f Z=f,平行直线的方向向量为 d = ( d x , d y , d z ) \mathbf{d} = (d_x, d_y, d_z) d=(dx,dy,dz)。由于直线平行,其参数方程可表示为 P ( t ) = P 0 + t d P(t) = P_0 + t\mathbf{d} P(t)=P0+td( t t t 为参数)。当 t → ∞ t \to \infty t→∞ 时,点 P ( t ) P(t) P(t) 的投影坐标为:
x = f d x d z , y = f d y d z ( 假设 d z ≠ 0 ) x = f \frac{d_x}{d_z}, \quad y = f \frac{d_y}{d_z} \quad (\text{假设 } d_z \neq 0) x=fdzdx,y=fdzdy(假设 dz=0)
若 d z = 0 d_z = 0 dz=0(即直线平行于成像平面),则消逝点位于无穷远处,对应齐次坐标系中的无穷远点(见第二部分齐次坐标系)。
3. 消逝点的应用
消逝点在计算机视觉中具有重要作用:
- 相机标定:通过检测场景中的消逝点(如建筑物的平行线),可以估计相机的内参和外参。
- 场景理解:利用消逝点判断物体的方向和空间结构,例如区分水平、垂直和深度方向的平行线。
- 三维重建:通过多个消逝点的几何关系,恢复场景的三维结构。
(三)数学推导
1. 针孔相机模型的几何推导
透视投影的数学基础是针孔相机模型(Pinhole Camera Model),假设光线通过一个无限小的针孔投射到成像平面,忽略镜头畸变。设:
- 世界坐标系中的点 P w = ( X w , Y w , Z w ) P_w = (X_w, Y_w, Z_w) Pw=(Xw,Yw,Zw)
- 相机坐标系以光心 O c O_c Oc 为原点,成像平面位于 Z = f Z = f Z=f 处(焦距 f f f),图像坐标系以光心在成像平面的垂足为原点 O i O_i Oi,像素坐标系以图像左上角为原点 O u O_u Ou,像素尺寸为 ( d x , d y ) (dx, dy) (dx,dy)。
根据相似三角形原理(图1),相机坐标系下的点 P c = ( X , Y , Z ) P_c = (X, Y, Z) Pc=(X,Y,Z) 在成像平面的投影为:
x = − f X Z , y = − f Y Z x = -f \frac{X}{Z}, \quad y = -f \frac{Y}{Z} x=−fZX,y=−fZY
(负号表示成像平面位于光心后方,实际计算中常将成像平面置于光心前方,符号取正,即"虚拟成像平面")
2. 齐次坐标下的透视投影矩阵
为了将平移、旋转等变换统一为矩阵乘法,并处理无穷远点(如消逝点),引入齐次坐标系(见第二部分)。三维点的齐次坐标为 P c = ( X , Y , Z , 1 ) T \mathbf{P}_c = (X, Y, Z, 1)^T Pc=(X,Y,Z,1)T,投影到二维图像平面的齐次坐标为 p = ( x , y , z ) T \mathbf{p} = (x, y, z)^T p=(x,y,z)T,满足:
p = K [ I ∣ 0 ] P c \mathbf{p} = \mathbf{K} [\mathbf{I} \mid \mathbf{0}] \mathbf{P}_c p=K[I∣0]Pc
其中 K \mathbf{K} K 是相机内参矩阵(见第三部分), [ I ∣ 0 ] [\mathbf{I} \mid \mathbf{0}] [I∣0] 表示相机坐标系到图像平面的投影。更一般地,考虑世界坐标系到相机坐标系的外参变换(旋转矩阵 R \mathbf{R} R 和平移向量 t \mathbf{t} t),透视投影的完整变换为:
p = K [ R ∣ t ] P w \mathbf{p} = \mathbf{K} [\mathbf{R} \mid \mathbf{t}] \mathbf{P}_w p=K[R∣t]Pw
其中 [ R ∣ t ] [\mathbf{R} \mid \mathbf{t}] [R∣t] 是外参矩阵, P w = ( X w , Y w , Z w , 1 ) T \mathbf{P}_w = (X_w, Y_w, Z_w, 1)^T Pw=(Xw,Yw,Zw,1)T 是世界坐标系下的齐次坐标。
展开矩阵运算,透视投影的坐标变换可表示为:
{ u = f u X c Z c + u 0 v = f v Y c Z c + v 0 \begin{cases} u = f_u \frac{X_c}{Z_c} + u_0 \\ v = f_v \frac{Y_c}{Z_c} + v_0 \end{cases} {u=fuZcXc+u0v=fvZcYc+v0
其中 ( u , v ) (u, v) (u,v) 是像素坐标, f u , f v f_u, f_v fu,fv 是焦距在像素单位下的尺度因子, ( u 0 , v 0 ) (u_0, v_0) (u0,v0) 是主点坐标(见第三部分相机内参)。
(四)正投影与弱透视投影
1. 正投影(Orthographic Projection)
正投影是透视投影的特例,假设投影中心位于无穷远处,所有投影线互相平行且垂直于成像平面。其数学表达式为:
x = X , y = Y x = X, \quad y = Y x=X,y=Y
忽略深度信息 Z Z Z,适用于工业设计、工程制图等需要保持物体真实尺寸的场景。正投影矩阵为:
P ortho = [ 1 0 0 0 0 1 0 0 0 0 0 1 ] \mathbf{P}_{\text{ortho}} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Portho= 100010000001
但实际应用中,正投影常包含平移和缩放变换,以适配不同的坐标系范围。
2. 弱透视投影(Weak Perspective Projection)
弱透视投影是透视投影的近似,适用于物体距离相机较远且深度变化较小的场景(如航拍图像)。其假设:
- 物体到相机的距离远大于物体自身尺寸,即深度 Z ≈ Z 0 Z \approx Z_0 Z≈Z0(常数);
- 忽略深度引起的缩放差异,用平均深度 Z 0 Z_0 Z0 代替所有点的深度。
弱透视投影的变换过程分为两步:
- 首先将三维点正投影到与成像平面平行的平面(忽略深度),得到 ( X , Y ) (X, Y) (X,Y);
- 然后按比例 f / Z 0 f / Z_0 f/Z0 缩放到成像平面,即:
x = f Z 0 X , y = f Z 0 Y x = \frac{f}{Z_0} X, \quad y = \frac{f}{Z_0} Y x=Z0fX,y=Z0fY
弱透视投影的误差来源于深度变化 Δ Z = Z − Z 0 \Delta Z = Z - Z_0 ΔZ=Z−Z0,当 Δ Z ≪ Z 0 \Delta Z \ll Z_0 ΔZ≪Z0 时,近似效果较好。相比透视投影,弱透视投影计算更简单,广泛应用于人脸检测、人体姿态估计等任务。
二、齐次坐标系
(一)齐次坐标系的定义
1. 为什么引入齐次坐标系?
在欧几里得几何中,平移、旋转、缩放等变换可通过矩阵乘法表示,但平移变换对向量的作用是加法( p ′ = p + t \mathbf{p}' = \mathbf{p} + \mathbf{t} p′=p+t),无法用单一矩阵乘法实现。齐次坐标系通过在n维空间中引入第n+1维坐标,将平移转换为矩阵乘法,并统一处理无穷远点(如透视投影中的消逝点)。
2. 定义
- n维点的齐次坐标:将n维点 ( x 1 , x 2 , … , x n ) (x_1, x_2, \dots, x_n) (x1,x2,…,xn) 表示为n+1维向量 ( x 1 , x 2 , … , x n , w ) (x_1, x_2, \dots, x_n, w) (x1,x2,…,xn,w),其中 w ≠ 0 w \neq 0 w=0,且齐次坐标 ( x 1 w , x 2 w , … , x n w , w ) (x_1w, x_2w, \dots, x_nw, w) (x1w,x2w,…,xnw,w) 与 ( x 1 , x 2 , … , x n , 1 ) (x_1, x_2, \dots, x_n, 1) (x1,x2,…,xn,1) 表示同一点(通过除以 w w w 归一化)。
- 无穷远点:当 w = 0 w = 0 w=0 时,齐次坐标表示无穷远点,例如二维空间中方向向量 ( a , b ) (a, b) (a,b) 对应无穷远点 ( a , b , 0 ) (a, b, 0) (a,b,0)。
3. 齐次坐标的等价性
两个齐次坐标 ( x 1 , y 1 , w 1 ) (x_1, y_1, w_1) (x1,y1,w1) 和 ( x 2 , y 2 , w 2 ) (x_2, y_2, w_2) (x2,y2,w2) 表示同一点,当且仅当存在非零常数 k k k 使得 x 2 = k x 1 , y 2 = k y 1 , w 2 = k w 1 x_2 = kx_1, y_2 = ky_1, w_2 = kw_1 x2=kx1,y2=ky1,w2=kw1。
(二)齐次坐标系下的点、线、几何变换
1. 二维齐次坐标系中的点与线
- 点:二维点 ( u , v ) (u, v) (u,v) 的齐次坐标为 ( u , v , 1 ) (u, v, 1) (u,v,1),无穷远点为 ( a , b , 0 ) (a, b, 0) (a,b,0)。
- 线:二维直线方程 a x + b y + c = 0 ax + by + c = 0 ax+by+c=0 的齐次表示为 ( a , b , c ) (a, b, c) (a,b,c),满足 a u + b v + c w = 0 a u + b v + c w = 0 au+bv+cw=0(点 ( u , v , w ) (u, v, w) (u,v,w) 在直线上)。
- 点与线的关系:点 p = ( u , v , w ) T \mathbf{p} = (u, v, w)^T p=(u,v,w)T 在直线 l = ( a , b , c ) T \mathbf{l} = (a, b, c)^T l=(a,b,c)T 上,当且仅当 l T p = 0 \mathbf{l}^T \mathbf{p} = 0 lTp=0。
2. 几何变换的齐次矩阵表示
在二维空间中,常见几何变换可表示为3×3矩阵对齐次坐标的作用:
- 平移(Translation)
T ( t x , t y ) = [ 1 0 t x 0 1 t y 0 0 1 ] , p ′ = T p T(t_x, t_y) = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix}, \quad \mathbf{p}' = T \mathbf{p} T(tx,ty)= 100010txty1 ,p′=Tp
-
缩放(Scaling)
S ( s x , s y ) = [ s x 0 0 0 s y 0 0 0 1 ] S(s_x, s_y) = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{bmatrix} S(sx,sy)= sx000sy0001 -
旋转(Rotation)
绕原点旋转角度 θ \theta θ:
R ( θ ) = [ cos θ − sin θ 0 sin θ cos θ 0 0 0 1 ] R(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} R(θ)= cosθsinθ0−sinθcosθ0001
-
剪切(Shearing)
H ( s x y , s y x ) = [ 1 s x y 0 s y x 1 0 0 0 1 ] H(s_{xy}, s_{yx}) = \begin{bmatrix} 1 & s_{xy} & 0 \\ s_{yx} & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} H(sxy,syx)= 1syx0sxy10001 -
投影变换(Projective Transformation)
更一般的线性变换,包括透视变换,如二维透视变换矩阵:
P = [ a b c d e f g h i ] , 其中 p ′ = P p , 归一化后 ( u ′ , v ′ , 1 ) = ( a u + b v + c g u + h v + i , d u + e v + f g u + h v + i , 1 ) P = \begin{bmatrix} a & b & c \\ d & e & f \\ g & h & i \end{bmatrix}, \quad \text{其中} \mathbf{p}' = P \mathbf{p}, \text{归一化后} (u', v', 1) = \left( \frac{a u + b v + c}{g u + h v + i}, \frac{d u + e v + f}{g u + h v + i}, 1 \right) P= adgbehcfi ,其中p′=Pp,归一化后(u′,v′,1)=(gu+hv+iau+bv+c,gu+hv+idu+ev+f,1)
3. 三维齐次坐标系
三维点 ( X , Y , Z ) (X, Y, Z) (X,Y,Z) 的齐次坐标为 ( X , Y , Z , 1 ) (X, Y, Z, 1) (X,Y,Z,1),无穷远点为 ( X , Y , Z , 0 ) (X, Y, Z, 0) (X,Y,Z,0)。三维几何变换(如旋转、平移、缩放)通过4×4矩阵表示,例如:
- 三维平移矩阵:
T ( t x , t y , t z ) = [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] T(t_x, t_y, t_z) = \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} T(tx,ty,tz)= 100001000010txtytz1 - 绕x轴旋转 θ \theta θ 的矩阵:
R x ( θ ) = [ 1 0 0 0 0 cos θ − sin θ 0 0 sin θ cos θ 0 0 0 0 1 ] R_x(\theta) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta & 0 \\ 0 & \sin\theta & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Rx(θ)= 10000cosθsinθ00−sinθcosθ00001
(三)其他变换的齐次坐标表示
1. 透视投影变换矩阵
在三维到二维的透视投影中,齐次坐标的变换矩阵可表示为:
P persp = [ f 0 0 0 0 f 0 0 0 0 1 0 ] \mathbf{P}_{\text{persp}} = \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} Ppersp= f000f0001000
该矩阵将相机坐标系下的点 ( X , Y , Z , 1 ) (X, Y, Z, 1) (X,Y,Z,1) 投影到图像平面,得到齐次坐标 ( f X , f Y , Z , 1 ) (fX, fY, Z, 1) (fX,fY,Z,1),归一化后为 ( f X / Z , f Y / Z , 1 ) (fX/Z, fY/Z, 1) (fX/Z,fY/Z,1),即像素坐标的基础。
2. 仿射变换与投影变换的区别
- 仿射变换(Affine Transformation):齐次矩阵的最后一行为 ( 0 , 0 , 0 , 1 ) (0, 0, 0, 1) (0,0,0,1),保持直线和平行性,包含平移、旋转、缩放、剪切。
- 投影变换(Projective Transformation):最后一行可为任意值,允许透视变形,如消逝点的生成,是更一般的变换(仿射变换是投影变换的特例)。
三、相机参数
(一)世界、相机、图像平面、图像坐标系
在计算机视觉中,坐标系的转换是理解相机成像的关键。以下定义四种主要坐标系:
1. 世界坐标系(World Coordinate System, O w X w Y w Z w O_wX_wY_wZ_w OwXwYwZw)
用户自定义的三维坐标系,用于描述场景中物体的位置,原点和坐标轴方向可任意选择(如场景中的某一角点)。
2. 相机坐标系(Camera Coordinate System, O c X c Y c Z c O_cX_cY_cZ_c OcXcYcZc)
以相机光心 O c O_c Oc 为原点,通常定义 Z c Z_c Zc 轴为相机光轴(垂直于成像平面), X c X_c Xc 和 Y c Y_c Yc 轴平行于成像平面的行列方向。
3. 图像平面坐标系(Image Plane Coordinate System, O i X i Y i O_iX_iY_i OiXiYi)
位于相机坐标系的 Z = f Z = f Z=f 处(假设成像平面在光心前方),原点 O i O_i Oi 是光轴与成像平面的交点(主点),单位为物理长度(如毫米)。
4. 像素坐标系(Pixel Coordinate System, O u v O_uv Ouv)
以图像左上角为原点, u u u 轴向右, v v v 轴向下,单位为像素。像素坐标系与图像平面坐标系通过缩放和平移转换(考虑像素尺寸和主点偏移)。
(二)相机外参、相机内参
1. 相机外参(Extrinsic Parameters)
相机外参描述世界坐标系到相机坐标系的刚体变换,包括旋转和平移,即将世界点 P w \mathbf{P}_w Pw 转换为相机点 P c \mathbf{P}_c Pc:
P c = R P w + t \mathbf{P}_c = \mathbf{R} \mathbf{P}_w + \mathbf{t} Pc=RPw+t
其中:
- R \mathbf{R} R 是3×3正交旋转矩阵(满足 R T R = I \mathbf{R}^T \mathbf{R} = \mathbf{I} RTR=I),描述相机的朝向(俯仰、偏航、滚转角度);
- t \mathbf{t} t 是3×1平移向量,描述相机光心在世界坐标系中的位置 t = − R O w \mathbf{t} = - \mathbf{R} \mathbf{O}_w t=−ROw( O w \mathbf{O}_w Ow 是世界坐标系原点在相机坐标系中的位置)。
用齐次坐标表示为:
P c h = [ R t 0 T 1 ] P w h \mathbf{P}_c^h = \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ \mathbf{0}^T & 1 \end{bmatrix} \mathbf{P}_w^h Pch=[R0Tt1]Pwh
其中 P c h = ( X c , Y c , Z c , 1 ) T \mathbf{P}_c^h = (X_c, Y_c, Z_c, 1)^T Pch=(Xc,Yc,Zc,1)T, P w h = ( X w , Y w , Z w , 1 ) T \mathbf{P}_w^h = (X_w, Y_w, Z_w, 1)^T Pwh=(Xw,Yw,Zw,1)T。
2. 相机内参(Intrinsic Parameters)
相机内参描述相机坐标系到像素坐标系的转换,包括焦距、主点位置、像素畸变等,与相机硬件相关,不随相机外部位置变化。
(1)理想针孔模型(无畸变)
假设成像平面与相机坐标系的 Z c Z_c Zc 轴垂直,主点 O i O_i Oi 在图像平面中心,像素为正方形:
- 焦距(Focal Length): f f f(物理单位,如毫米),转换为像素单位为 f u = f / d x f_u = f / dx fu=f/dx, f v = f / d y f_v = f / dy fv=f/dy,其中 d x , d y dx, dy dx,dy 是像素在 X , Y X, Y X,Y 方向的物理尺寸(如毫米/像素)。
- 主点(Principal Point): ( u 0 , v 0 ) (u_0, v_0) (u0,v0),即光轴与成像平面的交点在像素坐标系中的坐标(通常位于图像中心附近)。
转换过程:
- 相机坐标系下的点 P c = ( X c , Y c , Z c ) \mathbf{P}_c = (X_c, Y_c, Z_c) Pc=(Xc,Yc,Zc) 投影到图像平面,得到物理坐标 ( x , y ) = ( f X c / Z c , f Y c / Z c ) (x, y) = (f X_c / Z_c, f Y_c / Z_c) (x,y)=(fXc/Zc,fYc/Zc);
- 转换为像素坐标 ( u , v ) (u, v) (u,v):
u = x d x + u 0 = f u X c Z c + u 0 , v = y d y + v 0 = f v Y c Z c + v 0 u = \frac{x}{dx} + u_0 = f_u \frac{X_c}{Z_c} + u_0, \quad v = \frac{y}{dy} + v_0 = f_v \frac{Y_c}{Z_c} + v_0 u=dxx+u0=fuZcXc+u0,v=dyy+v0=fvZcYc+v0
用齐次矩阵表示为:
[ u v 1 ] = [ f u 0 u 0 0 f v v 0 0 0 1 ] [ X c / Z c Y c / Z c 1 ] \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} f_u & 0 & u_0 \\ 0 & f_v & v_0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_c / Z_c \\ Y_c / Z_c \\ 1 \end{bmatrix} uv1 = fu000fv0u0v01 Xc/ZcYc/Zc1
内参矩阵 K \mathbf{K} K 为:
K = [ f u 0 u 0 0 f v v 0 0 0 1 ] \mathbf{K} = \begin{bmatrix} f_u & 0 & u_0 \\ 0 & f_v & v_0 \\ 0 & 0 & 1 \end{bmatrix} K= fu000fv0u0v01
(2)考虑像素倾斜(非正方形像素)
实际相机中,像素可能存在倾斜(如传感器排列不严格正交),引入倾斜因子 s s s(描述 X , Y X, Y X,Y 方向的耦合)。此时内参矩阵变为:
K = [ f u s u 0 0 f v v 0 0 0 1 ] \mathbf{K} = \begin{bmatrix} f_u & s & u_0 \\ 0 & f_v & v_0 \\ 0 & 0 & 1 \end{bmatrix} K= fu00sfv0u0v01
其中 s = − f u cot θ s = -f_u \cot\theta s=−fucotθ, θ \theta θ 是像素行与列之间的夹角(理想情况 θ = 9 0 ∘ , s = 0 \theta = 90^\circ, s = 0 θ=90∘,s=0)。
(3)镜头畸变(Distortion)
实际镜头存在畸变,主要分为径向畸变(Radial Distortion)和切向畸变(Tangential Distortion):
- 径向畸变:由镜头曲率引起,离图像中心越远畸变越明显,包括桶形畸变(Barrel Distortion)和枕形畸变(Pincushion Distortion)。径向畸变后的坐标为:
{ x distorted = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y distorted = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \begin{cases} x_{\text{distorted}} = x \left( 1 + k_1 r^2 + k_2 r^4 + k_3 r^6 \right) \\ y_{\text{distorted}} = y \left( 1 + k_1 r^2 + k_2 r^4 + k_3 r^6 \right) \end{cases} {xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)
其中 r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2, k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3 是径向畸变系数。 - 切向畸变:由镜头安装误差引起,导致像素点沿切线方向偏移:
{ x distorted = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y distorted = y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y \begin{cases} x_{\text{distorted}} = x + 2 p_1 xy + p_2 (r^2 + 2 x^2) \\ y_{\text{distorted}} = y + p_1 (r^2 + 2 y^2) + 2 p_2 xy \end{cases} {xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy
其中 p 1 , p 2 p_1, p_2 p1,p2 是切向畸变系数。
畸变校正过程:首先通过畸变模型计算理想坐标到畸变坐标的映射,然后反向求解畸变坐标到理想坐标的逆映射,用于图像校正。
(三)完整投影过程
结合外参和内参,世界坐标系下的点 P w \mathbf{P}_w Pw 到像素坐标系 p = ( u , v , 1 ) T \mathbf{p} = (u, v, 1)^T p=(u,v,1)T 的变换为:
p h = K [ R ∣ t ] P w h \mathbf{p}^h = \mathbf{K} [\mathbf{R} \mid \mathbf{t}] \mathbf{P}_w^h ph=K[R∣t]Pwh
其中:
- P w h = ( X w , Y w , Z w , 1 ) T \mathbf{P}_w^h = (X_w, Y_w, Z_w, 1)^T Pwh=(Xw,Yw,Zw,1)T 是世界点的齐次坐标;
- [ R ∣ t ] [\mathbf{R} \mid \mathbf{t}] [R∣t] 是3×4外参矩阵,将世界点转换为相机坐标;
- K \mathbf{K} K 是3×3内参矩阵,将相机坐标投影到像素坐标。
展开后为:
[ u v 1 ] = K [ R t ] [ X w Y w Z w 1 ] = K ( R P w + t ) \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \mathbf{K} \begin{bmatrix} \mathbf{R} & \mathbf{t} \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} = \mathbf{K} \left( \mathbf{R} \mathbf{P}_w + \mathbf{t} \right) uv1 =K[Rt] XwYwZw1 =K(RPw+t)
其中 P w = ( X w , Y w , Z w ) T \mathbf{P}_w = (X_w, Y_w, Z_w)^T Pw=(Xw,Yw,Zw)T 是世界点的三维坐标,除法操作(除以 Z c Z_c Zc)隐含在齐次坐标的归一化过程中。
相关文章:
计算机视觉7——齐次坐标与相机内外参
一、透视投影 透视投影(Perspective Projection)是计算机视觉和图形学中描述三维物体在二维平面成像的基础模型,其核心思想是模拟人类视觉系统的成像原理——中心投影。具体而言,三维空间中的点通过一个固定的投影中心࿰…...
学习笔记—C++—string(一)
目录 string 为什么学习string的类 string类的常用接口 string类对象的常见构造 string类对象的访问及遍历操作 operator[] 迭代器 范围for auto 迭代器(二) string类对象的容量操作 size,length,max_size,capacity,clear基本用法 reserve 提…...
Linux命令-Shell编程
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。 写一个hello.sh脚本: 1.mkdir scripts 2.cd scripts 3.touch hello.sh 4.vim hello.sh #!/bin/bash echo "hello,world" 5.bash hello.sh(…...
基于Django的AI客服租车分析系统
基于Django的AI客服租车分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】AI智能客服与用户交互指导手册 【技术栈】 ①:系统环境:Python 3.8,Django 4.2框架 ②:开发环境&a…...
计算机组成与体系结构:计算机结构的分类(classifications of computer architecture)
目录 Von Neumann Architecture(冯诺依曼结构) Harvard Architecture(哈佛结构) Modified Harvard Architecture(改进哈佛结构) 三种结构对比总结表 💡 从“内存访问结构”角度分类&#x…...
在阿里云和树莓派上编写一个守护进程程序
目录 一、阿里云邮件守护进程 1. 安装必要库 2. 创建邮件发送脚本 mail_daemon.py 3. 设置后台运行 二、树莓派串口守护进程 1. 启用树莓派串口 2. 安装依赖库 3. 创建串口输出脚本 serial_daemon.py 4. 设置开机自启 5. 使用串口助手接收 一、阿里云邮件守护进程 1.…...
Redis 的几种数据类型
Redis 提供了多种数据类型,以支持不同的应用场景。每种数据类型都有其特定的操作方式,并且在内部实现上也有所优化,能够满足不同的业务需求。以下是 Redis 支持的几种常见数据类型: 1. 字符串(String) 描…...
Spring之我见 - Spring Boot Starter 自动装配原理
欢迎光临小站:致橡树 Spring Boot Starter 的核心设计理念是 约定优于配置,其核心实现基于 自动配置(Auto-Configuration) 和 条件化注册(Conditional Registration)。以下是其生效原理: 约定…...
LeRobot 项目部署运行逻辑(二)—— Mobile Aloha 真机部署
LeRobot 在开源项目中详细说明了部署流程,所以首先看一下开源的内容,然后再逐步拆解 首先,LeRobot 开源的硬件是配全部在 examples 文件夹中 包括了 Stretch 3、Aloha and Aloha 2 stationary、SO-100、LeKiwi、Moss v1 等机器人 恰好实验…...
大模型面经 | 介绍一下CLIP和BLIP
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
Java发生OOM是否必然导致JVM退出
Java发生OOM是否必然导致JVM退出? 核心结论 不一定。OOM是否导致JVM退出取决于以下因素: OOM发生的区域JVM启动参数配置是否捕获了OOM异常 详细分析 1. 不同内存区域的OOM影响 内存区域错误类型默认是否导致JVM退出可恢复性Java堆OutOfMemoryError…...
Docker Compose 外部网络(`external: true`)与内部网络的区别
Docker Compose 外部网络(external: true)与内部网络的区别 在 Docker Compose 中,external: true 声明的外部网络与普通(内部)网络有重要区别,以下是它们的详细对比: 1. 定义与创建方式 特性外部网络 (external: true)内部网络 (默认)创建…...
【Android】Wallpaper学习
从wallpaper的设置来了解相关内容: 一,静态壁纸 静态壁纸设置的原理是在WallpaperManagerService里监听/data/system/users/0/wallpaper_orig相关文件的变化来触发设置,通过相应的组件程序去进行绘制, 相应的组件如:…...
Java基础-第一章、基本数据类型
运算符: 1.算术运算符:加减乘除%等 2.逻辑运算符:与或非等 3.关系运算符:大于、小于... 4.赋值运算符: 这里牵扯运算符的运算先后顺序了。 赋值运算的返回值:就是赋值的变量本身...
《Operating System Concepts》阅读笔记:p748-p748
《Operating System Concepts》学习第 64 天,p748-p748 总结,总计 1 页。 一、技术总结 1.Transmission Control Protocol(TCP) 重点是要自己能画出其过程,这里就不赘述了。 二、英语总结(生词:3) transfer, transport, tran…...
Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏
Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏 Project 08 - Digital Hourglass 数字沙漏程序功能概述功能:硬件要求:输出:代码结构全局变量`setup()` 函数`loop()` 函数计时和点亮LED:读取倾斜开关状态:重置LED和计时器:运行过程注意事项Project 08 - …...
报告总结笔记 | Jeff Dean ETH AI趋势 笔记:AI 的重要趋势:我们是如何走到今天的,我们现在能做什么,以及我们如何塑造 AI 的未来?
报告总结笔记 | Jeff Dean ETH AI趋势 笔记:AI 的重要趋势:我们是如何走到今天的,我们现在能做什么,以及我们如何塑造 AI 的未来? 2025年 4 月 14 日,Google Research 及 Google DeepMind 的首席科学家、A…...
RocketMQ实现基于可靠消息的最终一致性
RocketMQ实现基于可靠消息的最终一致性 文章目录 RocketMQ实现基于可靠消息的最终一致性一、RocketMQ应用场景**应用解耦****流量削峰****数据分发** 二、RocketMQ 基础概念1. 核心组件2. 消费模式3. 消息可靠性 三、消息类型按发送方式分同步发送异步发送单向发送 按使用功能特…...
【题解-Acwing】790. 数的三次方根
题目:790. 数的三次方根 题目描述 给定一个浮点数 n,求它的三次方根。 输入 共一行,包含一个浮点数 n 。 输出 共一行,包含一个浮点数,表示问题的解。 注意,结果保留 6 位小数。 数据范围 −10000 ≤ n ≤ 10000 时空限制 1s / 64MB 输入样例 1000.00输出样…...
一键升级OpenSSH/OpenSSL修复安全漏洞
在服务器安全运维过程中,我们经常面临这样的问题:收到高危漏洞通报(如最近的OpenSSH多个CVE漏洞),但Ubuntu系统无法通过apt直接升级到修复版本。这种情况下,传统方法需要手动编译源码,处理依赖关…...
Pycharm 如何删除某个 Python Interpreter
在PyCharm中,点击右下角的“Interpreter Settings”按钮,或者通过菜单栏选择“File” > “Settings”(macOS用户选择“PyCharm” > “Preferences”)。在设置窗口中,导航到“Project: [Your Project Name]” >…...
【C++】深入浅出之多态
目录 多态的概念多态的定义和实现多态的构造条件虚函数虚函数的重写虚函数重写的两个例外协变析构函数作为虚函数重写 C11的override和final重载、重写(覆盖)、隐藏(重定义)的对比相关面试题⭐ 抽象类概念接口继承和实现继承 多态的原理虚函数表多态的原理动态绑定和静态绑定 e…...
精益数据分析(9/126):如何筛选创业路上的关键数据指标
精益数据分析(9/126):如何筛选创业路上的关键数据指标 大家好!在创业的漫漫长路中,数据就像一盏明灯,指引着我们前行的方向。但要让这盏灯发挥作用,关键在于找到那些真正有价值的数据指标。今天…...
【Python爬虫详解】第二篇:HTML结构的基本分析
在上一篇文章中,我们介绍了网络爬虫的基本概念、发展历程和工作原理。要进行有效的网页内容爬取,首先需要理解我们要爬取的对象 —— 网页的基本结构和语法。网页本质上是由HTML代码构成的,爬虫程序需要从HTML中提取我们需要的信息。因此&…...
【C++】 —— 笔试刷题day_21
一、爱丽丝的人偶 题目解析 现在存在n个玩偶,每个玩偶的身高是1、2、3......n; 现在我们要对这些玩偶进行排序(如果x人偶,它左右两边的玩偶一个比x高、一个比x矮,那这个玩偶就会爆炸)。 我们不想要任何一个…...
云点数据读写
一、常见点云数据格式 LAS/LAZ格式 LAS是点云数据的行业标准格式 LAZ是LAS的压缩版本 支持地理参考信息、颜色、强度等属性 PCD格式(Point Cloud Data) PCL(Point Cloud Library)开发的格式 支持ASCII和二进制存储 包含头部信息和数据部分 PLY格式(Polygon File Format…...
Matlab 汽车行驶速度PID控制系统仿真
1、内容简介 Matlab 213-汽车行驶速度PID控制系统仿真 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
STM32嵌入式
一、创建工程项目 1、进入软件首页 2、新建项目,【file】->【new project】 3、选择需要的芯片 4、系统内核部分设置 ① 选择晶振(使用外部的高速晶振) ② 选择debug形式(SW类型) 5、时钟设置 6、选择自己需要的引脚设置&a…...
机器学习(神经网络基础篇)——个人理解篇6(概念+代码)
1 在声明一个类中,构建一个属于类的函数,前面为什要加上“self”? 就像下面这一串代码: class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size,weight_init_std0.01):# 初始化权重self.params {}self.p…...
Java学习手册:Filter 和 Listener
在 JavaWeb 开发中,Filter(过滤器)和 Listener(监听器)是两个重要的技术组件,它们在处理客户端请求、管理应用状态和资源以及实现全局逻辑控制等方面发挥着关键作用。 一、Filter(过滤器&#…...
深度学习总结(25)
抽样偏倚问题 非代表性数据有一个特别隐蔽又特别常见的例子,那就是抽样偏倚(sampling bias)。如果你的数据收集过程与你尝试预测的目标之间存在相互影响,就会出现抽样偏倚,从而导致有偏差的结果。 理解数据 将数据…...
探索 Model Context Protocol (MCP):它如何影响 AI 的表现?
Anthropic 公司 Anthropic 是一家技术实力雄厚的公司,也是大模型领域的重要参与者之一。其开发的 **Claude 模型** 是全球首个以编程能力见长并广受欢迎的大语言模型。这款模型凭借卓越的代码生成和理解能力,迅速成为许多开发者工具的核心组件。例如&am…...
Three.js + React 实战系列-3D 个人主页 :完成 Navbar 导航栏组件
在上一节中,我们搭建了项目的基础结构,搭建好了项目框架。 本节我们将继续完善页面结构,完成第一个视觉组件 —— Navbar 导航栏 ✅ 前置准备: ✅下载静态资源在根目录下 (src 同级)谷歌云盘地址 🎥 02 完成 Navba…...
游戏引擎学习第238天:让 OpenGL 使用我们的屏幕坐标
回顾并为今天的内容做准备 我们已经完成了硬件显示的实现,现在通过GPU来显示游戏。原本以为这会花费很长时间,但结果实际所需的时间并不多。因此,我们现在有了进展,但接下来应该做什么还不确定。虽然有很多事情可以做,…...
go+mysql+cocos实现游戏搭建
盲目的学了一段时间了,刚开始从Box2d开始学习,明白了很多,Box2d是物理模型的基础,是我们在游戏中模拟现实的很重要的一个开源工具。后来在朋友的建议下学习了cocos,也是小程序开发的利器,而golang是一款高效…...
Linux 网络基础(二) (传输协议层:UDP、TCP)
目录 一、传输层的意义 二、端口号 1、五元组标识一个通信 2、端口号范围划分 3、知名端口号(Well-Know Port Number) (1)查看端口号 4、绑定端口号数目问题 5、pidof & netstat 命令 (1)ne…...
Vue常用指令入门
1. v-for 作用:用于遍历对象或数组 注意:需要提供key属性,可以提高性能和避免渲染错误,值通常为index或item.id <li v-for"(item, index) in items" :key"index">{{ item }} </li>2. v-if,v-el…...
【文献阅读】EndoNet A Deep Architecture for Recognition Tasks on Laparoscopic Videos
关于数据集的整理 Cholec80 胆囊切除手术视频数据集介绍 https://zhuanlan.zhihu.com/p/700024359 数据集信息 Cholec80 数据集 是一个针对内窥镜引导 下的胆囊切除手术视频流程识别数据集。数据集提供了每段视频中总共7种手术动作及总共7种手术工具的标注,标…...
UML统一建模
UML UML(统一建模语言)介绍 UML(统一建模语言)介绍 面向对象软件开发需要经过OOA面向对象分析、OOD面向对象设计和OOP面向对象编程三个阶段。OOA对目标系统进行分析并寄哪里分析模型,并将之文档化,OOD用面向…...
Ubuntu下安装和卸载MySQL
Ubuntu下安装和卸载MySQL 下面的演示系统版本:Ubuntu 24.04 更新系统软件包 在开始安装之前,建议先更新系统的软件包列表,以确保所有依赖项是最新的。 sudo apt update && sudo apt upgrade -y安装MySQL服务器 Ubuntu的官方软件…...
物联网技术赋能:复杂环境下的能源数据零丢失
安科瑞顾强 在全球能源挑战日益严峻的背景下,高效节能已成为各行业的核心诉求。无论是商业综合体、工业厂房还是公共设施,如何实现能源的精细化管理成为关键课题。安科瑞能耗云平台凭借其创新技术与多功能服务,为企业提供了一站式能源管理解…...
卷积神经网络综述
摘要 本文对卷积神经网络(Convolutional Neural Network,CNN)进行了全面综述。首先介绍了卷积神经网络的发展历程,包括早期的理论基础和关键突破。接着详细阐述了卷积神经网络的结构组成,包括卷积层、池化层、全连接层…...
SpringBoot3设置maven package直接打包成二进制可执行文件
注意事项 SpringBoot普通native打包顺序clean compile spring-boot:process-aot native:compile 使用以下配置只会的打包顺序clean package(注意:使用此配置以后打包会有编译后的class文件、jar包、original源文件、二进制可执行文件【Linux是无后缀的包…...
在 Anaconda 上安装多版本 Python 解释器并在 PyCharm 中配置
默认已安装好 Anaconda 和 PyCharm ,想在 Anaconda 上安装最新版本的 Python 解释器。 一、在 Anaconda 上创建虚拟环境 在连网状态下进入系统的命令提示符(快捷键:win r ,输入 cmd 即可),输入如下命令&a…...
AES (高级加密标准)
原理详解 AES是一种对称加密算法,使用相同的密钥进行加密和解密。它采用替代-置换网络(SPN)结构,主要步骤包括: 密钥扩展:从初始密钥派生多轮密钥 初始轮:AddRoundKey(轮密钥加) 主轮ÿ…...
Git拉分支技巧:从零开始创建并推送分支
Git拉分支技巧:从零开始创建并推送分支 在团队协作开发中,Git 分支管理是不可或缺的技能。合理地创建、同步和推送分支,不仅能提高开发效率,还能避免代码冲突。本文将基于以下技巧,详细讲解如何从零开始创建并推送一个…...
线性回归之归一化(normalization)
文章目录 归一化与梯度下降归一化的必要性:从特征量纲到梯度下降问题背景矛盾与低效归一化的作用 归一化提高模型精度的原因归一化的本质常见归一化方法最大值最小值归一化示例说明优缺点分析 标准归一化具体机制示例说明 强调 归一化与梯度下降 归一化与梯度下降 &…...
mac监控linux上mysql性能(Grafana+Prometheus+mysqld_exporter)
一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装(mac)-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录页面 (默认用户名和密码都为admin,进入后…...
【玩泰山派】MISC(杂项)- linux桌面环境
文章目录 linux桌面环境linux四大桌面环境概述ubuntu基于四大桌面环境的版本 显示管理器gdm3(GNOME Display Manager)lightdm(Lightweight Display Manager)SDDM(Simple Desktop Display Manager)KDM&#…...
MVCC介绍
MVCC(多版本并发控制)详解 MVCC(Multi-Version Concurrency Control) 是一种数据库并发控制技术,核心思想是通过维护数据的多个版本来实现读写操作的无锁并发,从而在高并发场景下提升性能。它广泛用于 MyS…...