战斗包子
SLAM-相机与图像

SLAM-相机与图像

相机模型

针孔相机模型

X=fXZX'=f\frac{X}{Z} Y=fYZY'=f\frac{Y}{Z}

相机模型

针孔相机模型

X=fXZX'=f\frac{X}{Z} Y=fYZY'=f\frac{Y}{Z}

20240703203611.png
假设传感器像素屏幕坐标为o-u-v,从左上向游侠。此时像素平面上点P’的坐标为[u,v]T[u,v]^T
如果传感器原点的平移为[Cx,Cy]T[C_x,C_y]^T

{u=fxXZ+Cxv=fyYZ+Cy\begin{equation} \left\{ \begin{array}{lr} u = f_x\frac{X}{Z}+C_x\\ v = f_y\frac{Y}{Z}+C_y \end{array} \right. \end{equation} [uv1]=[fx/Z0cx0fy/Zcy001/Z][XYZ]=1ZKP\begin{bmatrix}u\\v\\1\end{bmatrix} = \begin{bmatrix} f_x/Z&0&c_x\\0&f_y/Z&c_y\\0&0&1/Z \end{bmatrix} \begin{bmatrix} X\\Y\\Z \end{bmatrix} =\frac{1}{Z}KP

其中K为内参矩阵
对于世界坐标系W中的点PWP_W,若相机位姿为R,t(外参),则有

zPUV=K(RPW+t)=KTPWz\mathbf {P_{UV}} = K (RP_W+t) = KTP_W

连线射线上的点都可以对应到同一个像素上,因此一般可以用归一化平面上的点进行处理。这也意味着点的深度在投影过程中被丢失了。

畸变的矫正

径向畸变
20240703212738.png
切向畸变
20240703212747.png

对于归一化平面上的任意一点p=[x,y]Tp = [x,y]^T,径向畸变可以看作坐标点与原点的距离发生变化,切向畸变可以看成坐标点沿切线方向发生变化(?)。

xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)\begin{align} x_{distorted} = x(1+k_1r^2+k_2r^4+k_3r^6) \\ y_{distorted} = y(1+k_1r^2+k_2r^4+k_3r^6) \end{align}

上式的畸变以径向距离r为变量,描述了径向畸变。

xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy\begin{align} x_{distorted} = x+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted} = y+p_1(r^2+2y^2)+2p_2xy \end{align}

该式添加了圆锥曲线方程?总之表示的是切向畸变(为什么)

  • 将三维空间点投影到归一化平面[x,y]T[x,y]^T
  • 计算畸变
xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy\begin{align} x_{distorted} = x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted} = y(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y^2)+2p_2xy \end{align}
  • 畸变点在像素平面的位置为
{u=fxxdistort+Cxv=fyydistort+Cy\begin{equation} \left\{ \begin{array}{lr} u = f_xx_{distort}+C_x\\ v = f_yy_{distort}+C_y \end{array} \right. \end{equation}

对于实际探测而言,如果已经有像素平面上的坐标[u,v]T[u,v]^T,可以逆推出实际点的位置。

[xy]=f([uv])\begin{bmatrix} x\\ y \end{bmatrix}= f(\begin{bmatrix} u\\ v \end{bmatrix})

双目相机

解决景深的获取
20240703225710.pngb为基线
世界坐标系中的空间点P在左右相机各成一像PL,PR(位置是归一化平面,O才是像素平面)。(UR是负数)

buL+uRb=zfz\frac{b-u_L+u_R}{b} = \frac{z-f}{z} z=fbuLuRz = \frac{fb}{u_L-u_R}

代码实现

假设传感器像素屏幕坐标为o-u-v,从左上向游侠。此时像素平面上点P’的坐标为[u,v]T[u,v]^T
如果传感器原点的平移为[Cx,Cy]T[C_x,C_y]^T

{u=fxXZ+Cxv=fyYZ+Cy\begin{equation} \left\{ \begin{array}{lr} u = f_x\frac{X}{Z}+C_x\\ v = f_y\frac{Y}{Z}+C_y \end{array} \right. \end{equation} [uv1]=[fx/Z0cx0fy/Zcy001/Z][XYZ]=1ZKP\begin{bmatrix}u\\v\\1\end{bmatrix} = \begin{bmatrix} f_x/Z&0&c_x\\0&f_y/Z&c_y\\0&0&1/Z \end{bmatrix} \begin{bmatrix} X\\Y\\Z \end{bmatrix} =\frac{1}{Z}KP

其中K为内参矩阵
对于世界坐标系W中的点PWP_W,若相机位姿为R,t(外参),则有

zPUV=K(RPW+t)=KTPWz\mathbf {P_{UV}} = K (RP_W+t) = KTP_W

连线射线上的点都可以对应到同一个像素上,因此一般可以用归一化平面上的点进行处理。这也意味着点的深度在投影过程中被丢失了。

畸变的矫正

径向畸变

相机模型

针孔相机模型

X=fXZX'=f\frac{X}{Z} Y=fYZY'=f\frac{Y}{Z}

20240703203611.png
假设传感器像素屏幕坐标为o-u-v,从左上向游侠。此时像素平面上点P’的坐标为[u,v]T[u,v]^T
如果传感器原点的平移为[Cx,Cy]T[C_x,C_y]^T

{u=fxXZ+Cxv=fyYZ+Cy\begin{equation} \left\{ \begin{array}{lr} u = f_x\frac{X}{Z}+C_x\\ v = f_y\frac{Y}{Z}+C_y \end{array} \right. \end{equation} [uv1]=[fx/Z0cx0fy/Zcy001/Z][XYZ]=1ZKP\begin{bmatrix}u\\v\\1\end{bmatrix} = \begin{bmatrix} f_x/Z&0&c_x\\0&f_y/Z&c_y\\0&0&1/Z \end{bmatrix} \begin{bmatrix} X\\Y\\Z \end{bmatrix} =\frac{1}{Z}KP

其中K为内参矩阵
对于世界坐标系W中的点PWP_W,若相机位姿为R,t(外参),则有

zPUV=K(RPW+t)=KTPWz\mathbf {P_{UV}} = K (RP_W+t) = KTP_W

连线射线上的点都可以对应到同一个像素上,因此一般可以用归一化平面上的点进行处理。这也意味着点的深度在投影过程中被丢失了。

畸变的矫正

径向畸变
20240703212738.png
切向畸变
20240703212747.png

对于归一化平面上的任意一点p=[x,y]Tp = [x,y]^T,径向畸变可以看作坐标点与原点的距离发生变化,切向畸变可以看成坐标点沿切线方向发生变化(?)。

xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)\begin{align} x_{distorted} = x(1+k_1r^2+k_2r^4+k_3r^6) \\ y_{distorted} = y(1+k_1r^2+k_2r^4+k_3r^6) \end{align}

上式的畸变以径向距离r为变量,描述了径向畸变。

xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy\begin{align} x_{distorted} = x+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted} = y+p_1(r^2+2y^2)+2p_2xy \end{align}

该式添加了圆锥曲线方程?总之表示的是切向畸变(为什么)

  • 将三维空间点投影到归一化平面[x,y]T[x,y]^T
  • 计算畸变
xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy\begin{align} x_{distorted} = x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted} = y(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y^2)+2p_2xy \end{align}
  • 畸变点在像素平面的位置为
{u=fxxdistort+Cxv=fyydistort+Cy\begin{equation} \left\{ \begin{array}{lr} u = f_xx_{distort}+C_x\\ v = f_yy_{distort}+C_y \end{array} \right. \end{equation}

对于实际探测而言,如果已经有像素平面上的坐标[u,v]T[u,v]^T,可以逆推出实际点的位置。

[xy]=f([uv])\begin{bmatrix} x\\ y \end{bmatrix}= f(\begin{bmatrix} u\\ v \end{bmatrix})

双目相机

解决景深的获取
20240703225710.pngb为基线
世界坐标系中的空间点P在左右相机各成一像PL,PR(位置是归一化平面,O才是像素平面)。(UR是负数)

buL+uRb=zfz\frac{b-u_L+u_R}{b} = \frac{z-f}{z} z=fbuLuRz = \frac{fb}{u_L-u_R}

代码实现

切向畸变

相机模型

针孔相机模型

X=fXZX'=f\frac{X}{Z} Y=fYZY'=f\frac{Y}{Z}

20240703203611.png
假设传感器像素屏幕坐标为o-u-v,从左上向游侠。此时像素平面上点P’的坐标为[u,v]T[u,v]^T
如果传感器原点的平移为[Cx,Cy]T[C_x,C_y]^T

{u=fxXZ+Cxv=fyYZ+Cy\begin{equation} \left\{ \begin{array}{lr} u = f_x\frac{X}{Z}+C_x\\ v = f_y\frac{Y}{Z}+C_y \end{array} \right. \end{equation} [uv1]=[fx/Z0cx0fy/Zcy001/Z][XYZ]=1ZKP\begin{bmatrix}u\\v\\1\end{bmatrix} = \begin{bmatrix} f_x/Z&0&c_x\\0&f_y/Z&c_y\\0&0&1/Z \end{bmatrix} \begin{bmatrix} X\\Y\\Z \end{bmatrix} =\frac{1}{Z}KP

其中K为内参矩阵
对于世界坐标系W中的点PWP_W,若相机位姿为R,t(外参),则有

zPUV=K(RPW+t)=KTPWz\mathbf {P_{UV}} = K (RP_W+t) = KTP_W

连线射线上的点都可以对应到同一个像素上,因此一般可以用归一化平面上的点进行处理。这也意味着点的深度在投影过程中被丢失了。

畸变的矫正

径向畸变
20240703212738.png
切向畸变
20240703212747.png

对于归一化平面上的任意一点p=[x,y]Tp = [x,y]^T,径向畸变可以看作坐标点与原点的距离发生变化,切向畸变可以看成坐标点沿切线方向发生变化(?)。

xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)\begin{align} x_{distorted} = x(1+k_1r^2+k_2r^4+k_3r^6) \\ y_{distorted} = y(1+k_1r^2+k_2r^4+k_3r^6) \end{align}

上式的畸变以径向距离r为变量,描述了径向畸变。

xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy\begin{align} x_{distorted} = x+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted} = y+p_1(r^2+2y^2)+2p_2xy \end{align}

该式添加了圆锥曲线方程?总之表示的是切向畸变(为什么)

  • 将三维空间点投影到归一化平面[x,y]T[x,y]^T
  • 计算畸变
xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy\begin{align} x_{distorted} = x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted} = y(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y^2)+2p_2xy \end{align}
  • 畸变点在像素平面的位置为
{u=fxxdistort+Cxv=fyydistort+Cy\begin{equation} \left\{ \begin{array}{lr} u = f_xx_{distort}+C_x\\ v = f_yy_{distort}+C_y \end{array} \right. \end{equation}

对于实际探测而言,如果已经有像素平面上的坐标[u,v]T[u,v]^T,可以逆推出实际点的位置。

[xy]=f([uv])\begin{bmatrix} x\\ y \end{bmatrix}= f(\begin{bmatrix} u\\ v \end{bmatrix})

双目相机

解决景深的获取
20240703225710.pngb为基线
世界坐标系中的空间点P在左右相机各成一像PL,PR(位置是归一化平面,O才是像素平面)。(UR是负数)

buL+uRb=zfz\frac{b-u_L+u_R}{b} = \frac{z-f}{z} z=fbuLuRz = \frac{fb}{u_L-u_R}

代码实现

对于归一化平面上的任意一点p=[x,y]Tp = [x,y]^T,径向畸变可以看作坐标点与原点的距离发生变化,切向畸变可以看成坐标点沿切线方向发生变化(?)。

xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)\begin{align} x_{distorted} = x(1+k_1r^2+k_2r^4+k_3r^6) \\ y_{distorted} = y(1+k_1r^2+k_2r^4+k_3r^6) \end{align}

上式的畸变以径向距离r为变量,描述了径向畸变。

xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy\begin{align} x_{distorted} = x+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted} = y+p_1(r^2+2y^2)+2p_2xy \end{align}

该式添加了圆锥曲线方程?总之表示的是切向畸变(为什么)

  • 将三维空间点投影到归一化平面[x,y]T[x,y]^T
  • 计算畸变
xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy\begin{align} x_{distorted} = x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted} = y(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y^2)+2p_2xy \end{align}
  • 畸变点在像素平面的位置为
{u=fxxdistort+Cxv=fyydistort+Cy\begin{equation} \left\{ \begin{array}{lr} u = f_xx_{distort}+C_x\\ v = f_yy_{distort}+C_y \end{array} \right. \end{equation}

对于实际探测而言,如果已经有像素平面上的坐标[u,v]T[u,v]^T,可以逆推出实际点的位置。

[xy]=f([uv])\begin{bmatrix} x\\ y \end{bmatrix}= f(\begin{bmatrix} u\\ v \end{bmatrix})

双目相机

解决景深的获取

相机模型

针孔相机模型

X=fXZX'=f\frac{X}{Z} Y=fYZY'=f\frac{Y}{Z}

20240703203611.png
假设传感器像素屏幕坐标为o-u-v,从左上向游侠。此时像素平面上点P’的坐标为[u,v]T[u,v]^T
如果传感器原点的平移为[Cx,Cy]T[C_x,C_y]^T

{u=fxXZ+Cxv=fyYZ+Cy\begin{equation} \left\{ \begin{array}{lr} u = f_x\frac{X}{Z}+C_x\\ v = f_y\frac{Y}{Z}+C_y \end{array} \right. \end{equation} [uv1]=[fx/Z0cx0fy/Zcy001/Z][XYZ]=1ZKP\begin{bmatrix}u\\v\\1\end{bmatrix} = \begin{bmatrix} f_x/Z&0&c_x\\0&f_y/Z&c_y\\0&0&1/Z \end{bmatrix} \begin{bmatrix} X\\Y\\Z \end{bmatrix} =\frac{1}{Z}KP

其中K为内参矩阵
对于世界坐标系W中的点PWP_W,若相机位姿为R,t(外参),则有

zPUV=K(RPW+t)=KTPWz\mathbf {P_{UV}} = K (RP_W+t) = KTP_W

连线射线上的点都可以对应到同一个像素上,因此一般可以用归一化平面上的点进行处理。这也意味着点的深度在投影过程中被丢失了。

畸变的矫正

径向畸变
20240703212738.png
切向畸变
20240703212747.png

对于归一化平面上的任意一点p=[x,y]Tp = [x,y]^T,径向畸变可以看作坐标点与原点的距离发生变化,切向畸变可以看成坐标点沿切线方向发生变化(?)。

xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)\begin{align} x_{distorted} = x(1+k_1r^2+k_2r^4+k_3r^6) \\ y_{distorted} = y(1+k_1r^2+k_2r^4+k_3r^6) \end{align}

上式的畸变以径向距离r为变量,描述了径向畸变。

xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy\begin{align} x_{distorted} = x+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted} = y+p_1(r^2+2y^2)+2p_2xy \end{align}

该式添加了圆锥曲线方程?总之表示的是切向畸变(为什么)

  • 将三维空间点投影到归一化平面[x,y]T[x,y]^T
  • 计算畸变
xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy\begin{align} x_{distorted} = x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted} = y(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y^2)+2p_2xy \end{align}
  • 畸变点在像素平面的位置为
{u=fxxdistort+Cxv=fyydistort+Cy\begin{equation} \left\{ \begin{array}{lr} u = f_xx_{distort}+C_x\\ v = f_yy_{distort}+C_y \end{array} \right. \end{equation}

对于实际探测而言,如果已经有像素平面上的坐标[u,v]T[u,v]^T,可以逆推出实际点的位置。

[xy]=f([uv])\begin{bmatrix} x\\ y \end{bmatrix}= f(\begin{bmatrix} u\\ v \end{bmatrix})

双目相机

解决景深的获取
20240703225710.pngb为基线
世界坐标系中的空间点P在左右相机各成一像PL,PR(位置是归一化平面,O才是像素平面)。(UR是负数)

buL+uRb=zfz\frac{b-u_L+u_R}{b} = \frac{z-f}{z} z=fbuLuRz = \frac{fb}{u_L-u_R}

代码实现

b为基线
世界坐标系中的空间点P在左右相机各成一像PL,PR(位置是归一化平面,O才是像素平面)。(UR是负数)

buL+uRb=zfz\frac{b-u_L+u_R}{b} = \frac{z-f}{z} z=fbuLuRz = \frac{fb}{u_L-u_R}

代码实现

本文作者:战斗包子
本文链接:https://paipai121.github.io/2024/07/03/学习记录/SLAM-相机与图像/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可