可视化相机pose colmap形式的相机内参外参

目录

内参外参转换

[可视化相机pose colmap形式的相机内参外参](#可视化相机pose colmap形式的相机内参外参)


内参外参转换

python 复制代码
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()

这段代码用于在3D坐标系中可视化相机的位置和朝向。以下是逐行解释:

  1. 提取参数

    复制代码
    qvec = image_data['qvec']  # 相机的旋转四元数 (w, x, y, z 或 x, y, z, w,需确认顺序)
    tvec = image_data['tvec']  # 相机的平移向量 (x, y, z 坐标)
  2. 四元数转旋转矩阵

    python 复制代码
    rotation = R.from_quat(qvec).as_matrix()  # 将四元数转换为3x3旋转矩阵
    • 假设 R 来自 scipy.spatial.transform.Rotation

    • 需确认 qvec 的顺序是否为库预期的格式(通常 R.from_quat 接受 (x, y, z, w))。

  3. 绘制相机位置

    python 复制代码
    ax.scatter(tvec[0], tvec[1], tvec[2], c='r', marker='o')  # 在3D图中用红点标记相机位置
  4. 计算并绘制相机朝向

    python 复制代码
    camera_direction = rotation @ np.array([0, 0, 1])  # 旋转矩阵乘以Z轴单位向量,得到相机在世界坐标系中的朝向
    ax.quiver(tvec[0], tvec[1], tvec[2], 
              camera_direction[0], camera_direction[1], camera_direction[2], 
              length=0.5, normalize=True)
    • 原理:相机坐标系中默认朝向为Z轴正方向(通常指向拍摄方向),通过旋转矩阵将其转换到世界坐标系。

    • 箭头参数

      • 起点为相机位置 (tvec[0], tvec[1], tvec[2])

      • 方向向量为 camera_direction

      • length=0.5 控制箭头显示长度(实际长度可能因归一化调整)。

      • normalize=True 确保箭头方向正确,长度统一。

注意事项

  • 四元数顺序 :确认 qvec 是否与 R.from_quat 兼容(SciPy需 (x, y, z, w))。

  • 坐标系定义 :假设相机朝向为Z轴正方向,若实际定义相反(如OpenGL使用-Z),需调整为 [0, 0, -1]

  • 3D绘图设置 :确保 ax 是3D轴(例如通过 fig.add_subplot(111, projection='3d') 创建)。

效果:在3D图中,红色圆点表示相机位置,箭头指示其拍摄方向。

可视化相机pose colmap形式的相机内参外参

python 复制代码
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)
相关推荐
apocelipes5 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780517 小时前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent12 小时前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m62515 小时前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python
SelectDB1 天前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
荣码2 天前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
金銀銅鐵2 天前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li2 天前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
小九九的爸爸2 天前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
阿耶同学2 天前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员