colmap笔记:将模型和影像位姿转换到GPS坐标系下

colmap笔记:将模型和影像位姿转换到GPS坐标系下

1.背景和需求

在 COLMAP 中使用 GPS 信息作为先验,可以帮助提高重建的精度和效率,特别是在处理大范围或大尺度的场景时。GPS 信息通常被用来约束相机的位置,使重建过程更加准确。GPS 数据通常以 EXIF 元数据的形式存储在 JPEG 图像中,包含 GPS 坐标(经度、纬度、高度)。如果图像含有 EXIF 数据,COLMAP 会自动识别并读取这些信息。

但在稀疏重建阶段,COLMAP 主要关注于图像之间的相对位置和方向,以及场景中3D点的相对位置。默认情况下,COLMAP 不会使用 EXIF 中的 GPS 数据来定义重建模型的坐标系。因此,重建出的模型是与实际地理位置无关的局部坐标系

那么现在想要将重建模型转换到地理坐标系(如基于 GPS 的全球坐标系),发现可以在重建完成后使用 model_aligner 工具将重建的模型缩放、平移和旋转,使其与真实世界的地理坐标系对齐。这要求提供包含 GPS 位置信息的参考图像列表。

官方文档的说明如下:
在这里插入图片描述
让我来一探究竟。

1.尝试

首先已经用colmap做完了稀疏重建,输出模型,然后进行model_aligner,设置好参数,将新的模型输出到gps文件夹。

colmap model_aligner \
    --input_path ./sparse/0 \
    --output_path ./sparse/gps \
    --database_path  ./database.db \
    --ref_is_gps 1 \
    --alignment_type ecef \
    --robust_alignment 1 \
    --robust_alignment_max_error 3.0

此时gps文件夹下的images.txt里记录的四元数和平移参数就是新的坐标系下的
在这里插入图片描述
根据以下代码,可以将其转换到GPS所在wgs84坐标系下:

import numpy as np
from scipy.spatial.transform import Rotation as R
import pyproj
from pyproj import Proj, transform

#0.016938035523210708 0.58455146147157355 -0.48870579156409283 0.64744060819180593 -129342.74756339534 3469822.8668770161 5343696.2087743161
# 四元数 (QW, QX, QY, QZ)
qw, qx, qy, qz = 0.016938035523210708, 0.58455146147157355, -0.48870579156409283, 0.64744060819180593   # 替换为实际值

# 平移向量 (TX, TY, TZ)
tx, ty, tz = -129342.74756339534, 3469822.8668770161, 5343696.2087743161

# 将四元数转换为旋转矩阵
rotation = R.from_quat([qx, qy, qz, qw])
rotation_matrix = rotation.as_matrix()

# 计算相机中心坐标(ECEF坐标系下)
camera_center = -np.dot(rotation_matrix.T, np.array([tx, ty, tz]))
print("投影中心坐标:(ecef坐标系下)", camera_center)

# 定义坐标转换
# 从ECEF转换到WGS84
ecef = Proj(proj='geocent', ellps='WGS84', datum='WGS84')
wgs84 = Proj(proj='latlong', ellps='WGS84', datum='WGS84')

# 执行转换
lon, lat, alt = transform(ecef, wgs84, camera_center[0],camera_center[1], camera_center[2], radians=False)

# 输出WGS84经纬度坐标
print("经度:", lon, "纬度:", lat, "高度:", alt)

# 从WGS84转换到UTM Zone 50N
utm_zone_50n = Proj(proj="utm", zone=50, ellps='WGS84', datum='WGS84', south=False)
utm_x, utm_y = transform(wgs84, utm_zone_50n, lon, lat)

# 输出UTM坐标
print("WGS84坐标系下:UTM Zone 50N X:", utm_x, "Y:", utm_y,"Z:",alt)

# 将四元数转换为旋转矩阵
rotation = R.from_quat([qx, qy, qz, qw])
rotation_matrix = rotation.as_matrix()

# 将旋转矩阵转换为欧拉角 (Omega, Phi, Kappa)
# 摄影测量中通常使用 ZYX 旋转顺序
omega, phi, kappa = rotation.as_euler('ZYX', degrees=True)
print("旋转矩阵:\n", rotation_matrix)

print("Omega:", omega, "Phi:", phi, "Kappa:", kappa)
  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
Colmap是一个用于稀疏三维重建的开源软件,它能够从多张图片中恢复相机的位姿Colmap的输出结果主要包括相机的内外参数以及图像的稀疏三维点云。 Colmap通过对每张图像进行特征提取和匹配,来估计相机的位姿。在特征提取阶段,Colmap会检测图像中的特征点,并计算每个特征点的描述子。在特征匹配阶段,Colmap将对每对图像之间的特征点进行匹配,从而找到它们之间的对应关系。 当Colmap完成特征提取和匹配后,它会使用RANSAC算法估计相机的初始位姿。RANSAC算法通过随机选择一些特征点组成假设模型,然后利用这些假设模型计算出位姿,并计算模型与实际数据之间的误差。通过重复这个过程来选取拟合误差最小的模型,并使用这个模型作为初始位姿Colmap输出的位姿主要包括相机的外部参数,即相机的旋转矩阵和平移向量。旋转矩阵描述了相机坐标系相对于世界坐标系的旋转关系,平移向量描述了相机坐标系相对于世界坐标系的平移关系。 除了相机的外部参数,Colmap还可以输出相机的内部参数,即相机的焦距、主点坐标和畸变系数。内部参数描述了相机的成像特性,例如焦距决定了相机的视场大小,主点坐标决定了图像坐标原点的位置,畸变系数则描述了相机透镜的形状。 最后,Colmap还可以输出图像的稀疏三维点云。这些点云是通过对每个图像的特征点进行三角化计算得到的,每个点的坐标代表了在世界坐标系中的位置。 综上所述,Colmap输出的位姿包括相机的内外参数以及图像的稀疏三维点云,这些信息可以用于进一步的三维重建和视觉定位任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值