You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Blender中通过.gltf文件导出相机内参及畸变系数?

获取Blender相机内参与畸变系数并导出到GLTF

一、提取Blender相机的内参与畸变系数

Blender相机的参数可以直接从属性面板查看,也可以用Python脚本批量提取:

1. 手动查看参数

  • 内参相关:在相机属性面板的「镜头」栏,可获取焦距(单位:毫米)、传感器宽度/高度(单位:毫米);在渲染设置中获取图像分辨率(宽/高像素数)、像素宽高比。内参矩阵的核心值计算公式:
    • fx = (图像宽度 × 焦距) / 传感器宽度
    • fy = (图像高度 × 焦距 × 像素高宽比) / (传感器高度 × 像素宽高比)
    • 主点cx = 图像宽度/2 + 相机横向偏移 × 图像宽度,cy = 图像高度/2 - 相机纵向偏移 × 图像高度(Blender的纵向偏移是反向的)
  • 畸变系数:同样在「镜头」栏的「畸变」子项中,可直接读取径向畸变(K1、K2、K3)和切向畸变(P1、P2)的数值。

2. Python脚本批量提取

import bpy
import math

# 获取当前场景激活的相机与渲染设置
camera = bpy.context.scene.camera
scene = bpy.context.scene

# 图像分辨率与像素比例
width = scene.render.resolution_x
height = scene.render.resolution_y
pixel_aspect_x = scene.render.pixel_aspect_x
pixel_aspect_y = scene.render.pixel_aspect_y

# 相机硬件参数
focal_length_mm = camera.data.lens
sensor_width_mm = camera.data.sensor_width
sensor_height_mm = camera.data.sensor_height

# 计算内参(像素单位)
fx = (width * focal_length_mm) / sensor_width_mm
fy = (height * focal_length_mm * pixel_aspect_y) / (sensor_height_mm * pixel_aspect_x)
cx = width / 2.0 + camera.data.shift_x * width
cy = height / 2.0 - camera.data.shift_y * height

# 提取畸变系数
k1 = camera.data.distortion
k2 = camera.data.distortion_k2
k3 = camera.data.distortion_k3
p1 = camera.data.distortion_p1
p2 = camera.data.distortion_p2

二、将参数嵌入GLTF文件

标准GLTF仅支持存储基础相机参数,额外的内参和畸变系数需要通过自定义属性嵌入,导出时包含这些属性即可:

1. 手动添加并导出

  • 选中相机,进入「对象属性」面板的「自定义属性」栏,点击「+」添加属性,依次创建fx、fy、cx、cy、k1、k2、k3、p1、p2并填入对应数值。
  • 导出GLTF时,在导出设置中勾选「包含 > 自定义属性」和「导出相机」,参数会被写入GLTF节点的extras字段。

2. Python脚本自动处理并导出

import bpy

def attach_camera_params():
    camera = bpy.context.scene.camera
    scene = bpy.context.scene
    
    # 计算内参与畸变(代码同第一部分)
    width = scene.render.resolution_x
    height = scene.render.resolution_y
    pixel_aspect_x = scene.render.pixel_aspect_x
    pixel_aspect_y = scene.render.pixel_aspect_y
    focal_length_mm = camera.data.lens
    sensor_width_mm = camera.data.sensor_width
    sensor_height_mm = camera.data.sensor_height
    
    fx = (width * focal_length_mm) / sensor_width_mm
    fy = (height * focal_length_mm * pixel_aspect_y) / (sensor_height_mm * pixel_aspect_x)
    cx = width / 2.0 + camera.data.shift_x * width
    cy = height / 2.0 - camera.data.shift_y * height
    
    k1 = camera.data.distortion
    k2 = camera.data.distortion_k2
    k3 = camera.data.distortion_k3
    p1 = camera.data.distortion_p1
    p2 = camera.data.distortion_p2
    
    # 添加自定义属性到相机对象
    camera["fx"] = fx
    camera["fy"] = fy
    camera["cx"] = cx
    camera["cy"] = cy
    camera["k1"] = k1
    camera["k2"] = k2
    camera["k3"] = k3
    camera["p1"] = p1
    camera["p2"] = p2

# 绑定参数并导出GLTF
attach_camera_params()
bpy.ops.export_scene.gltf(
    filepath="./camera_data.gltf",
    use_selection=True,
    export_extras=True,
    export_cameras=True
)

三、在multi-NeRF加载器中解析参数

加载GLTF后,从相机节点的extras字段提取参数,映射到multi-NeRF所需的数据结构:

import json

def parse_gltf_camera(gltf_path):
    with open(gltf_path, 'r') as f:
        gltf_data = json.load(f)
    
    # 定位相机节点
    camera_node = next((node for node in gltf_data['nodes'] if 'camera' in node), None)
    if not camera_node:
        raise ValueError("GLTF文件中未找到相机")
    
    # 提取自定义参数
    extras = camera_node['extras']
    intrinsics = [
        [extras['fx'], 0, extras['cx']],
        [0, extras['fy'], extras['cy']],
        [0, 0, 1]
    ]
    distortion = [extras['k1'], extras['k2'], extras['p1'], extras['p2'], extras['k3']]
    
    return intrinsics, distortion

内容的提问来源于stack exchange,提问作者Paul45577

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:50:54