fix: la ca marche !
This commit is contained in:
parent
4d270bbacb
commit
c563fb2b60
80
get_proj.py
80
get_proj.py
|
@ -10,45 +10,59 @@ import numpy as np
|
||||||
# 3x4 P matrix from Blender camera
|
# 3x4 P matrix from Blender camera
|
||||||
#---------------------------------------------------------------
|
#---------------------------------------------------------------
|
||||||
|
|
||||||
|
# BKE_camera_sensor_size
|
||||||
|
def get_sensor_size(sensor_fit, sensor_x, sensor_y):
|
||||||
|
if sensor_fit == 'VERTICAL':
|
||||||
|
return sensor_y
|
||||||
|
return sensor_x
|
||||||
|
|
||||||
|
# BKE_camera_sensor_fit
|
||||||
|
def get_sensor_fit(sensor_fit, size_x, size_y):
|
||||||
|
if sensor_fit == 'AUTO':
|
||||||
|
if size_x >= size_y:
|
||||||
|
return 'HORIZONTAL'
|
||||||
|
else:
|
||||||
|
return 'VERTICAL'
|
||||||
|
return sensor_fit
|
||||||
|
|
||||||
# Build intrinsic camera parameters from Blender camera data
|
# Build intrinsic camera parameters from Blender camera data
|
||||||
#
|
#
|
||||||
# See notes on this in
|
# See notes on this in
|
||||||
# blender.stackexchange.com/questions/15102/what-is-blenders-camera-projection-matrix-model
|
# blender.stackexchange.com/questions/15102/what-is-blenders-camera-projection-matrix-model
|
||||||
|
# as well as
|
||||||
|
# https://blender.stackexchange.com/a/120063/3581
|
||||||
def get_calibration_matrix_K_from_blender(camd):
|
def get_calibration_matrix_K_from_blender(camd):
|
||||||
f_in_mm = camd.lens
|
if camd.type != 'PERSP':
|
||||||
|
raise ValueError('Non-perspective cameras not supported')
|
||||||
scene = bpy.context.scene
|
scene = bpy.context.scene
|
||||||
resolution_x_in_px = scene.render.resolution_x
|
f_in_mm = camd.lens
|
||||||
resolution_y_in_px = scene.render.resolution_y
|
|
||||||
scale = scene.render.resolution_percentage / 100
|
scale = scene.render.resolution_percentage / 100
|
||||||
sensor_width_in_mm = camd.sensor_width
|
resolution_x_in_px = scale * scene.render.resolution_x
|
||||||
sensor_height_in_mm = camd.sensor_height
|
resolution_y_in_px = scale * scene.render.resolution_y
|
||||||
pixel_aspect_ratio = scene.render.pixel_aspect_x / scene.render.pixel_aspect_y
|
sensor_size_in_mm = get_sensor_size(camd.sensor_fit, camd.sensor_width, camd.sensor_height)
|
||||||
if (camd.sensor_fit == 'VERTICAL'):
|
sensor_fit = get_sensor_fit(
|
||||||
# the sensor height is fixed (sensor fit is horizontal),
|
camd.sensor_fit,
|
||||||
# the sensor width is effectively changed with the pixel aspect ratio
|
scene.render.pixel_aspect_x * resolution_x_in_px,
|
||||||
s_u = resolution_x_in_px * scale / sensor_width_in_mm / pixel_aspect_ratio
|
scene.render.pixel_aspect_y * resolution_y_in_px
|
||||||
s_v = resolution_y_in_px * scale / sensor_height_in_mm
|
)
|
||||||
else: # 'HORIZONTAL' and 'AUTO'
|
pixel_aspect_ratio = scene.render.pixel_aspect_y / scene.render.pixel_aspect_x
|
||||||
# the sensor width is fixed (sensor fit is horizontal),
|
if sensor_fit == 'HORIZONTAL':
|
||||||
# the sensor height is effectively changed with the pixel aspect ratio
|
view_fac_in_px = resolution_x_in_px
|
||||||
pixel_aspect_ratio = scene.render.pixel_aspect_x / scene.render.pixel_aspect_y
|
else:
|
||||||
s_u = resolution_x_in_px * scale / sensor_width_in_mm
|
view_fac_in_px = pixel_aspect_ratio * resolution_y_in_px
|
||||||
s_v = resolution_y_in_px * scale * pixel_aspect_ratio / sensor_height_in_mm
|
pixel_size_mm_per_px = sensor_size_in_mm / f_in_mm / view_fac_in_px
|
||||||
|
s_u = 1 / pixel_size_mm_per_px
|
||||||
|
s_v = 1 / pixel_size_mm_per_px / pixel_aspect_ratio
|
||||||
|
|
||||||
# Parameters of intrinsic calibration matrix K
|
# Parameters of intrinsic calibration matrix K
|
||||||
alpha_u = f_in_mm * s_u
|
u_0 = resolution_x_in_px / 2 - camd.shift_x * view_fac_in_px
|
||||||
alpha_v = f_in_mm * s_v
|
v_0 = resolution_y_in_px / 2 + camd.shift_y * view_fac_in_px / pixel_aspect_ratio
|
||||||
u_0 = resolution_x_in_px * scale / 2
|
|
||||||
v_0 = resolution_y_in_px * scale / 2
|
|
||||||
skew = 0 # only use rectangular pixels
|
skew = 0 # only use rectangular pixels
|
||||||
|
|
||||||
K = Matrix((
|
K = Matrix(
|
||||||
(alpha_u, skew, u_0),
|
((s_u, skew, u_0),
|
||||||
( 0, alpha_v, v_0),
|
( 0, s_v, v_0),
|
||||||
( 0, 0, 1)
|
( 0, 0, 1)))
|
||||||
))
|
|
||||||
|
|
||||||
return K
|
return K
|
||||||
|
|
||||||
# Returns camera rotation and translation matrices from Blender.
|
# Returns camera rotation and translation matrices from Blender.
|
||||||
|
@ -66,7 +80,7 @@ def get_calibration_matrix_K_from_blender(camd):
|
||||||
# used in digital images)
|
# used in digital images)
|
||||||
# - right-handed: positive z look-at direction
|
# - right-handed: positive z look-at direction
|
||||||
def get_3x4_RT_matrix_from_blender(cam):
|
def get_3x4_RT_matrix_from_blender(cam):
|
||||||
# # bcam stands for blender camera
|
# bcam stands for blender camera
|
||||||
R_bcam2cv = Matrix(
|
R_bcam2cv = Matrix(
|
||||||
((1, 0, 0),
|
((1, 0, 0),
|
||||||
(0, -1, 0),
|
(0, -1, 0),
|
||||||
|
@ -75,20 +89,18 @@ def get_3x4_RT_matrix_from_blender(cam):
|
||||||
# Transpose since the rotation is object rotation,
|
# Transpose since the rotation is object rotation,
|
||||||
# and we want coordinate rotation
|
# and we want coordinate rotation
|
||||||
# R_world2bcam = cam.rotation_euler.to_matrix().transposed()
|
# R_world2bcam = cam.rotation_euler.to_matrix().transposed()
|
||||||
# T_world2bcam = -1*R_world2bcam * location
|
# T_world2bcam = -1*R_world2bcam @ location
|
||||||
#
|
#
|
||||||
# Use matrix_world instead to account for all constraints
|
# Use matrix_world instead to account for all constraints
|
||||||
location, rotation = cam.matrix_world.decompose()[0:2]
|
location, rotation = cam.matrix_world.decompose()[0:2]
|
||||||
R_world2bcam = rotation.to_matrix().transposed()
|
R_world2bcam = rotation.to_matrix().transposed()
|
||||||
|
|
||||||
# Convert camera location to translation vector used in coordinate changes
|
# Convert camera location to translation vector used in coordinate changes
|
||||||
# T_world2bcam = -1*R_world2bcam*cam.location
|
# T_world2bcam = -1*R_world2bcam @ cam.location
|
||||||
# Use location from matrix_world to account for constraints:
|
# Use location from matrix_world to account for constraints:
|
||||||
T_world2bcam = -1*R_world2bcam @ location
|
T_world2bcam = -1*R_world2bcam @ location
|
||||||
|
|
||||||
# Build the coordinate transform matrix from world to computer vision camera
|
# Build the coordinate transform matrix from world to computer vision camera
|
||||||
# NOTE: Use * instead of @ here for older versions of Blender
|
|
||||||
# TODO: detect Blender version
|
|
||||||
R_world2cv = R_bcam2cv@R_world2bcam
|
R_world2cv = R_bcam2cv@R_world2bcam
|
||||||
T_world2cv = R_bcam2cv@T_world2bcam
|
T_world2cv = R_bcam2cv@T_world2bcam
|
||||||
|
|
||||||
|
@ -129,4 +141,4 @@ bpy.app.handlers.frame_change_post.clear()
|
||||||
|
|
||||||
# add handler
|
# add handler
|
||||||
bpy.app.handlers.render_init.append(setup_script)
|
bpy.app.handlers.render_init.append(setup_script)
|
||||||
bpy.app.handlers.frame_change_pre.append(run_script)
|
bpy.app.handlers.frame_change_post.append(run_script)
|
||||||
|
|
Loading…
Reference in a new issue