前言:在 Blender 的图形化界面中,没有直接的选项可以导出渲染图片的外参矩阵。你可以通过 Python API 来获取并导出相机的外参矩阵。
blender导出相机参数
1.单张照片
import numpy as np
import bpy
# 获取当前活动相机
cam = bpy.context.scene.camera
# 获取相机的外参矩阵
matrix_world = cam.matrix_world
# 将矩阵转换为 numpy 数组
matrix_np = np.array(matrix_world)
# 保存到文件
np.savetxt('E:\\matrix.txt', matrix_np)
2.多张照片(视频)
import bpy
import numpy as np
# 获取当前场景
scene = bpy.context.scene
# 获取当前活动相机
cam = bpy.context.scene.camera
# 创建一个空的列表来保存所有的矩阵
matrices = []
# 对于场景中的每一帧
for frame in range(scene.frame_start, scene.frame_end + 1):
# 设置当前帧
scene.frame_set(frame)
# 获取相机的外参矩阵
matrix_world = cam.matrix_world
# 将矩阵转换为 numpy 数组并添加到列表中
matrices.append(np.array(matrix_world))
# 将矩阵转换为 numpy 数组
matrix_np = np.array(matrix_world)
# 保存到文件,每一帧保存为一个文件
np.savetxt(f'E:\\briefcase\\matrix_{frame}.txt', matrix_np)
# 将所有的矩阵保存到一个文件中
np.save('E:\\briefcase\\matrices.npy', matrices)
numpy.load('matrices.npy')
3.坐标系转换
在 Blender 中,相机的外参矩阵是以右手坐标系表示的,而 OpenCV 使用的是左手坐标系。
import bpy
import numpy as np
# 获取当前场景
scene = bpy.context.scene
# 获取当前活动相机
cam = bpy.context.scene.camera
# 创建一个空的列表来保存所有的矩阵
matrices = []
# 对于场景中的每一帧
for frame in range(scene.frame_start, scene.frame_end + 1):
# 设置当前帧
scene.frame_set(frame)
# 获取相机的外参矩阵
matrix_world = cam.matrix_world
# 将矩阵转换为 numpy 数组
matrix_np = np.array(matrix_world)
# 创建一个转换矩阵
transform = np.array([[1, 0, 0, 0],
[0, -1, 0, 0],
[0, 0, -1, 0],
[0, 0, 0, 1]])
# 将 Blender 的外参矩阵转换为 OpenCV 的坐标系
matrix_opencv = np.dot(transform, matrix_np)
# 保存到文件,每一帧保存为一个文件
np.savetxt(f'matrix_{frame}.txt', matrix_opencv)