您可以使用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和λ的值。但这意味着Zg = 0,所以你只有3个未知数。解决它们(你从第3个等式恢复lambda,然后在前两个中替换),你得到解决问题的Xg和Yg。
单个图像无法进行深度计算。您需要立体声配置(或至少两个已知距离的图像)。据我所知,单帧/图像的深度感知是不可能的。
非常感谢@Francesco的答案。我真的不知道这个方法。现在自己调查一下。