第五讲 相机与图像

理解针孔相机的模型、内参与径向畸变参数,理解一个空间点如何投影到相机成像平面。

掌握OpenCV图像存储与表达方式,学会基本的摄像头标定方法。

1、相机模型

  • 针孔模型、畸变模型构成相机内参数

    • 相机将三维世界中的坐标点映射到二维图像平面的过程可以用一个几何模型描述, 最简单的为针孔模型。

    • 相机透镜的存在,使得光线投影到成像平面过程产生畸变。

  • 针孔相机模型

    • 点P与成像平面上它的像关系:

      • 设O-x-y-x为相机坐标系(z指向相机前方、x向右、y向下,O为相机光心)。空间点P,经过小孔O投影,落在物理成像平面O'-x'-y',成像点为P'。P:[X,Y,Z]^T ,P' :[X',Y',Z']^T ,物理成像平面到小孔距离为f(焦距)。

      • 点P相机坐标与它的像P'之间的空间关系X' = f\tfrac{X}{Z} ;   Y' = f\frac{Y}{Z}

      • 上面公式单位是m,但是在相机中最终获得是像素,还需要在成像平面上对像进行采样和量化

    • 像素坐标系与成像平面之间,相差一个缩放和一个原点的平移。

      • 像素坐标系o-u-v:原点o'位于图像左上角,u轴向右与x轴平行,v轴向下与y轴平行。

      • P'坐标与像素坐标[u,v]^T关系u = \alpha X' + c_x;  v = \beta Y' + c_y

    • 点P相机坐标与像素坐标关系:u = f_x\frac{X}{Z} + c_x ;  v = f_y\frac{Y}{Z} + c_y

      • \alpha f合并为f_x\beta f合并为f_y

      • f单位为m,\alpha \beta单位为像素/m,因此f_x , f_y , c_x, c_y单位为像素。

    • 相机的内参数矩阵K\begin{pmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix}

      • 将点P相机坐标与像素坐标关系写为矩阵,同时习惯性将Z挪到左侧:Z\begin{pmatrix} u \\ v \\ 1 \end{pmatrix} = \begin{pmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} = KP

      • 相机内参出厂之后是固定的,不会在使用过程变化,有时厂商告知内参,有时需自己确定,也就是标定。(成熟标定方法:单目棋盘格张正友标定法)

    • 相机外参:相机位姿R,t。

      • 相机外参会随着相机运动发生改变,也是SLAM中待估计的目标,代表机器人的轨迹。

      • P世界坐标系到像素坐标系:ZP_{uv} = K(RP_w+t) = KTP_w

      • P点相机坐标应是根据其世界坐标 P_w 根据相机当前位姿变换到相机坐标系下的结果。

      • 相机位姿由它的旋转矩阵R和平移向量t描述。

    • P在归一化平面上投影RP_w+t = [X,Y,Z]^T \to [X/Z, Y/Z, 1]^T

      • 归一化坐标可看成相机前方z=1处平面上的一个点,这个z=1的平面也成为归一化平面。

      • 归一化坐标左乘内参就可得到像素坐标。

  • 畸变模型

    • 畸变:径向畸变 和 切向畸变

      • 由透镜形状引起的畸变(Distortion,也叫失真),成为径向畸变,有两类:桶形畸变、枕形畸变。

      • 由于相机组装过程中不能使透镜和成像面严格平行,会引入切向畸变

    • 归一化平面上任意一点p,坐标为[x,y]^T,也可写成极坐标[r, \theta]^T

      • 其中r为点p与坐标系原点之间距离,\theta标识与水平轴夹角。

      • 径向畸变可以看成坐标点沿着长度方向发生变化,也就是距离原点的长度发生变化。

      • 切向畸变可以看成坐标点沿着切线方向发生变化,也就是水平夹角发生变化。

      • 畸变用数学形式表达:

        • 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 )

        • 其中畸变系数:k1,k2,k3, p1,p2。实际应用中可以灵活选择,例如只选择k1,p1,p2

    • 纠正畸变过程:

      • 将三维空间点投影到归一化图像平面

      • 对归一化平面上的点计算径向畸变和切向畸变

      • 将畸变后的点通过内参矩阵投影到像素平面。

  • 双目相机模型

    • 双目相机测量像素距离(深度)原理:通过同步采集左右相机图像,计算图像间视差,以便估计每个像素的深度

      • z = \frac{fb}{d} , d = u_L - u_R 其中f为焦距,b为双目相机的基线,d为左右图的横坐标之差,成为视差。

      • 视差本身计算比较困难,需要计算左右图像对应关系,只有在图像纹理变化处才计算视差,另外由于计算量的原因,需要用GPU或FPGA来实时计算。

  • RGB-D相机模型

    • 按照原理可分为两类:通过红外结构光、通过飞行时间。

    • 除摄像头外,至少会有一个发射器和接收器。

    • 使用范围有限、红外光容易受日光或其他红外光干扰,因此不能在室外使用。

2、图像

  • 传统像素坐标系定义方式:原点位图图像左上角,X轴向右,Y轴向下(也就是u,v坐标)。图像的宽度或列数,对应X轴;图像的高度或行数,对应Y轴:

  • 灰度图:每个像素(x,y)对应一个灰度值,图像在数学上可以记为一个函数:

    • I(x,y):\mathbb{R}^2 -> \mathbb{R},其中(x,y)是像素坐标,灰度值一般用0-255(即一个 unsigned char,1个字节)表达

    • 一张宽度为640像素、高度为480像素分辨率的灰度图可以表示为:unsigned char image[480][640];

    • 程序中图像以二维数据存储,第一个下标指数组的行(图像高度),第二个下表指数组的列(图像宽度)。

    • 程序中访问图像像素:unsigned char pixel = image[y][x],对应灰度值I(x,y)的读数。

  • RGB-D相机的深度图中,记录了各个像素与相机的距离,通常单位为mm,因此采用16位整数(0-65535)记录深度图信息,最大表示65m。

  • 彩色图像,有通道概念,计算机中用RGB组合表达任意色彩,对于每个像素,有R、G、B三个数值,每个数值称为一个通道。

    • 最常见的彩色图像有3个通道,每个通道8位整数,因此一个像素占据24位空间。

    • 通道数量、顺序可自由定义,例如:OpenCV中,彩色图像通道默认顺序是B、G、R。

    • 若还想表达图像图像透明度,就是用R、G、B、A四个通道。

3、计算机中的图像

  • OpenCV基本使用方法

  • 图像去畸变

  • 3D视觉(双目视觉、RGB-D视觉获得像素深度信息,并通过相机内外参,绘制点云地图的代码示例)

4、运行代码踩坑记录

  • 安装opencv,参考安装opencv方法,非常顺利
  • 编译ch5代码报错: fatal error: boost/format.hpp: No such file or directory
  • 解决方法:安装boost   sudo apt-get install libboost-all-dev
  • 编译ch5代码报错如下
  • 解决方法:引入fmt lib库
  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值