今日语:学习一个算法重要的就是弄清楚这个算法要解决怎样的问题,它的已知量(输入)是什么,待求解的未知量(输出)是什么。——@司南牧
相机标定(Calibration)做了什么事?为何很多地方都需要相机标定?
相机标定主要是为了通过对某个特殊形状的物体拍照从而找到照片中的像素点坐标与现实世界中的三维坐标之间的变换关系。这个变换关系通常是一个矩阵。总结一下“相机标定是想求如何将将现实世界的三维点坐标变换到像素点坐标的那个矩阵”。学习一个算法重要的就是弄清楚这个算法要解决怎样的问题,它的已知量(输入)是什么,待求解的未知量(输出)是什么。现在我们已经知道相机标定要解决一个怎样的问题了。那么一般的相机标定算法它的已知量(输入)是什么,待求解的未知量(输出)是什么?我举个例子(注意这里涉及的坐标都是用齐次坐标来表示)。一般相机标定算法是已知某个像素对应的真实物体点在世界坐标系中的三维坐标 [ x y z 1 ] \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} ⎣⎢⎢⎡xyz1⎦⎥⎥⎤(虽然这个很难得到),已知像素点在照片中的二维坐标 [ u v 1 ] \begin{bmatrix} u \\ v \\ 1\end{bmatrix} ⎣⎡uv1⎦⎤(这个非常容易)。待求解的未知量为将前面提到的三维坐标变成二维坐标的矩阵 P \bold P P,这个矩阵叫做相机矩阵。即 c [ u v 1 ] = P [ x y z 1 ] c \begin{bmatrix} u \\ v \\ 1\end{bmatrix}=\bold P \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} c⎣⎡uv1⎦⎤=P⎣⎢⎢⎡xyz1⎦⎥⎥⎤。其中 c c c是常数。因为 P [ x y z 1 ] \bold P \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} P⎣⎢⎢⎡xyz1⎦⎥⎥⎤的结果一般是这种形式 [ a b c ] \begin{bmatrix} a \\ b \\ c\end{bmatrix} ⎣⎡abc⎦⎤为了让这个齐次坐标变成我们已知的像素坐标 [ u v 1 ] \begin{bmatrix} u \\ v \\ 1\end{bmatrix} ⎣⎡uv1⎦⎤这种形式即坐标中的第3位变成1,大家一般会将 c c c提取出来。
总结:
相机标定算法中,
已知:像素点坐标 [ u v 1 ] \begin{bmatrix} u \\ v \\ 1\end{bmatrix} ⎣⎡uv1⎦⎤,像素点对应真实世界中的那个点在世界坐标系下的三维齐次坐标 [ x y z 1 ] \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} ⎣⎢⎢⎡xyz1⎦⎥⎥⎤。
待求解的未知量:将前面提到的三维齐次坐标 [ x y z 1 ] \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} ⎣⎢⎢⎡xyz1⎦⎥⎥⎤变成二维坐标 [ u v 1 ] \begin{bmatrix} u \\ v \\ 1\end{bmatrix} ⎣⎡uv1⎦⎤的矩阵 P \bold P P。这个矩阵叫做相机矩阵。
线性等式约束: c [ u v 1 ] = P [ x y z 1 ] c \begin{bmatrix} u \\ v \\ 1\end{bmatrix}=\bold P \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} c⎣⎡uv1