How can I achieve simple, accurate, and robust projector-camera calibration?
摘要:来源 http:mesh.brown.educalibrationfilesProjector Calibration Presentation.pdf 概述 对于一个最简单的面结构光系统来说,其通常由一个相机(camera)和一
来源
http://mesh.brown.edu/calibration/files/Projector Calibration Presentation.pdf
概述
对于一个最简单的面结构光系统来说,其通常由一个相机(camera)和一台投影仪(projector)所构成,所需的几何标定任务(geometric calibration)包括:
相机内参 \(K_{cam}\) 的标定
投影仪的内参 \(K_{proj}\) 的标定
投影仪坐标系到相机坐标系转换的外参,即旋转矩阵 \(R\),平移矩阵 \(T\) 。
面结构光三维扫描重建
利用面结构光进行三维扫描重建的步骤通常包括如下4步:
graph LR
A[图像采集] --> B[图像解码] --> C[三角化点云重建] --> D[点云网格化]
图像采集:投影仪投射一些列编码图案到被测物体上,相机捕获到经被测物调制后的编码图案。
图像解码:对调制后的编码图案进行解码,解算这些图案在投影仪和相机之间的对应关系。
三角化点云重建:根据图案在投影仪和相机之间的对应关系,以及提前标定的参数,通过三角测量方法(triangulation),重建出被测物点云。
点云网格化:从不同角度所拍摄的被测物重建出的点云可以融合为一个完整的点云,点云经过网格化(mesh)处理后,可以生成三维模型。
相机标定
相机标定是非常常见的标定任务,主要用到的是针孔相机模型(Pinhole model)以及镜头畸变模型(radial distortion)。
通常定义世界坐标系中的一三维点为 \(X\) ,镜头畸变参数为 \(k_1,k_2,k_3,k_4\) ,相机内参为 $ K = \left[ {\matrix{{{f_x}} & s & {{c_x}} \cr 0 & {{f_y}} & {{c_y}} \cr 0 & 0 & 1 \cr } } \right]$ , 三维点 \(X\) 按照针孔相机模型和镜头畸变模型投影到相机的像平面上,得到二维点 \(x\) ,该过程可以描述为:
\[x=K\cdot L(X;k_1,k_2,k_3,k_4)
\]
其中 \(L\) 表示畸变。
在上述模型中,只有 \(X\) (通常是平面标定板或其他方式已知三维坐标)和 \(x\) (从图像中提取标定板二维点)是已知的,因此要标定剩下的未知模型参数,需要从多个不同的角度去拍摄标定板得到一系列 \(X \leftrightarrow x\) 这样的三维二维点对,构成一系列等式:
\[\matrix{
{x_1=K\cdot L(R_1X+T_1;k_1,k_2,k_3,k_4)} \cr
{x_2=K\cdot L(R_2X+T_2;k_1,k_2,k_3,k_4)} \cr
{x_3=K\cdot L(R_3X+T_3;k_1,k_2,k_3,k_4)} \cr
{\cdots} \cr
}
\]
通过求解上述等式,可求得相机内参 \(K\) 和畸变参数 \(k_1,\cdots,k_4\)。
投影仪标定
对于投影仪来说,其投影过程是编码图案投射出的光线经过镜头折射后,打在被测物上,形成调制图案。投影过程实际上是相机成像的逆过程。投影仪投影到被测物被调制的图案三维点可以看作世界坐标系中的三维点 \(X\) ,经投影仪镜头产生畸变,最后得到投影的原始图案,原始图案所在位置就是像平面,得到的投影点为 \(x\) 。
因此投影仪也可以利用针孔相机模型和畸变模型来建模,只需要把它看作一个 “逆相机”。这样建模的好处是,我们可以按照相机标定的方法对投影仪进行标定。
令投影仪内参为 $ K_{proj} = \left[ {\matrix{{{f_x}} & s & {{c_x}} \cr 0 & {{f_y}} & {{c_y}} \cr 0 & 0 & 1 \cr } } \right]$ ,那么对于投影仪同样有
\[x=K_{proj}\cdot L(X;k_1,k_2,k_3,k_4)
\]
然而,我们知道投影仪是不可以采集图像的,如何构建世界坐标系中的三维点 \(X\) 和 投影仪像平面上的二维点 \(x\) 之间的对应关系 \(X \leftrightarrow x\) 呢?这成了逆相机标定投影仪方法的难点。
投影仪标定已有的一些相关工作
对于投影仪的标定,目前已有的一些工作主要可以分为三大类:
基于相机标定。首先对相机进行标定,然后相机标定结果被用于计算投影仪图案在世界坐标系中的三维点坐标,然而这么做会将相机标定的精度误差会传递给投影仪的标定的精度误差。
基于平面单应性。通过平面单应性原理,计算投影仪图案二维点和世界坐标系中图案三维点之间的对应关系,然而这样建模是线性变换的,无法对投影仪中的镜头畸变建模。
其他方法。这些方法存在难以执行的问题,比如需要特殊的设备或标定靶标,需要颜色校准等等,这些方法使得实际标定时,存在诸多不便。
上述这些方法,精度都不是很高,并且不方便落地执行。
本文提出的投影仪标定方法
本文提出了一种操作简单、精度高、鲁棒性好的投影仪标定方法,该方法具有如下特点:
操作简便:不需要特殊的设备,并且可以重复利用已有的组件。
标定精度高:对于投影仪的建模,不存在任何特殊的约束,符合逆相机的思路。
鲁棒性好:在该方法中,对图案解码的误差处理做了一些优化处理。
简单来说,整体的标定过程如下:
graph LR
A[标定图像采集] -->B[图像解码] -->C[投影仪内参标定]
D[相机内参标定] --> E[系统外参标定]
C-->E
B-->D
标定图像采集
标定图像采集主要分为传统的相机标定图像采集和结构光系统标定图像采集。
传统相机标定图像采集: 需要准备一块平面棋盘格(通过打印机可以非常方便制作得到),然后从不同角度拍摄多张棋盘格标定板图像。
结构光系统标定图像采集:同样也是需要主备一块平面棋盘格,然后从不同角度从投影仪投射编码图案序列到棋盘格标定板上,得到不同角度下的若干张编码图案打在棋盘格标定板上的图像。
从下图我们可以看到,上述两类图像的采集,实际上有可以重复使用的位姿,因此在实际操作时,可以连贯操作,非常方便。
图像解码
图像解码主要是对编码图案被物体调制后的图像进行解码,在该步骤中,有如下几个特点:
解码方式取决于投射的图案:在本方法中,并未对编码图案做具体要求。
使用互补格雷码图案:使用这种编码图案,能够使得在面对复杂的光照条件和彩色物体时解码更鲁棒(注意我们使用的是标准的黑白棋盘格标定板);我们也不需要对光度进行标定(相移法需要做该步骤);我们在该步骤中更多的考虑的是精度而不是速度;投影仪的投影和相机拍照速度都非常块,如果系统能以30 fps同步进行,那么每个标定板位姿下,仅需1.4 s 便可采集完包括相机标定和投影仪标定在内的共计42张图像。
更鲁棒的像素分类方法:对于每个像素,我们通过高频的编码图案计算并分离出该像素成像时所接收的直接照射光和全局照射光;一旦区分出直接和全局照射光后,每个像素的状态被划分为启用、未启用、未知三种状态,用于后续计算时进行分类处理。
投影仪内参标定
一旦图像解码完成后,我们就可以对投影仪和相机的图像像素进行匹配。
对于每个相机图像的像素 \((x,y)\) ,我们都可以将其匹配到投影仪图案中的某一行某一列的像素\((row,col)\),或者设置成位置。
该匹配并不是双向映射的,多个相机图像的像素可以匹配到同一个投影仪图像中的一个像素。
棋盘格标定的角点不适用整像素坐标,而是采用的亚像素坐标,这样更精确。
局部单应性
通常来说,棋盘格标定板整个是一个平面,但是为了更精细一些,我们可以将每个局部一小块位置当作是平面的。在一个较小的局部邻域范围内,由投影仪镜头造成的畸变可以近似忽略不计。而对于整张图像来说,镜头造成的畸变又是不可忽略的,因此如果简单用一个单应性矩阵去建模世界坐标系中的三维点和投影图案二维点是不够的。
为此,本方法提出了局部单应性处理方法,具体的,对于相机拍摄到的每张棋盘格标定板图案,提取其角点 \(p\), 那么其局部单应性可用 \(H\) 表述,而投影仪图像同样对应的角点为 \(q\) ,因此对所有的角点做单应性误差最小化:
\[\matrix{
{\hat{H} = \mathop {\text{argmin}}\limits_H \sum\limits_{\forall {\rm{p}}} {{{\left\| {q - Hp} \right\|}^2}},\bar q = \hat Hp } \cr
{\hat H \in {^{3 \times 3}},p = {\left[ {x,y,1} \right]^T},q = {\left[ {col,row,1} \right]^T}} \cr
}
\]
小结
总结一下投影仪标定的全流程:
1、解码结构光编码图案:相机图像↔投影仪图像匹配
2、提取棋盘格标定板角点的精确像素坐标。
3、对每个角点计算其局部单应性矩阵 \(H\) 。
4、对每个角点,通过下式将其从相机坐标系下的坐标 \(x\) 转换到投影仪坐标系下的坐标 \(x'\)
\[x'=H\cdot x
\]
5、利用投影仪坐标系下的角点坐标 \(x'\) 和其世界坐标系下的坐标 \(X\) ,计算投影仪的内参矩阵,方法与相机内参标定类似:
\[\matrix{
{x'_1=K_{proj}\cdot L(R_1X+T_1;k_1,k_2,k_3,k_4)} \cr
{x'_2=K_{proj}\cdot L(R_2X+T_2;k_1,k_2,k_3,k_4)} \cr
{x'_3=K_{proj}\cdot L(R_3X+T_3;k_1,k_2,k_3,k_4)} \cr
{\cdots} \cr
}
\]
相机内参标定和系统外参标定
相机内参标定
使用常规的角点亚像素提取方法得到二维点,并结合对应的三维点坐标进行常规相机内参标定。值得一提的是,这里我们不用再去额外采集相机标定专用的图像。
系统外参标定
一旦相机内参 \(K_{cam}\)和投影仪的内参 \(K_{proj}\) 标定完成后,我们就可以标定系统外参 \(R\) 和 \(T\) 。利用前面提到的方程组可解算 :
\[\matrix{
{\tilde{x}_1=L^{-1}(K_{cam}^{-1}\cdot{x_1};k_1,k_2,k_3,k_4)} \cr
{\tilde{x}_2=L^{-1}(K_{cam}^{-1}\cdot{x_2};k_1,k_2,k_3,k_4)} \cr
{\tilde{x}_3=L^{-1}(K_{cam}^{-1}\cdot{x_3};k_1,k_2,k_3,k_4)} \cr
{\cdots} \cr
}
\]
\[\matrix{
{x'_1=K_{proj}\cdot L(R\tilde{x}_1+T_1;k'_1,k'_2,k'_3,k'_4)} \cr
{x'_2=K_{proj}\cdot L(R\tilde{x}_2+T_2;k'_1,k'_2,k'_3,k'_4)} \cr
{x'_3=K_{proj}\cdot L(R\tilde{x}_3+T_3;k'_1,k'_2,k'_3,k'_4)} \cr
{\cdots} \cr
}
\]
标定软件
本文还开发了一套自动标定软件,用户只需要提供一个包含全部所需图像的文件夹,点击“标定”按钮,软件就可以自动提取棋盘格标定板角点,解码结构光投影图案,并标定系统。
算法流程:
1、对每个位姿下的棋盘格标定板提取角点。
2、估计全局光照和直接光照分量。
3、解码结构光编码图案。
4、计算每个棋盘格角点的局部单应性矩阵。
5、利用局部单应性矩阵将每个角点转换到投影仪坐标系下。
6、利用提取的角点进行相机内参标定。
7、利用提取的投影仪坐标系下的角点进行投影仪内参标定。
8、固定投影仪和相机的内参,标定系统外参。
9、可选的,包括投影仪内参、相机内参、系统外参在内的全部参数可以放在一起进行优化。
结果对比
根据现有的 procamcalib 软件,在使用相同的相机内参的条件,对比该方法和全局单应性方法以及本文方法所标定的投影仪内参精度,结果表明本文方法标定的投影仪重投影误差最小。
投影仪的镜头畸变分布图如下:
与激光扫描仪重建的效果进行对比,结果如下:
总结
本文方法是有效的。
不用做特殊的处理,不需要额外的材料。
重复利用软件组件:
相机标定软件。
结构光投影、采集、解码软件。
局部单应性高效地解决了投影仪镜头畸变的建模问题。
考虑投影仪镜头畸变后,标定精度明显提高。
与激光扫描仪进行了精确对比。
附录
格雷码与二进制码对比
直接光照和全局光照分量
三角化点云重建
