估计从相机到地平面点的距离

Posted

技术标签:

【中文标题】估计从相机到地平面点的距离【英文标题】:Estimating distance from camera to ground plane point 【发布时间】:2018-02-12 20:00:11 【问题描述】:

如何从图像计算相机到地平面上的点的距离?

我有相机的内在参数和位置(高度、俯仰)。 是否有任何 OpenCV 函数可以估计该距离?

【问题讨论】:

【参考方案1】:

您可以使用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。

【讨论】:

所以平移向量 t 代表了与地平面原点相同原点的坐标系中的相机坐标。在en.wikipedia.org/wiki/Camera_resectioning 页面中:T 是世界坐标系原点的位置,以相机为中心的坐标系坐标表示。 T 经常被误认为是相机的位置. 这是同一个向量吗? 请看我的第一个方程:对于 Pg=(0,0,0),Pc=t:因此 t 是以相机坐标表示的地平面的原点。 我有 GoPro 和这个任务。在实践中什么会更有效,更容易校准相机(我读到人们是如何痛苦的),解决这个问题并使用或者只是用激光测距仪获得一组地面点距离和相机像素的近似依赖性。我假设它会或多或少是线性的。请指教

以上是关于估计从相机到地平面点的距离的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV相机标定及距离估计(单目)

从相机到物体的距离.. 纠错

如何测量物体或人脸与相机的距离

从 GL_POINT 到相机的距离确定 gl_PointSize

如何测量相机与物体之间的距离

5.3节“开槽地平面的串扰”