【发布时间】:2018-02-12 20:00:11
【问题描述】:
【问题讨论】:
标签: opencv image-processing computer-vision
【问题讨论】:
标签: opencv image-processing computer-vision
您可以使用undistortPoints 来计算反向投影像素的光线,但是该 API 很难用于您的目的。在您的代码中“手动”进行计算可能更容易。至少执行一次也可以帮助您了解该 API 到底在做什么。
将您的相机“位置(高度,俯仰)”表示为旋转矩阵 R 和平移向量 t,表示从地平面原点到相机的坐标变换。也就是说,给定地平面坐标 Pg = [Xg, Yg, Zg] 中的一个点,它在相机坐标系中的坐标由下式给出
Pc = R * Pg + t
相机中心是相机坐标中的 Cc = [0, 0, 0]。在地面坐标中是:
Cg = -R' * t
其中 R' 是 R 的转置。
为简单起见,我们假设地平面为 Zg = 0。
令 K 为内参矩阵。给定一个像素 q = [u, v],将其写入齐次图像坐标 Q = [u, v, 1]。它在相机坐标中的位置是
Qc = Ki * Q
其中 Ki = inv(K) 是内参数矩阵的逆矩阵。那么世界坐标中的同一点就是
Qg = R' * Qc -R' * t
所有属于从相机中心穿过该像素的射线的点 Pg = [Xg, Yg, Zg],以地面坐标表示,然后在线上
Pg = Cg + lambda * (Qg - Cg)
对于 lambda 从 0 到正无穷大。最后一个公式表示地面 XYZ 坐标中的三个方程,您想要找到射线与地面相交处的 X、Y、Z 和 lambda 值。但这意味着 Zg=0,所以你只有 3 个未知数。求解它们(你从第三个方程中恢复 lambda,然后代入前两个方程),你得到问题解的 Xg 和 Yg。
【讨论】: