zoukankan      html  css  js  c++  java
  • 相机标定(Camera calibration)

    简单介绍

    摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程。也就是求终于的投影矩阵 P 的过程,以下相关的部分主要參考UIUC的计算机视觉的课件(网址Spring 2016 CS543 / ECE549 Computer vision)。

    基本的坐标系:

    • 世界坐标系(world coordinate system)。
    • 相机坐标系(camera coordinate system);
    • 图像坐标系(image coordinate system);

    一般来说,标定的过程分为两个部分:

    • 第一步是从世界坐标系转换为相机坐标系,这一步是三维点到三维点的转换。包含 Rt (相机外參)等參数;
    • 第二部是从相机坐标系转为图像坐标系。这一步是三维点到二维点的转换,包含 K(相机内參)等參数;

    相机坐标系 转换到 图像坐标系

    坐标系介绍

    相机到图片

    如上图所看到的(图片来自UIUC计算机视觉课件)。是一个小孔成像的模型,当中:

    • C 点表示camera centre,即相机的中心点,也是相机坐标系的中心点;
    • Z 轴表示principal axis,即相机的主轴;
    • p 点所在的平面表示image plane,即相机的像平面。也就是图片坐标系所在的二维平面。
    • p 点表示principal point。即主点。主轴与像平面相交的点;
    • C 点到 p 点的距离。也就是右边图中的 f 表示focal length,即相机的焦距;
    • 像平面上的 xy 坐标轴是与相机坐标系上的 XY 坐标轴互相平行的。
    • 相机坐标系是以 XYZ(大写)三个轴组成的且原点在 C 点。度量值为米(m);
    • 像平面坐标系是以 xy(小写)两个轴组成的且原点在 p 点,度量值为米(m);
    • 图像坐标系一般指图片相对坐标系,在这里能够觉得和像平面坐标系在一个平面上,只是原点是在图片的角上,并且度量值为像素的个数(pixel)。

    相机 转换到 像平面

    知道上面的简单知识后,假设知道相机坐标系中的一个点 X(现实三维世界中的点)。在像平面坐标系相应的点是 x,要求求从相机坐标系转为像平面坐标系的转换,也就是从 X 点的(X,Y,Z)通过一定的转换变为 x 点的(x,y)。注意:(X,Y,Z)(大写)是在相机坐标系。而(x,y)(小写)是在像平面坐标系(还不是图像坐标系。原点不同。

    )观察第二个图,非常简单的能够得到这个转换:

    x=fX/Z
    y=fY/Z
    (X,Y,Z)(fX/Z,fY/Z)

    能够表示为矩阵计算为(在这里用的是齐次坐标的表示方式,关于齐次坐标文章最以下有介绍):

    XYZ1fXfYZ=ff1000XYZ1

    能够简写为(P 就是所谓的投影矩阵,当然如今还不完整):

    x=PX

    增加偏移量

    通过上面,能够把相机坐标系转换到像平面坐标系,可是像平面坐标系和图像坐标系尽管在同一个平面上,可是原点并非同一个,而目标是要转换到图像坐标系下。所以还须要一步操作。例如以下图:

    这里写图片描写叙述

    如上图所看到的(图片来自UIUC计算机视觉课件),当中主点 p 是像平面坐标系的原点,但在图像坐标系中的位置为(px,py),在这里。图形坐标系的原点是图片的左下角,所以能够得到:

    (X,Y,Z)(fX/Z+px,fY/Z+py)

    相当于在上面的基础上加了一个p点坐标的偏移量,同一时候能够表示为矩阵计算为(在这里用的是齐次坐标的表示方式):

    XYZ1fX+ZpxfY+ZpyZ=ffpxpy1000XYZ1

    整理一下得:

    fX+ZpxfY+ZpyZ=ffpxpy1111000XYZ1

    所以最后能够得到 K。也就是平时所说的相机内參(Intrinsic parameters):

    K=ffpxpy1

    以及投影矩阵 P(在这里能够觉得旋转矩阵 R 为单位矩阵 I。平移矩阵 t 都为0,这也是为什么要拆成这样的方式),为:
    P=K[I0]

    像素坐标

    前面也提到了在图像坐标系中用的不是现实生活中的m来度量。而是用的 pixel 的个数,所以在上面转换到图像坐标系中还有个问题。就是坐标的表示还是m,并没有转换到像素坐标系统;在这里须要引入一个新概念就是:

    • mx 表示在水平方向1m的长度包含的像素的个数;
    • my 表示在竖直方向1m的长度包含的像素的个数;

    可能有人奇怪为啥不是一个值,还须要分别指定 mxmy 呀,这是由于通过上面能够得到一个像素点的大小(m度量)为:

    1mx×1my

    可是须要说明的是像素并不一定是一个正方形。有时候可能也是一个矩形。所以要分别指定。
    所以能够把上面相机内參 K 变为更新为。转换公式把 K 替换就可以,其它不变:

    K=mxmy1ffpxpy1=αxαyβxβy1

    一般来说。在使用相机内參K计算坐标系转换时,提供的都是已经变换后的值;比如会提供 fxfycxcy 四个值代表相机内參K,事实上 fx 就是这里的 αx,同理 fyαycxβxcyβy

    世界坐标系 转换到 图像坐标系

    坐标系介绍

    如上图所看到的(图片来自UIUC计算机视觉课件)。从世界坐标系转换到相机坐标系是三维空间到三维空间的变换。一般来说须要一个平移操作和一个旋转操作就能够完毕这个转换。用公式表演示样例如以下(能够理解为世界坐标系原点先平移到相机坐标系的位置然后在做一次坐标系旋转,使坐标轴对齐。):

    X˜cam=R(X˜C˜)

    • R 表示旋转矩阵;
    • X˜ 表示 X 点在世界坐标系中的位置;
    • C˜ 表示相机原点 C 在世界坐标系中的位置;
    • X˜cam 表示 X 点在相机坐标系中的位置;

    世界 转换到 相机

    依据上面的公式能够得到从一个三维点从世界坐标系转换到相机坐标的变换公式例如以下(也是用的齐次坐标的表示方式):

    Xcam=(X˜cam1)=[R0RC˜1](X˜1)=[R0RC˜1]X

    世界 转换到 图像

    依据上面的讨论知道了如何从世界坐标系转换到相机坐标系(平移和旋转)以及从相机坐标系转换到图像坐标系(相机内參变换),所以带入上面的矩阵计算,能够得到:

    x=K[I0]Xcam=K[RRC˜]X

    这样就得到了终于的投影矩阵 P

    P=K[Rt]

    当中:

    t=RC˜

    在这里,K 一般称为相机内參(intrinsic parameters),描写叙述了相机的内部參数,包含焦距 f、主点 p 的位置、以及像素与真实环境的大小比例等。这个是固有属性,是提供好的。Rt 称为相机外參(extrinsic parameters)。R 在这里是旋转矩阵。能够转换为三维的旋转向量。分别表示绕xyz 三个轴的旋转角度。t 眼下就是一个平移向量,分别表示在xyz 三个方向上的平移量。

    畸变參数(distortion parameters)

    在几何光学和阴极射线管(CRT)显示中。畸变(distortion) 是对直线投影(rectilinear projection)的一种偏移。

    简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。那畸变简单来说就是一条直线投影到图片上不能保持为一条直线了。这是一种光学畸变(optical aberration)。可能由于摄像机镜头的原因,这里不讨论。有兴趣的能够查阅光学畸变的相关的资料。
    畸变一般能够分为两大类,包含径向畸变和切向畸变。

    基本的一般径向畸变有时也会有轻微的切向畸变。

    径向畸变(Radial distortion

    径向畸变的效应有三种。一种是桶形畸变(barrel distortion),还有一种是枕形畸变(pincushion distortion)。还有一种是两种的结合叫做胡子畸变(mustache distortion),从图片中能够非常easy看出差别。详细见下图(图片来自wikipedia):

    径向畸变能够用例如以下公式修正:

    xcorr=xdis(1+k1r2+k2r4+k3r6)

    ycorr=ydis(1+k1r2+k2r4+k3r6)

    切向畸变(tangential distortion

    切向畸变是由于透镜与成像平面不严格的平行,其能够用例如以下公式修正:

    xcorr=xdis+[2p1xy+p2(r2+2x2)]

    ycorr=ydis+[p1(r2+2y2)+2p2xy]

    当中:

    • xdisydis 表示有畸变的坐标;
    • xcorrycorr 表示修复后的坐标;
    • k1k2k3 表示径向畸变參数;
    • p1p2 表示切向畸变參数。

    所以终于得到5个畸变參数:

    D=(k1,k2,p1,p2,k3)

    相机标定

    那么能够利用这些来进行终于的任务相机标定。简单的过程能够描写叙述为通过标定板。例如以下图。能够得到n个相应的世界坐标三维点 Xi 和相应的图像坐标二维点 xi,这些三维点到二维点的转换都能够通过上面提到的相机内參 K。相机外參 Rt,以及畸变參数 D 经过一系列的矩阵变换得到。

    如今就用这些相应关系来求解这些相机參数。最后就是用线性方法求解方程式。这里就不做讨论了。

    那为什么要做相机标定呢?
    每一个镜头的畸变程度各不同样,通过相机标定能够校正这样的镜头畸变。事实上能够觉得用这样的标定的方式来求解相机内參和畸变參数。相当于一种相机校准,然后这些參数就能够用于后面的求解。

    比如求解新拍的两幅图片相对的 Rt。求解这个外參用到就是标定得到的相机内參和畸变參数。

    齐次坐标
    就是将一个原本是n维的向量用一个n+1维向量来表示。
    很多图形应用涉及到几何变换。主要包含平移、旋转、缩放。

    以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来能够表示为 x=RX+t(注:由于习惯的原因,实际使用时一般使用变化矩阵左乘向量)(R 旋转缩放矩阵,t 为平移矩阵,X 为原向量,x 为变换后的向量)。

    引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为 x=PX 的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到还有一个坐标系的有效方法。

    和上面的计算过程是相应的。

  • 相关阅读:
    Tomcat 跨域问题的解决
    [SheetJS] js-xlsx模块学习指南
    漂亮又好用的Redis可视化客户端汇总
    Visual Studio 2015 出现 NuGet 安装程序包错误解决方法
    vs2015使用nuget包管理器安装失败
    C# 尝试还原程序包是出错:找不到“XXXXX”版本的程序包“XXXXXX”
    基于flink和drools的实时日志处理
    Docker常用命令
    Laravel5打印所有运行SQL
    Laravel5版本在sql查询时用when方便条件判断查询【闭包方式】
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7161547.html
Copyright © 2011-2022 走看看