You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@ShenhanQian I am trying to run VHAP using my custom multiview (16 cameras) dataset. I am facing a issue with the landmarks generated with the VHAP while processing my custom dataset. This is the script I have used to extract the camera parameters and create the 'camera_params.json' file .
importbpyfrommathutilsimportMatrix, Vectorimportjson#---------------------------------------------------------------# 3x4 P matrix from Blender camera#---------------------------------------------------------------# BKE_camera_sensor_sizedefget_sensor_size(sensor_fit, sensor_x, sensor_y):
ifsensor_fit=='VERTICAL':
returnsensor_yreturnsensor_x# BKE_camera_sensor_fitdefget_sensor_fit(sensor_fit, size_x, size_y):
ifsensor_fit=='AUTO':
ifsize_x>=size_y:
return'HORIZONTAL'else:
return'VERTICAL'returnsensor_fit# Build intrinsic camera parameters from Blender camera data## See notes on this in # blender.stackexchange.com/questions/15102/what-is-blenders-camera-projection-matrix-model# as well as# https://blender.stackexchange.com/a/120063/3581defget_calibration_matrix_K_from_blender(camd):
ifcamd.type!='PERSP':
raiseValueError('Non-perspective cameras not supported')
scene=bpy.context.scenef_in_mm=camd.lensscale=scene.render.resolution_percentage/100resolution_x_in_px=scale*scene.render.resolution_xresolution_y_in_px=scale*scene.render.resolution_ysensor_size_in_mm=get_sensor_size(camd.sensor_fit, camd.sensor_width, camd.sensor_height)
sensor_fit=get_sensor_fit(
camd.sensor_fit,
scene.render.pixel_aspect_x*resolution_x_in_px,
scene.render.pixel_aspect_y*resolution_y_in_px
)
pixel_aspect_ratio=scene.render.pixel_aspect_y/scene.render.pixel_aspect_xifsensor_fit=='HORIZONTAL':
view_fac_in_px=resolution_x_in_pxelse:
view_fac_in_px=pixel_aspect_ratio*resolution_y_in_pxpixel_size_mm_per_px=sensor_size_in_mm/f_in_mm/view_fac_in_pxs_u=1/pixel_size_mm_per_pxs_v=1/pixel_size_mm_per_px/pixel_aspect_ratio# Parameters of intrinsic calibration matrix Ku_0=resolution_x_in_px/2-camd.shift_x*view_fac_in_pxv_0=resolution_y_in_px/2+camd.shift_y*view_fac_in_px/pixel_aspect_ratioskew=0# only use rectangular pixelsK=Matrix(
((s_u, skew, u_0),
( 0, s_v, v_0),
( 0, 0, 1)))
returnK# Returns camera rotation and translation matrices from Blender.# # There are 3 coordinate systems involved:# 1. The World coordinates: "world"# - right-handed# 2. The Blender camera coordinates: "bcam"# - x is horizontal# - y is up# - right-handed: negative z look-at direction# 3. The desired computer vision camera coordinates: "cv"# - x is horizontal# - y is down (to align to the actual pixel coordinates # used in digital images)# - right-handed: positive z look-at directiondefget_3x4_RT_matrix_from_blender(cam):
# bcam stands for blender cameraR_bcam2cv=Matrix(
((1, 0, 0),
(0, -1, 0),
(0, 0, -1)))
# Transpose since the rotation is object rotation, # and we want coordinate rotation# R_world2bcam = cam.rotation_euler.to_matrix().transposed()# T_world2bcam = -1*R_world2bcam @ location## Use matrix_world instead to account for all constraintslocation, rotation=cam.matrix_world.decompose()[0:2]
R_world2bcam=rotation.to_matrix().transposed()
# Convert camera location to translation vector used in coordinate changes# T_world2bcam = -1*R_world2bcam @ cam.location# Use location from matrix_world to account for constraints: T_world2bcam=-1*R_world2bcam @ location# Build the coordinate transform matrix from world to computer vision cameraR_world2cv=R_bcam2cv@R_world2bcamT_world2cv=R_bcam2cv@T_world2bcam# put into 3x4 matrixRT=Matrix((
R_world2cv[0][:] + (T_world2cv[0],),
R_world2cv[1][:] + (T_world2cv[1],),
R_world2cv[2][:] + (T_world2cv[2],)
))
returnRTcameras= [objforobjinbpy.data.objectsifobj.type=='CAMERA']
cam=bpy.data.objects['cam_1']
K=get_calibration_matrix_K_from_blender(cam.data)
data= {'world_2_cam':{}, 'height':1920, 'width':1080}
data['intrinsics'] = [list(row) forrowinK]
fori, camerainenumerate(cameras,start=1):
RT=get_3x4_RT_matrix_from_blender(camera)
data['world_2_cam'][i] = [list(row) forrowinRT]
output_path='//camera_params.json'withopen(output_path,'w') asf:
json.dump(data,f,indent=4)
print("camera_params.json file created")
This is the landmark output which I got from VHAP -
output.mp4
Why is the landmarks not aligning with the face initially? The face mesh appears to be in the wrong orientation in the above example. What should be possible issues causing this? Is there something wrong in my camera_params.json file which I have generated from blender?
@ShenhanQian I am trying to run VHAP using my custom multiview (16 cameras) dataset. I am facing a issue with the landmarks generated with the VHAP while processing my custom dataset. This is the script I have used to extract the camera parameters and create the 'camera_params.json' file .
These are the commands I used for running VHAP.
This is the landmark output which I got from VHAP -
output.mp4
Why is the landmarks not aligning with the face initially? The face mesh appears to be in the wrong orientation in the above example. What should be possible issues causing this? Is there something wrong in my camera_params.json file which I have generated from blender?