针孔相机模型公式推导
针孔相机模型是使用的较多的模型,下面总结三维模型重建中的针孔相机成像过程。
首先,空间中的一个点要在针孔相机的像平面重建,需要4步。
1.从世界坐标系变化到相机坐标系
世界坐标系可以定义在任意位置,作为参考坐标系,相机坐标系以相机的光心看为远点,相机朝向为Z轴,朝上为Y轴,再根据右手定则确定X轴,如图(Ocam表示相机坐标系原点,Owor表示世界坐标系所选的点的原点):
空间中的一个点表示为
Xw=[xwywzw]X_w=\left[\begin{matrix}x_w\\y_w\\z_w \end{matrix}\right]Xw=⎣⎡xwywzw⎦⎤
这个空间中的点对应的相机中的点表达为:
Xc=[xcyczc]X_c=\left[\begin{matrix}x_c\\y_c\\z_c \end{matrix}\right]Xc=⎣⎡xcyczc⎦⎤
XcX_cXc和XwX_wXw之间可以通过刚体变换来进行转换(刚体变换即变换前后两点的的距离依旧保持不变的变换,可分为平移变换、旋转变换和镜像(或叫翻转)变换):
1- 平移变换
假设存在点(x,y,z),将x移动a,y移动b,z移动c,到新的点(x′,y′,z′)(x^{'},y^{'},z^{'})(x′,y′,z′),则:
x′=x+ax^{'}=x+ax′=x+a
y′=y+by^{'}=y+by′=y+b
z′=y+cz^{'}=y+cz′=y+c
平移向量为:
t=[abc]t=\left[\begin{matrix}a\\b\\c \end{matrix}\right]t=⎣⎡abc⎦⎤
写成矩阵形式:
[x′y′z′1]=[100a010b001c0001][xyz1]\left[\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1 \end{matrix}\right]= \left[\begin{matrix}1&0&0&a\\0&1&0&b\\0&0&1&c\\0&0&0&1 \end{matrix}\right] \left[\begin{matrix}x\\y\\z\\1 \end{matrix}\right]⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡100001000010abc1⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤
中间4x4的矩阵叫变换矩阵。可见,如果要平移坐标,要将坐标维度增加1,变成齐次坐标(齐次坐标(homogeneous coordinates)就是将一个原本是n维的向量用一个n+1维向量来表示,常用于投影几何)。
在计算机图形学中,为了实现平移、旋转、缩放等图像操作,需要用到齐次坐标。
例1:世界坐标系wor相对相机坐标系cam的x、y、z分别平移了10,20,30,求次变换齐次矩阵。
[x′y′z′1]=[10010010000100001]×[10000102000100001]×[10000100001300001]×[xyz1]=[1001001020001300001]×[xyz1]\left[\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1 \end{matrix}\right]=\left[\begin{matrix}1&0&0&10\\0&1&0&0\\0&0&1&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}1&0&0&0\\0&1&0&20\\0&0&1&0\\0&0&0&1 \end{matrix}\right]\times \left[\begin{matrix}1&0&0&0\\0&1&0&0\\0&0&1&30\\0&0&0&1 \end{matrix}\right]\times \left[\begin{matrix}x\\y\\z\\1 \end{matrix}\right]= \left[\begin{matrix}1&0&0&10\\0&1&0&20\\0&0&1&30\\0&0&0&1 \end{matrix}\right]\times \left[\begin{matrix}x\\y\\z\\1 \end{matrix}\right]⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡10000100001010001⎦⎥⎥⎤×⎣⎢⎢⎡10000100001002001⎦⎥⎥⎤×⎣⎢⎢⎡10000100001000301⎦⎥⎥⎤×⎣⎢⎢⎡xyz1⎦⎥⎥⎤=⎣⎢⎢⎡1000010000101020301⎦⎥⎥⎤×⎣⎢⎢⎡xyz1⎦⎥⎥⎤
三个分量矩阵位置可以交换,因为是独立变量,互不影响。
所以,平移齐次矩阵为:[1001001020001300001]\left[\begin{matrix}1&0&0&10\\0&1&0&20\\0&0&1&30\\0&0&0&1 \end{matrix}\right]⎣⎢⎢⎡1000010000101020301⎦⎥⎥⎤
2- 旋转变换
例2:世界坐标系wor相对相机坐标系cam绕x轴顺时针旋转了α\alphaα(逆时针旋转为正,所以以下变换均为逆时针旋转):
变换矩阵:[x′y′z′1]=[10000cosα−sinα00sinαcosα00001]×[xyz1]\left[\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1 \end{matrix}\right]= \left[\begin{matrix}1&0&0&0\\0&cos{\alpha}&-sin{\alpha}&0\\0&sin{\alpha}&cos{\alpha}&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}x\\y\\z\\1 \end{matrix}\right]⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡10000cosαsinα00−sinαcosα00001⎦⎥⎥⎤×⎣⎢⎢⎡xyz1⎦⎥⎥⎤
再绕y轴顺时针旋转β\betaβ(应该再左乘一个变换矩阵):
[x′′y′′z′′1]=[10000cosα−sinα00sinαcosα00001]×[x′y′z′1]\left[\begin{matrix}x^{''}\\y^{''}\\z^{''}\\1 \end{matrix}\right]= \left[\begin{matrix}1&0&0&0\\0&cos{\alpha}&-sin{\alpha}&0\\0&sin{\alpha}&cos{\alpha}&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1 \end{matrix}\right]⎣⎢⎢⎡x′′y′′z′′1⎦⎥⎥⎤=⎣⎢⎢⎡10000cosαsinα00−sinαcosα00001⎦⎥⎥⎤×⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤
旋转变换有两种,一种是向量在当前坐标系内的旋转,一种是坐标系的旋转。这里推导坐标系旋转矩阵。
(1) 绕X轴旋转(逆时针)α\alphaα:
方程为:
{x′=x,y′=ycosα+zsinα,z′=−ysinα+zcosα\begin{cases} x'=x,\\ y'=ycos{\alpha}+zsin{\alpha},\\ z'=-ysin{\alpha}+zcos{\alpha} \end{cases}⎩⎪⎨⎪⎧x′=x,y′=ycosα+zsinα,z′=−ysinα+zcosα
写成矩阵形式:
[x′y′z′1]=[10000cosαsinα00−sinαcosα00001]×[xyz1]\left[\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1 \end{matrix}\right]= \left[\begin{matrix}1&0&0&0\\0&cos{\alpha}&sin{\alpha}&0\\0&-sin{\alpha}&cos{\alpha}&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}x\\y\\z\\1 \end{matrix}\right]⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡10000cosα−sinα00sinαcosα00001⎦⎥⎥⎤×⎣⎢⎢⎡xyz1⎦⎥⎥⎤
(2) 绕Y轴旋转(逆时针)β\betaβ:
方程为:
{x′′=x′cosβ+z′sinβ,y′′=y′,z′′=−x′sinβ+z′cosβ\begin{cases} x''=x'cos{\beta}+z'sin{\beta},\\ y''=y',\\ z''=-x'sin{\beta}+z'cos{\beta} \end{cases}⎩⎪⎨⎪⎧x′′=x′cosβ+z′sinβ,y′′=y′,z′′=−x′sinβ+z′cosβ
写成矩阵形式:
[x′′y′′z′′1]=[cosβ0sinβ00100−sinα0cosβ00001]×[x′y′z′1]\left[\begin{matrix}x^{''}\\y^{''}\\z^{''}\\1 \end{matrix}\right]= \left[\begin{matrix}cos{\beta}&0&sin{\beta}&0\\0&1&0&0\\-sin{\alpha}&0&cos{\beta}&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}x'\\y'\\z'\\1 \end{matrix}\right]⎣⎢⎢⎡x′′y′′z′′1⎦⎥⎥⎤=⎣⎢⎢⎡cosβ0−sinα00100sinβ0cosβ00001⎦⎥⎥⎤×⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤
(3)绕Z轴旋转(逆时针)γ\gammaγ:
方程为:
{x′′′=x′′cosγ+y′′sinγ,y′′′=−x′′sinγ+y′′cosβ,z′′′=z′′\begin{cases} x'''=x''cos{\gamma}+y''sin{\gamma},\\ y'''=-x''sin{\gamma}+y''cos{\beta},\\ z'''=z'' \end{cases}⎩⎪⎨⎪⎧x′′′=x′′cosγ+y′′sinγ,y′′′=−x′′sinγ+y′′cosβ,z′′′=z′′
写成矩阵形式:
[x′′′y′′′z′′′1]=[cosγsinγ00−sinγcosγ0000100001]×[x′′y′′z′′1]\left[\begin{matrix}x^{'''}\\y^{'''}\\z^{'''}\\1 \end{matrix}\right]= \left[\begin{matrix}cos{\gamma}&sin{\gamma}&0&0\\-sin{\gamma}&cos{\gamma}&0&0\\0&0&1&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}x''\\y''\\z''\\1 \end{matrix}\right]⎣⎢⎢⎡x′′′y′′′z′′′1⎦⎥⎥⎤=⎣⎢⎢⎡cosγ−sinγ00sinγcosγ0000100001⎦⎥⎥⎤×⎣⎢⎢⎡x′′y′′z′′1⎦⎥⎥⎤
所以,坐标轴分别依次绕x,y,z轴旋转α\alphaα,β\betaβ,γ\gammaγ的变换矩阵(前后用左乘来连接):
R=Rz(γ)Ry(β)Rx(α)=[cosγsinγ00−sinγcosγ0000100001]×[cosβ0sinβ00100−sinα0cosβ00001]×[10000cosαsinα00−sinαcosα00001]R=R_z(\gamma)R_y(\beta)R_x(\alpha)=\left[\begin{matrix}cos{\gamma}&sin{\gamma}&0&0\\-sin{\gamma}&cos{\gamma}&0&0\\0&0&1&0\\0&0&0&1 \end{matrix}\right]\times \left[\begin{matrix}cos{\beta}&0&sin{\beta}&0\\0&1&0&0\\-sin{\alpha}&0&cos{\beta}&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}1&0&0&0\\0&cos{\alpha}&sin{\alpha}&0\\0&-sin{\alpha}&cos{\alpha}&0\\0&0&0&1 \end{matrix}\right]R=Rz(γ)Ry(β)Rx(α)=⎣⎢⎢⎡cosγ−sinγ00sinγcosγ0000100001⎦⎥⎥⎤×⎣⎢⎢⎡cosβ0−sinα00100sinβ0cosβ00001⎦⎥⎥⎤×⎣⎢⎢⎡10000cosα−sinα00sinαcosα00001⎦⎥⎥⎤
齐次矩阵RRR为4×44\times 44×4的矩阵。
3- 综合变换矩阵
空间中的一个点表示为
Xw=[xwywzw]X_w=\left[\begin{matrix}x_w\\y_w\\z_w \end{matrix}\right]Xw=⎣⎡xwywzw⎦⎤
这个空间中的点对应的相机中的点表达为:
Xc=[xcyczc]X_c=\left[\begin{matrix}x_c\\y_c\\z_c \end{matrix}\right]Xc=⎣⎡xcyczc⎦⎤
综合的(平移+旋转)变换矩阵可表示为:
Xc=RXw+tX_c=RX_w+tXc=RXw+t (此处及以下R为非齐次矩阵,3×43\times 43×4)
写成齐次矩阵形式(XcX_cXc下面的1是因为要考虑平移,所以要变成齐次矩阵才加进来的):
[Xc1]=[Rt0T1]×[Xw1]\left[\begin{matrix}X_c\\1 \end{matrix}\right]= \left[\begin{matrix}R&t\\0^T&1 \end{matrix}\right] \times \left[\begin{matrix}X_w\\1 \end{matrix}\right][Xc1]=[R0Tt1]×[Xw1]
(ttt为平移向量:
t=[abc]t=\left[\begin{matrix}a\\b\\c \end{matrix}\right]t=⎣⎡abc⎦⎤)
逆变换:
Xw=RTXc−RTtX_w=R^TX_c-R^TtXw=RTXc−RTt
齐次矩阵形式:
[Xw1]=[RT−RTt0T1]×[Xc1]\left[\begin{matrix}X_w\\1 \end{matrix}\right]= \left[\begin{matrix}R^T&-R^Tt\\0^T&1 \end{matrix}\right] \times \left[\begin{matrix}X_c\\1 \end{matrix}\right][Xw1]=[RT0T−RTt1]×[Xc1]
4.相机中心在世界坐标系中的位置
相机中心在相机坐标系中的位置OcamcO_{cam}^cOcamc
相机中心在世界坐标系中的位置OcamwO_{cam}^wOcamw
把相机原点转化到世界坐标系中:
Ocamc=0O_{cam}^c=0Ocamc=0
使用逆变换公式:
Xw=RTXc−RTtX_w=R^TX_c-R^TtXw=RTXc−RTt
Ocamw=RTOcamc−RTt=−RTtO_{cam}^w=R^TO_{cam}^c-R^Tt=-R^TtOcamw=RTOcamc−RTt=−RTt
把世界坐标系原点转化到相机坐标系中:
世界坐标系原点在世界坐标系中的位置OworwO_{wor}^wOworw
世界坐标系原点在相机坐标系中的位置OworcO_{wor}^cOworc
Oworw=0O_{wor}^w=0Oworw=0
使用变换公式:
Xc=RXw+tX_c=RX_w+tXc=RXw+t
XOworc=ROworw+t=tXO_{wor}^c=RO_{wor}^w+t=tXOworc=ROworw+t=t
可见:世界坐标系原点在相机坐标系中的表达就是平移向量ttt。
4- 相机朝向(Z轴)在世界坐标系中的方向
2. 相机坐标系到归一化像平面坐标系
归一化像平面坐标系:是一个与物理像平面(通常是感光器件CCD所在的平面)平行,并且距离相机光心距离为1个单位的一个虚拟的坐标平面。见下图:
归一化平面坐标p^(x,y)\hat{p}(x,y)p^(x,y),由三角形(从三维来看是三棱锥相似)相似有:
xcx=ycy=zcz\frac{x_c}{x}=\frac{y_c}{y}=\frac{z_c}{z}xxc=yyc=zzc (由归一化平面定义知:归一化平面的z=1z=1z=1)
即:
x=xczcx=\frac{x_c}{z_c}x=zcxc
y=yczcy=\frac{y_c}{z_c}y=zcyc
写成矩阵形式:
[xy]=[xczcyczc]\left[\begin{matrix}x\\y \end{matrix}\right]= \left[\begin{matrix}\frac{x_c}{z_c}\\ \frac{y_c}{z_c} \end{matrix}\right][xy]=[zcxczcyc]
写成其次矩阵形式:
[xy1]=1zc[xcyczc]\left[\begin{matrix}x\\y\\1 \end{matrix}\right]=\frac{1}{z_c} \left[\begin{matrix}x_c\\ y_c\\z_c \end{matrix}\right]⎣⎡xy1⎦⎤=zc1⎣⎡xcyczc⎦⎤
经过归一化后,原来的在相机坐标下的三维信息Pc(xc,yc,zc)P_c(x_c,y_c,z_c)Pc(xc,yc,zc)变成了二维信息p^(x,y)\hat{p}(x,y)p^(x,y),损失了z坐标的信息,由三维点变成了二维的点,这个过程即深度信息损失。
3. 归一化像平面坐标系到物理像平面坐标系
得到归一化坐标p^(x,y)\hat{p}(x,y)p^(x,y)后,要将其转化到理像平面坐标系中(即成像原件所在平面),变成pimg(ximg,yimg)p_{img}(x_{img},y_{img})pimg(ximg,yimg)。注意:此处单位与归一化平面不一样,归一化平面与光心的距离可以是1米或毫米(此例子中取毫米),但是物理像平面的单位通常为像素。见下图:
由于物理平面采用的单位是像素,需要把归一化平面的毫米单位转化为像素。
相似三角形关系:
Ximgx=Yimgy=fz\frac{X_{img}}{x}=\frac{Y_{img}}{y}=\frac{f}{z}xXimg=yYimg=zf (由归一化平面定义知:归一化平面的z=1z=1z=1;XimgX_{img}Ximg、YimgY_{img}Yimg单位为mm)
Ximg=fxX_{img}=fxXimg=fx
Yimg=fyY_{img}=fyYimg=fy (单位mm)
ximg=αU=fαxx_{img}=\alpha U=f\alpha xximg=αU=fαx
yimg=βU=fβyy_{img}=\beta U=f\beta yyimg=βU=fβy (在物理平面内,mm坐标转化为像素单位的坐标)
写成矩阵形式:
[ximgyimg]=[fαxfβy]=[fαxfβy]\left[\begin{matrix}x_{img}\\y_{img} \end{matrix}\right]= \left[\begin{matrix}f\alpha x\\ f\beta y \end{matrix}\right]=\left[\begin{matrix}f_{\alpha}x\\ f_{\beta}y \end{matrix}\right][ximgyimg]=[fαxfβy]=[fαxfβy]
fα=fαf_{\alpha}=f\alphafα=fα
fβ=fβf_{\beta}=f\betafβ=fβ
写成其次矩阵:
[ximgyimg1]=[fα000fβ0001][xy1]=1zc[fα000fβ0001][xcyczc]\left[\begin{matrix}x_{img}\\y_{img}\\1 \end{matrix}\right]= \left[\begin{matrix}f_{\alpha}&0&0\\ 0&f_{\beta}&0\\0&0&1 \end{matrix}\right]\left[\begin{matrix}x\\y\\1 \end{matrix}\right]=\frac{1}{z_c}\left[\begin{matrix}f_{\alpha}&0&0\\ 0&f_{\beta}&0\\0&0&1 \end{matrix}\right] \left[\begin{matrix}x_c\\ y_c\\z_c \end{matrix}\right]⎣⎡ximgyimg1⎦⎤=⎣⎡fα000fβ0001⎦⎤⎣⎡xy1⎦⎤=zc1⎣⎡fα000fβ0001⎦⎤⎣⎡xcyczc⎦⎤
这就是相机中的点Pc(xc,yc,zc)P_c(x_c,y_c,z_c)Pc(xc,yc,zc)到物理像平面中对应点pimg(ximg,yimg)p_{img}(x_{img},y_{img})pimg(ximg,yimg)的变换矩阵。
其中fff为焦距,即物理平面到光心的距离,单位毫米。α\alphaα、β\betaβ分别表示归一化平面上每单位(mm)对应包含物理平面上xxx、yyy方向像素的个数。所以,fαf_{\alpha}fα和fβf_{\beta}fβ分别为以xxx、yyy方向上以像素为单位的焦距;ximgx_{img}ximg、yimgy_{img}yimg单位为像素。
4.把物理平面像坐标转到图像坐标系
常用的图像坐标系为以图像左上角为原点,x方向朝右,y朝下的坐标系;但是物理坐标系原点在图像中央:
设图像中央的坐标为(u0,v0)(u_0,v_0)(u0,v0),则图像坐标((u,v)(u,v)(u,v),左上角为原点)为:
[uv]=[ximg+u0yimg+v0]=[fαx+u0fβy+v0]=[fαx+u0fβy+v0]\left[\begin{matrix}u\\v \end{matrix}\right]=\left[\begin{matrix}x_{img}+u_0\\y_{img}+v_0 \end{matrix}\right]= \left[\begin{matrix}f\alpha x+u_0\\ f\beta y+v_0 \end{matrix}\right]=\left[\begin{matrix}f_{\alpha}x+u_0\\ f_{\beta}y+v_0 \end{matrix}\right][uv]=[ximg+u0yimg+v0]=[fαx+u0fβy+v0]=[fαx+u0fβy+v0]
写成其次矩阵:
[uv1]=1zc[fα0u00fβv0001][xcyczc]\left[\begin{matrix}u\\v\\1 \end{matrix}\right]= \frac{1}{z_c}\left[\begin{matrix}f_{\alpha}&0&u_0\\ 0&f_{\beta}&v_0\\0&0&1 \end{matrix}\right] \left[\begin{matrix}x_c\\ y_c\\z_c \end{matrix}\right]⎣⎡uv1⎦⎤=zc1⎣⎡fα000fβ0u0v01⎦⎤⎣⎡xcyczc⎦⎤
一般情况下,像素为正方形,则有f=fα=fβf=f_{\alpha}=f_{\beta}f=fα=fβ
5.把上述步骤都串起来
把上面四部串起来就是针孔相机的成像过程:
[uv1]=1zc[fα0u00fβv0001][xcyczc]=1zc[fα0u00fβv0001][Rt][Xw1]=1zcK[Rt][xwywzw1]\left[\begin{matrix}u\\v\\1 \end{matrix}\right]= \frac{1}{z_c}\left[\begin{matrix}f_{\alpha}&0&u_0\\ 0&f_{\beta}&v_0\\0&0&1 \end{matrix}\right] \left[\begin{matrix}x_c\\ y_c\\z_c \end{matrix}\right]=\frac{1}{z_c}\left[\begin{matrix}f_{\alpha}&0&u_0\\ 0&f_{\beta}&v_0\\0&0&1 \end{matrix}\right] \left[\begin{matrix}R&t \end{matrix}\right] \left[\begin{matrix}X_w\\1 \end{matrix}\right]=\frac{1}{z_c}K \left[\begin{matrix}R&t \end{matrix}\right] \left[\begin{matrix}x_w\\y_w\\z_w\\1 \end{matrix}\right]⎣⎡uv1⎦⎤=zc1⎣⎡fα000fβ0u0v01⎦⎤⎣⎡xcyczc⎦⎤=zc1⎣⎡fα000fβ0u0v01⎦⎤[Rt][Xw1]=zc1K[Rt]⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤
整个投影过程可变为3×43\times 43×4的矩阵:P3×4=K[Rt]P_{3\times 4}=K \left[\begin{matrix}R&t \end{matrix}\right]P3×4=K[Rt]
其中,K=[fα0u00fβv0001]K=\left[\begin{matrix}f_{\alpha}&0&u_0\\ 0&f_{\beta}&v_0\\0&0&1 \end{matrix}\right]K=⎣⎡fα000fβ0u0v01⎦⎤中包含的fαf_{\alpha}fα,fβf_{\beta}fβ,u0u_0u0,v0v_0v0为相机的内参(还有径向畸变系数k1k_1k1,k2k_2k2).
R=Rz(γ)Ry(β)Rx(α)=[cosγsinγ0−sinγcosγ0001]×[cosβsinβ0010−sinα0cosβ]×[1000cosαsinα0−sinαcosα]R=R_z(\gamma)R_y(\beta)R_x(\alpha)=\left[\begin{matrix}cos{\gamma}&sin{\gamma}&0&\\-sin{\gamma}&cos{\gamma}&0&\\0&0&1& \end{matrix}\right]\times \left[\begin{matrix}cos{\beta}&sin{\beta}&0\\0&1&0&\\-sin{\alpha}&0&cos{\beta}& \end{matrix}\right] \times \left[\begin{matrix}1&0&0&\\0&cos{\alpha}&sin{\alpha}&\\0&-sin{\alpha}&cos{\alpha}& \end{matrix}\right]R=Rz(γ)Ry(β)Rx(α)=⎣⎡cosγ−sinγ0sinγcosγ0001⎦⎤×⎣⎡cosβ0−sinαsinβ1000cosβ⎦⎤×⎣⎡1000cosα−sinα0sinαcosα⎦⎤
和平移向量t=[abc]t=\left[\begin{matrix}a\\b\\c \end{matrix}\right]t=⎣⎡abc⎦⎤为外参。
外参确定的过程对应计算机视觉中的姿态估计任务,内参确定过程对应相机标定任务。
关于径向畸变系数
径向畸变成因:相机的透镜不是理想的透镜,因此会产生直线变弯曲现象。
公式:
[x~y~]=(1+k1r2+k2r4)[xy]\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]=(1+k_1r^2+k_2r^4)\left[\begin{matrix}x\\y \end{matrix}\right][x~y~]=(1+k1r2+k2r4)[xy] (可见径向畸变发生在归一化像平面上)
r2=x2+y2r^2=x^2+y^2r2=x2+y2
(xxx,yyy为归一化平面上的点,x~\tilde{x}x~、y~\tilde{y}y~表示畸变后的在物理像平面上的点(单位为像素))
[u~v~]=f[x~y~]+[u0v0]\left[\begin{matrix}\tilde{u}\\\tilde{v} \end{matrix}\right]=f\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]+\left[\begin{matrix}u_0\\v_0 \end{matrix}\right][u~v~]=f[x~y~]+[u0v0]
k1k_1k1,k2k_2k2为径向畸变系数;r2r^2r2表示图像距离中心点的距离的平方,由此可见,距离图像中心越远的点,畸变程度越大,见下图:
径向畸变系数估计方法—最小二乘法:
理想情况投影点的坐标:
[uv]=f[xy]+[u0v0]\left[\begin{matrix}u\\v \end{matrix}\right]=f\left[\begin{matrix}x\\y \end{matrix}\right]+\left[\begin{matrix}u_0\\v_0 \end{matrix}\right][uv]=f[xy]+[u0v0]
即:
f[xy]=[u−u0v−v0]f\left[\begin{matrix}x\\y \end{matrix}\right]=\left[\begin{matrix}u-u_0\\v-v_0 \end{matrix}\right]f[xy]=[u−u0v−v0]
畸变情况下的投影点的坐标:
[u~v~]=f[x~y~]+[u0v0]\left[\begin{matrix}\tilde{u}\\\tilde{v} \end{matrix}\right]=f\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]+\left[\begin{matrix}u_0\\v_0 \end{matrix}\right][u~v~]=f[x~y~]+[u0v0]
即:
f[x~y~]=[u~−u0v~−v0]f\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]=\left[\begin{matrix}\tilde{u}-u_0\\\tilde{v}-v_0 \end{matrix}\right]f[x~y~]=[u~−u0v~−v0]
因为畸变是发生在归一化像平面上,对应的也就等价于发生在物理像平面上,所以由公式:
[x~y~]=(1+k1r2+k2r4)[xy]\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]=(1+k_1r^2+k_2r^4)\left[\begin{matrix}x\\y \end{matrix}\right][x~y~]=(1+k1r2+k2r4)[xy]
得:
公式:
f[x~y~]=(1+k1r2+k2r4)f[xy]f\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]=(1+k_1r^2+k_2r^4)f\left[\begin{matrix}x\\y \end{matrix}\right]f[x~y~]=(1+k1r2+k2r4)f[xy]
即:
[u~−u0v~−v0]=(1+k1r2+k2r4)[u−u0v−v0]\left[\begin{matrix}\tilde{u}-u_0\\\tilde{v}-v_0 \end{matrix}\right]=(1+k_1r^2+k_2r^4)\left[\begin{matrix}u-u_0\\v-v_0 \end{matrix}\right][u~−u0v~−v0]=(1+k1r2+k2r4)[u−u0v−v0]
即:
u~−u0=(1+k1r2+k2r4)(u−u0)\tilde{u}-u_0=(1+k_1r^2+k_2r^4)(u-u_0)u~−u0=(1+k1r2+k2r4)(u−u0)
u~=(1+k1r2+k2r4)u−(k1r2+k2r4)u0\tilde{u}=(1+k_1r^2+k_2r^4)u-(k_1r^2+k_2r^4)u_0u~=(1+k1r2+k2r4)u−(k1r2+k2r4)u0
u~−u=(k1r2+k2r4)u−(k1r2+k2r4)u0\tilde{u}-u=(k_1r^2+k_2r^4)u-(k_1r^2+k_2r^4)u_0u~−u=(k1r2+k2r4)u−(k1r2+k2r4)u0
u~−u=k1r2(u−u0)+k2r4(u−u0)\tilde{u}-u=k_1r^2(u-u_0)+k_2r^4(u-u_0)u~−u=k1r2(u−u0)+k2r4(u−u0)
同理:
v~−v=k1r2(v−v0)+k2r4(v−v0)\tilde{v}-v=k_1r^2(v-v_0)+k_2r^4(v-v_0)v~−v=k1r2(v−v0)+k2r4(v−v0)
写成矩阵:
[(u−u0)r2(u−u0)r4(v−v0)r2(v−v0)r4][k1k2]=[u~−uv~−v]\left[\begin{matrix}(u-u_0)r^2&(u-u_0)r^4\\(v-v_0)r^2&(v-v_0)r^4 \end{matrix}\right]\left[\begin{matrix}k_1\\k_2 \end{matrix}\right]=\left[\begin{matrix}\tilde{u}-u\\\tilde{v}-v \end{matrix}\right][(u−u0)r2(v−v0)r2(u−u0)r4(v−v0)r4][k1k2]=[u~−uv~−v]
左边表示无畸变的点,右边表示有畸变的点。所以,只需要知道[u~v~]\left[\begin{matrix}\tilde{u}\\\tilde{v} \end{matrix}\right][u~v~]和[uv]\left[\begin{matrix}u\\v \end{matrix}\right][uv]的对应关系,就可以用最小二乘法计算k1k_1k1和k2k_2k2了。
针孔相机模型公式推导相关推荐
- 【多传感融合】优达学城多传感融合学习笔记(一)——针孔相机模型
针孔相机模型 目录 针孔相机模型 针孔相机成像模型 镜头和光圈 枕形畸变和桶形畸变 图像标定和校准概念 三维坐标系到像素坐标系的转换 图像传感器和拜耳阵列(Bayer Pattern) CCD vs. ...
- 最简单的针孔相机模型标定方法,使用Matlab进行快速可视化相机标定,小白专用,超详细
相机标定是机器视觉.SLAM等绕不开的环节,今天介绍一种最为简单的可视化标定方法. 这篇文章只是讲解如果标定,关于相机的标定原理,可以参考别的文章,这里推荐一篇<[机器视觉]张氏法相机标定> ...
- OpenCV——将针孔相机模型图片转换成鱼眼相机模型图片
一 理论基础 关于针孔相机模型,参考博客: 关于鱼眼相机模型,参考参考文献[1][2]. 这里只需要知道我们这里使用的鱼眼相机模型是等距投影的鱼眼相机模型,即r=fθ(1),而针孔相机模型是透视投影, ...
- 几种相机模型:针孔相机模型、双目相机模型、RGB-D相机——SLAM学习笔记5
几种相机模型:针孔相机模型.双目相机模型.RGB-D相机 针孔相机模型 双目相机模型 RGB-D相机模型 针孔相机模型 针孔相机是最简单的相机,很多相机也可以看作是针孔相机来进行处理.如图1所示,空间 ...
- 视觉SLAM——针孔相机模型 相机标定原理 双目相机模型 深度相机对比
前言 本博客为主要学习<视觉SLAM十四讲>第5讲.<机器人学的状态估计>第6章6.4.1透视相机.<多视图几何>第5章摄像头模型等SLAM内容的总结与整理. 主要 ...
- 针孔相机模型和相机镜头畸变模型
针孔相机模型和相机镜头畸变模型 一.针孔相机模型 图1. 针孔相机模型 针孔相机模型(如图1所示)存在四个坐标系:世界坐标系.摄像机坐标系.图像物理坐标系和图像像素坐标系.假设现实世界的空间点的世界坐 ...
- 单目相机成像模型——针孔相机模型
高翔:SLAM十二讲阅读笔记 本节主要注意四个坐标:世界,相机,归一化相机,像素. 针孔相机模型 相机坐标转换成像素坐标,由内参数矩阵决定. 相机位姿决定世界坐标转换成相机坐标:即外参数矩阵 内参数矩 ...
- 汽车二自由度模型公式推导及simulink模型——传递函数、状态空间
文章目录 二自由度车辆方程 传递函数法 状态空间 二自由度车辆方程 为便于掌握操纵稳定性的基本特性,我们将一对简化为线性二自由度的汽车模型进行研究,分析中忽略一下几点: 1.忽略转向系统的影响,直接以 ...
- 3D视觉原理-针孔相机模型
图像传感器像素位置和3D空间点位置关系可以通过相似三角形获得 x传感器图像物理位置, X目标点位置,Z是距离,f焦距 X x = Z f (1) \frac{X}{x} = \frac{Z}{f} \ ...
- 四旋翼飞行器控制模型公式推导
四旋翼飞行器控制模型 为便于建立模型,现对四旋翼飞行器进行以下假设: 1.四旋翼飞行器是均匀对称的刚体 2.四旋翼飞行器的质量和转动惯量不发生改变 3.四旋翼飞行器的几何中心与其重心重合 4.四旋翼飞 ...
最新文章
- pandas中set_option的常用设置:显示所有行、显示所有列、控制浮点型精度、每个数据元素的显示字符数、对齐形式等
- solrcloud线上创建collection,修改默认配置
- Microsoft将在UWP上支持React Native,同时为VS Code添加工具软件
- A股开盘:深证区块链50指数涨0.91%,美邦服饰涨停
- svn的使用总结(待补充)
- 如何选择网页更新提醒工具
- 【Cmake】Ctest测试工具
- 【每日早报】2019/07/17
- 怎样清理计算机c盘东西,电脑c盘满了怎么清理
- EBS API及接口
- 什么是ETL?ETL是什么技术?
- android程序填空题,10道android填空题及答案
- Excel加密文档 加密保护破解方法 亲测有效
- 如何做好Clickhouse集群的监控覆盖?
- AI写小说!ChatGPT创作福尔摩斯小说,3分钟狂写856字,就问人类慌不慌?
- 狗狗40题~ (Volume C)
- smart700iev3 程序下载设置_Smart 700 IE 如何用以太网下载程序
- JavaScript 语法树与代码转化实践
- 赛尔五镜头倾斜相机PSDK 102S |改变永不止步 6维度全新升级
- Pygame学习笔记11:三角函数及Tank Battle游戏
热门文章
- 嘀嘀的费用是优步的两倍?
- 系统试运行报告是谁写的_家门口就能免费健康自检自测 延吉智慧健康驿站试运行 健康检测服务将惠及更多居民...
- 自然常数e是什么?它是怎么来的?
- vijos 1641 Vs Snowy
- 创作的第一个智能婚恋系统源代码,类似于百合网。
- css中的容器坍塌问题
- python课程结课感悟_关于python课程的感想
- 计算机网络cs144之lab0
- 计算机怎么硬盘重做系统,如何对新的硬盘安装系统进行分区并重新安装系统计算机分区教程...
- gaussdb 日常运维命令总结【01】