第五讲:相机与图像

第五讲:相机与图像

1. 相机模型

我们使用针孔模型和镜头畸变来描述投影过程.

1.1. 针孔相机模型

利用小孔成像原理将三维世界投影到二维平面中.

现在对针孔模型进行简单建模:

  • O x y z Oxyz Oxyz 坐标系
  • z z z轴指向相机前方
  • x x x右方
  • y y y下方
  • 现实世界的空间点 p p p
  • 小孔为坐标中心 O O O
  • p p p的投影点在平面 O ′ − x ′ − y ′ O^\prime-x^\prime-y^\prime Oxy上.
  • 成像点为 p ′ p^\prime p
  • p的坐标为 [ X , Y , Z ] T [X,Y,Z]^T [X,Y,Z]T, p ′ p^\prime p [ X ′ , Y ′ , Z ′ ] T [X^\prime,Y^\prime,Z^\prime]^T [X,Y,Z]T
  • 物理成像平面到小孔的距离为 f f f
    在这里插入图片描述

根据三角相似的关系:

Z f = − X X ′ = − Y Y ′ \frac{Z}{f} = - \frac{X}{X^\prime} = - \frac{Y}{Y^\prime} fZ=XX=YY

为了简化,我们将物体和成像都放在相机的同侧,这样可以简化掉负号:
Z f = X X ′ = Y Y ′ \frac{Z}{f} = \frac{X}{X^\prime} = \frac{Y}{Y^\prime} fZ=XX=YY

