相机姿态可视化 colmap形式的相机内参外参文件 怎么进行可视化?
- 矩阵运算更直观:旋转矩阵可以直接与平移向量结合,形成相机的外参矩阵(Extrinsic Matrix)。
- 可视化需求:旋转矩阵的每一列分别对应相机坐标系中X/Y/Z轴在世界坐标系中的方向,便于绘制相机的坐标轴。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.spatial.transform import Rotation as R
def read_cameras(file_path):
cameras = {}
with open(file_path, 'r') as file:
for line in file:
if line[0] == '#':
continue
parts = line.strip().split()
camera_id = int(parts[0])
model = parts[1]
width = int(parts[2])
height = int(parts[3])
params = np.array([float(p) for p in parts[4:]])
cameras[camera_id] = {
'model': model,
'width': width,
'height': height,
'params': params
}
return cameras
def read_images(file_path):
images = {}
with open(file_path, 'r') as file:
for line in file:
if line[0] == '#':
continue
parts = line.strip().split()
if len(parts) == 15:
continue
image_id = int(parts[0])
qvec = np.array([float(p) for p in parts[1:5]])
tvec = np.array([float(p) for p in parts[5:8]])
camera_id = int(parts[8])
file_name = parts[9]
images[image_id] = {
'qvec': qvec,
'tvec': tvec,
'camera_id': camera_id,
'file_name': file_name
}
return images
def visualize_cameras(cameras, images):
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for image_id, image_data in images.items():
qvec = image_data['qvec']
tvec = image_data['tvec']
# Convert quaternion to rotation matrix
rotation = R.from_quat(qvec).as_matrix()
# Plot camera position
ax.scatter(tvec[0], tvec[1], tvec[2], c='r', marker='o')
# Plot camera orientation
camera_direction = rotation @ np.array([0, 0, 1])
ax.quiver(tvec[0], tvec[1], tvec[2], camera_direction[0], camera_direction[1], camera_direction[2], length=0.5, normalize=True)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
# 示例使用
cameras = read_cameras('./cameras.txt')
images = read_images('./images.txt')
visualize_cameras(cameras, images)