我们从Google街景(GSV)API抓取了一组图片。我想从2D图像估计3D世界坐标,给出以下内容:
1。捕捉图像的相机的GPS位置(即纬度和经度)
将GPS坐标转换为平移矩阵:使用了2种类型的转换 获得翻译矩阵的方法 - > UTM转换并转换为笛卡尔坐标。
x = Radius * math.cos(纬度)* math.cos(经度)
y = Radius * math.cos(纬度)* math.sin(经度)
z = Radius * math.sin(纬度)
2。使用openSFM(即SFM)计算的旋转矩阵 算法)。
该库提供 alpha , beta , gamma 角度(Radian),映射到偏航,< em> pitch 和 roll 角度。旋转矩阵使用公式(http://planning.cs.uiuc.edu/node102.html)
构造旋转矩阵(R):R(alpha,beta,gamma)= R_z(alpha)* R_y(beta)* R_x(gamma)
第3。根据视场角度和图像尺寸, 我们将校准矩阵估计为以下(https://codeyarns.com/2015/09/08/how-to-compute-intrinsic-camera-matrix-for-a-camera/ enter link description here):
K = [[f_x s X],[0 f_y Y],[0 0 1]]
x和y是图像尺寸的一半(即,x =宽度/ 2,y =高度/ 2)
GSV API提供视角θ(例如,45或80),因此焦距可以计算为
f_x = x /tan(θ/ 2)
f_y = y /tan(θ/ 2)
使用矩阵T,R和K,我们如何估计2D图像中每个像素的3D世界坐标?
答案 0 :(得分:0)
单张图像无法实现 - 投影时3D深度信息会丢失。即使您使用多个图像,使用您拥有的数据也很难(或几乎不可能完成任何准确性)。
GSV API不会提供原始图像数据,而是已经投影到立方体全景图中的图像,遵循一系列转换,其目标是增强最终全景图的视觉外观。此外,原始图像本身是通过移动平台的滚动快门相机拍摄的,因此无论非线性镜头失真如何,标准针孔模型都不适用于它们。试图在街景图像上进行“运动结构”必然是一种无尽的失望,除非你确切知道自己在做什么,并且正在谷歌工作,可以访问内部数据。
“真实”的方法是将相同车辆收集的LIDAR数据与图像一起注册。谷歌在内部做到这一点,但我不相信他们曾将结果暴露在外部可访问的产品中。