如何通俗理解相机标定公式推导与Python编程实践教程
今日语:学习一个算法重要的就是弄清楚这个算法要解决怎样的问题,它的已知量(输入)是什么,待求解的未知量(输出)是什么。
相机标定(Calibration)做了什么事?为何很多地方都需要相机标定?
相机标定主要是为了通过对某个特殊形状的物体拍照从而找到照片中的像素点坐标与现实世界中的三维坐标之间的变换关系。这个变换关系通常是一个矩阵。总结一下“相机标定是想求如何将将现实世界的三维点坐标变换到像素点坐标的那个矩阵”。学习一个算法重要的就是弄清楚这个算法要解决怎样的问题,它的已知量(输入)是什么,待求解的未知量(输出)是什么。现在我们已经知道相机标定要解决一个怎样的问题了。那么一般的相机标定算法它的已知量(输入)是什么,待求解的未知量(输出)是什么?我举个例子(注意这里涉及的坐标都是用齐次坐标来表示)。一般相机标定算法是已知某个像素对应的真实物体点在世界坐标系中的三维坐标(虽然这个很难得到),已知像素点在照片中的二维坐标(这个非常容易)。待求解的未知量为将前面提到的三维坐标变成二维坐标的矩阵,这个矩阵叫做相机矩阵。即。其中是常数。因为的结果一般是这种形式为了让这个齐次坐标变成我们已知的像素坐标这种形式即坐标中的第3位变成1,大家一般会将提取出来。
总结:
相机标定算法中,
已知:像素点坐标,像素点对应真实世界中的那个点在世界坐标系下的三维坐标。
待求解的未知量:将前面提到的三维坐标变成二维坐标的矩阵。这个矩阵叫做相机矩阵。
方程组:。
为何是方程组?因为一个点对应一个方程,照片中会有很多点自然就可以得到一个方程组。这里我只写了一个点对应的方程。解这种线性方程组已经有很多编程工具可以解的,我们后面再讲怎么解。我想你应该已经从直观上以及从数学上已经了解了相机标定的具体内涵。
但是为何我们需要相机标定?这个似乎没有完全详细的解释。因为前面只提到了相机矩阵可以将世界坐标系中的三维坐标变换到照片中的二维坐标。但是我们看到好像很多文章提到了相机标定也可以正畸,求相机内参数矩阵(intrinsic matrix)。这就不得不分析下相机标定所计算出的相机矩阵到底是什么?由什么组成的?
接下来我们分析下相机矩阵到底是一个什么东西?
相机矩阵到底是由什么组成的?
这个还是得回到相机标定解决的问题中来。相机标定解决的问题就是计算出世界坐标系中的坐标变换到像素坐标的矩阵。所以这个里面有两个变换。一个是世界坐标系三维坐标变到相机坐标系中的三维坐标,另一个是相机坐标系中的三维坐标变到照片中的二维坐标。所以相机矩阵就是这两个变换中的变换矩阵相乘而得到。
下面这段文字需要你对相机成像原理有一点点了解(需要知道相机内参数矩阵是什么,可以参考这篇针孔相机模型教程)。
有过一点坐标变换的知识的同学很容易知道世界坐标系三维坐标变到相机坐标系中的三维坐标的那个变换矩阵可以表示为,其中表示旋转矩阵,表示平移量(它是个向量)。大家一般把刚刚提到的这个矩阵叫做外参数矩阵(Extrinsic parameter matrix)。相机坐标系中的三维坐标变到照片中的二维坐标的那个变换矩阵就是相机内参数矩阵(Intrinsic parameter matrix)一般用符号表示。如果你不了解相机内参数矩阵可以看看针孔相机模型教程。
根据前面提到的:
。所以这个里面有两个变换。一个是世界坐标系三维坐标变到相机坐标系中的三维坐标,另一个是相机坐标系中的三维坐标变到照片中的二维坐标。所以相机矩阵就是这两个变换中的变换矩阵相乘而得到。
也就是说。内参数矩阵就是相机的一些参数可以帮助我们正畸。现在就基本从数学上和直观上解释通了相机标定的作用了和原理了。
参考文献:
[1] https://ww2.mathworks.cn/help/vision/ug/camera-calibration.html
[2] https://blog.csdn.net/varyshare/article/details/92096277
[3] https://github.com/varyshare/easy_slam_tutorial