像素坐标、图像坐标、相机坐标和世界坐标

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

  • 世界坐标系->相机坐标系
    像素坐标、图像坐标、相机坐标和世界坐标_第2张图片
    世界坐标系下的点可以通过旋转和平移转到相机坐标系下.
    像素坐标、图像坐标、相机坐标和世界坐标_第3张图片
    其中T的定义:

    也就是我们说的相机的外参矩阵,OpenCV中可以通过SolvePnP等方法算出.

  • 相机坐标系->图像坐标系(image coordinate system)

这里说的图像(image)坐标系就是本文第一张图的xoy坐标系, X c , Y c X_c, Y_c Xc,Yc除以 Z c Z_c Zc变成了齐次坐标系, 这个点会落在xoy这个坐标系下. 相机坐标系向齐次坐标系(图像坐标系)转换可以用这个公式表示:
像素坐标、图像坐标、相机坐标和世界坐标_第4张图片
公式中的 x ′ = X c / Z c , y ′ = Y c / Z c x'=X_c/Z_c, y'=Y_c/Z_c x=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_y u=αfxx+cx;v=βfyy+cy
    这里的 f x , f y , c x , c y f_x, f_y, c_x, c_y fx,fy,cx,cy为相机内参的值, 通过标定可以获取.
    像素坐标、图像坐标、相机坐标和世界坐标_第5张图片
    这个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_c Zc, 所以三维点到二维点的投影是一个退化的过程, 我们不得不考虑使用深度相机或者双目来获取这个 Z c Z_c Zc
    关于相机内参矩阵, OpenCV中可以通过cv::calibrateCamera函数获取.
    像素坐标、图像坐标、相机坐标和世界坐标_第6张图片

  • 相机畸变
    当镜头畸变较大时, 相机坐标系下的点 X c X_c Xc不能简单的乘以一个其次坐标系转换矩阵就行了(也就是说 X c , Y c , Z c X_c, Y_c, Z_c Xc,Yc,Zc不能简单的除以 Z c Z_c Zc来齐次, 由于径向畸变的存在, 需要用新的方法计算图像坐标系,
    在这里插入图片描述
    上式中的 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

你可能感兴趣的:(视觉算法,opencv,计算机视觉,人工智能)