相机成像时,世界坐标系下三维空间的一点(X_w, Y_w, Z_w)到像素(u,v)的转换需要经历世界坐标系->相机坐标系->图像坐标系->像素坐标系一系列变换.
世界坐标系->相机坐标系

世界坐标系下的点可以通过旋转和平移转到相机坐标系下.
其中T的定义:
也就是我们说的相机的外参矩阵,OpenCV中可以通过SolvePnP等方法算出.相机坐标系->图像坐标系(image coordinate system)
这里说的图像(image)坐标系就是本文第一张图的xoy坐标系,X c , Y c X_c, Y_cXc,Yc除以Z c Z_cZc变成了齐次坐标系, 这个点会落在xoy这个坐标系下. 相机坐标系向齐次坐标系(图像坐标系)转换可以用这个公式表示:
公式中的x ′ = X c / Z c , y ′ = Y c / Z c x'=X_c/Z_c, y'=Y_c/Z_cx′=Xc/Zc,y′=Yc/Zc ,
图像(image)坐标系->像素坐标系
图像坐标系的点u, v可以用下列公式获取
u = α ∗ f x ∗ x ′ + c x ; v = β ∗ f y ∗ y ′ + c y u = \alpha * f_x * x' + c_x; v = \beta * f_y * y' + c_yu=α∗fx∗x′+cx;v=β∗fy∗y′+cy
这里的f x , f y , c x , c y f_x, f_y, c_x, c_yfx,fy,cx,cy为相机内参的值, 通过标定可以获取.
这个K也就是我们常说的相机内参矩阵,他能直接将相机坐标系下的点转换到像素坐标系下.
这个K是透视投影矩阵(最后一行为[0, 0, 1], 左边的uv转换为齐次坐标后需要除以Z,所以会产生透视效果). 正交投影则不会有透视效果, 比如3d 人脸中常用的投影矩阵:
( 1 0 0 0 1 0 ) \left(\begin{array}{lll} 1 & 0 & 0 \\ 0 & 1 & 0 \end{array}\right)(100100)
丢弃了最后一行,所以点的z坐标对投影位置没有影响.
同时, 由于uv的计算没有使用Z c Z_cZc, 所以三维点到二维点的投影是一个退化的过程, 我们不得不考虑使用深度相机或者双目来获取这个Z c Z_cZc
关于相机内参矩阵, OpenCV中可以通过cv::calibrateCamera函数获取.
相机畸变
当镜头畸变较大时, 相机坐标系下的点X c X_cXc不能简单的乘以一个其次坐标系转换矩阵就行了(也就是说X c , Y c , Z c X_c, Y_c, Z_cXc,Yc,Zc不能简单的除以Z c Z_cZc来齐次, 由于径向畸变的存在, 需要用新的方法计算图像坐标系,
上式中的x ′ ′ , y ′ ′ x^{''}, y^{''}x′′,y′′通过一下式获取.

式中的
相机坐标系点其次化后可以得到x ′ , y ′ x', y'x′,y′
k1, k2, k3, k4, k5, k6同样可以通过标定相机获取.
参考:
https://learnopencv.com/geometry-of-image-formation/
https://docs.opencv.org/3.4/d9/d0c/group__calib3d.html