整理得:
{ X ′ = f X Z Y ′ = f Y Z \begin{cases} X^\prime = f\frac{X}{Z} \\ Y^\prime = f\frac{Y}{Z} \end{cases} {X=fZXY=fZY

尽管现实中小孔成像是倒立的,但是我们人为将其置为正立.

在物理成像平面固定着一个像素平面: o − u − v o-u-v ouv, 在像素平面得到的 P ′ P^\prime P的坐标为: [ u , v ] T [u,v]^T [u,v]T

像素坐标系: 远点 o ′ o^\prime o位于图像的左上角,u 轴向右与x轴平行, v轴向下与y轴平行.

像素坐标系与成像平面之间相差了一个缩放原点平移.

假设像素坐标:

  • u u u轴缩放了 α \alpha α
  • v v v轴缩放了 β \beta β
  • 原点平移了 [ c x , c y ] T [c_x,c_y]^T [cx,cy]T

P ′ P^\prime P坐标与像素坐标 [ u , v ] T [u,v]^T [u,v]T之间的关系为:

{ u = α X ′ + c x v = β Y ′ + c y \begin{cases} u=\alpha X^\prime +c_x \\ v=\beta Y^\prime +c_y \end{cases} {u=αX+cxv=βY+cy

根据: X ′ = f X Z ; Y ′ = f Y Z X^\prime = f\frac{X}{Z} ;\quad Y^\prime = f\frac{Y}{Z} X=fZX;Y=fZY,可得:
{ u = α f X Z + c x v = β f Y Z + c y \begin{cases} u=\alpha f\frac{X}{Z} +c_x \\ v=\beta f\frac{Y}{Z} +c_y \end{cases} {u=αfZX+cxv=βfZY+cy

α f = f x ; β f = f y \alpha f= f_x; \quad \beta f=f_y αf=fx;βf=fy,得:
{ u = f x X Z + c x v = f y Y Z + c y \begin{cases} u=f_x\frac{X}{Z} +c_x \\ v=f_y\frac{Y}{Z} +c_y \end{cases} {u=fxZX+cxv=fyZY+cy

将其化为矩阵形式:
[ u v 1 ] = 1 Z [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] ≜ 1 Z K P \begin{bmatrix} u\\v\\1 \end{bmatrix} = \frac{1}{Z} \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} \triangleq \frac{1}{Z}KP uv1=Z1fx000fy0cxcy1XYZZ1KP

将Z移动到左边:
Z [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] ≜ K P Z \begin{bmatrix} u\\v\\1 \end{bmatrix} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} \triangleq KP Zuv1=fx000fy0cxcy1XYZKP

K K K称为内参矩阵.

P P P的世界坐标到像素坐标的投影关系:
Z P u v = Z [ u v 1 ] = K ( R P w + t ) = K T P w ZP_{uv}=Z\begin{bmatrix} u\\v\\1 \end{bmatrix} = K(RP_w +t) = KTP_w ZPuv=Zuv1=K(RPw+t)=KTPw

上式两端都是齐次坐标. 所以可以将Z去掉:

P u v = K T P w P_{uv} = KTP_w Puv=KTPw

右侧的 T P w TP_w TPw表示把世界坐标系下的齐次坐标变换到相机坐标系下.为了使它能够与K相乘, 取它的前三维组成三维向量.
然后按照齐次坐标的方式将其归一化处理:

假设:
( T P w ) ( 1 : 3 ) = [ X Y Z ] = P ~ c (TP_w)_{(1:3)} = \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} = \tilde{P}_c (TPw)(1:3)=XYZ=P~c
归一化:
P c = [ X / Z Y / Z 1 ] P_c = \begin{bmatrix} X/Z \\ Y/Z \\ 1 \end{bmatrix} Pc=X/ZY/Z1

所以我们可以把像素坐标 [ u , v ] T [u,v]^T [u,v]T 看成是对归一化平面的点进行量化的过程.

1.2. 畸变

由透镜引起的畸变称为径向畸变.主要分为两类:桶形畸变枕形畸变.

在畸变中穿过图像中心和光轴有焦点的直线还能保持形状不变.

在相机的 组装过程中由于透镜和成像面不能严格的平行会产生切向畸变.

对于径向畸变无论是桶形畸变还是枕形畸变,因为他们都是随着与中心的距离增加而增加,因此可以用一个多项式函数来描述该变化:
x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) x_{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6) \newline y_{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6) xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)

  • [ x , y ] T [x,y]^T [x,y]T是归一化平面点的坐标
  • [ x d i s t o r t e d , y d i s t o r t e d ] T [x_{distorted},y_{distorted}]^T [xdistorted,ydistorted]T 是畸变后的点坐标。

对于切向畸变可以使用另外两个参数 p 1 , p 2 p_1,p_2 p1,p2进行纠正.

x d i s t o r t e d = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t o r t e d = y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y x_{distorted}=x+2p_1xy+p_2(r^2+2x^2) \newline y_{distorted}=y+p_1(r^2+2y^2)+2p_2xy xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy

因此对于坐标系的点我们通过5个畸变系数得到它在像素平面的正确位置:

  1. 三维空间点投影到归一化平面坐标为: [ x , y ] T [x,y]^T [x,y]T

  2. 进行径向畸变和切向畸变:

    { x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y \begin{cases} x_{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6) +x+2p_1xy+p_2(r^2+2x^2) \\ y_{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6) + y+p_1(r^2+2y^2)+2p_2xy \end{cases} {xdistorted=x(1+k1r2+k2r4+k3r6)+x+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+y+p1(r2+2y2)+2p2xy

  3. 通过内参矩阵投影到像素平面:

    { u = f x x d i s t o r t e d + c x v = f y y d i s t o r t e d + c y \begin{cases} u=f_xx_{distorted} +c_x \\ v=f_yy_{distorted}+c_y \end{cases} {u=fxxdistorted+cxv=fyydistorted+cy

总结单目相机的成像过程:

  1. 世界坐标下有一个固定点 P P P,它的世界坐标为 P w P_w Pw
  2. P P P的相机坐标为 P c = R P w + t P_c=RP_w +t Pc=RPw+t
  3. P c P_c Pc归一化为 P c = [ X / Z , Y / Z , 1 ] T P_c=[X/Z,Y/Z,1]^T Pc=[X/Z,Y/Z,1]T
  4. 经过内参得到像素坐标, P u v = K P c P_{uv} = KP_c Puv=KPc

1.3. 双目相机模型

设一个空间点 P P P,它在左右眼相机成像分别为 P L , P R P_L,P_R PL,PR

这两个成像也只有在x轴上有差异. 记它的左右侧x轴坐标分别为 u L , u R u_L,u_R uL,uR

根据 Δ P L P R 和 Δ O L O R \Delta P_LP_R和\Delta O_LO_R ΔPLPRΔOLOR的相似关系:
z − d z = b − u L + u R b \frac{z-d}{z} = \frac{b-u_L+u_R}{b} zzd=bbuL+uR
整理得:
z = f b d , d = u L − u R z=\frac{fb}{d},\quad d=u_L-u_R z=dfb,d=uLuR

  • d表示视差
  • z表示物体离相机的距离

1.4. RGB-D 相机模型

它能够主动测量每个像素的深度.原理是向目标发射一束光线,然后测量接收到的时间.

RGB-D相机分为两大类:

  • 红外结构光.
  • 飞行时间法.

2. 图像

在计算机中图像存储为一个二维数组.

由于图像的坐标定义为:x轴为宽,y轴为高.所以访问图像中像素点: i m a g e [ y ] [ x ] image[y][x] image[y][x],对应的灰度值为 I ( x , y ) I(x,y) I(x,y)

一个像素的灰度可以用8位整数记录, 也就是0~255的值.如果要记录像素点更多的信息,必须增加灰度值的位数.

彩色图像的表示则需要通道的概念.对于每个像素我们需要记录R,G,B三个数值,每个数值称为一个通道. 最常见的彩色通道由8位整数表示.

3. 实践:图像的存取与访问

3.1. 安装openCV

  1. 从源码安装
  2. 安装库文件

在编译之前先安装opencv的依赖

sudo apt-get install build-essential libgtk2.0-dev  libvtk5-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev libtbb-dev 

如果从源码安装,OpenCV会在CMake阶段检查依赖是否安装,并调用自己的功能.

本所能够使用openCV3系列

3.2. 操作opencv的图像

代码见/code/第五讲

3.3. 实践:点云拼接

  • 根据RGB-D图像和相机内参,可以计算任何一个像素在相机坐标下的位置.
  • 根基相机位姿又能计算出这写点下世界坐标中 的位置.

书中的点云库是PCL库.

代码见/code/第五讲

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值