如何在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
相关产品推荐
相关产品推荐

