之前我们已经完成了
- 棋盘格标靶的制作
- 相机内参的标定
接下来我们将实现使用标定后的相机完成图像内棋盘格标靶起始点的三维定位/测距,如下图所示。
看到这句话我们的第一印象可能是:单目相机如何实现三维测距呢?的确,由于相机的成像结果中丢失了深度信息,我们一般不能恢复图像中某个点的深度。如下图所示,图像中点P'对应的可能是世界坐标系中直线上P'P的任意一个位于相机前方的点。
但是我们当前的应用场景与上图不同,体现在1)我们会利用棋盘格标靶的多个角点进行计算;2)棋盘格标靶上每个角点的物理相对位置是已知的(标靶宽度已知)。实际上我们是在计算标靶所在的世界坐标系到相机所在坐标系的变换矩阵T,然后再将标靶坐标系上某个点的坐标变换至相机坐标系,即得到该点相对于相机的三维位置;下面结合图片来做详细说明。
首先是相机坐标系,如下图左侧所示,位于相机物理成像平面且Z轴看向前方。然后是右侧的标靶所在的世界坐标系,其原点设为左上角的角点,且标靶所在平面为XY平面,Z轴向里。
我们已知棋盘格标靶的各个角点位于棋盘格坐标系的坐标(单位mm,Z为0),同时通过角点检测可得到它们对应的像素坐标,且已知相机的内参与畸变系数,那么我们可以求解得到标靶坐标系到相机坐标系的变换矩阵Tcw。对于标靶左上角角点,它在标靶坐标系的坐标为Pw(0,0,0),则该角点在相机坐标系下的坐标Pc=Tcw*Pw,即得到了它相对于相机坐标系的三维位置。
以上就是基于单目相机实现标靶三维定位的原理,接下来我们进行代码实现。