Stable-X's picture
fix: Refactor visualization
803e3ed
import os
import cv2
import imageio
import numpy as np
import open3d as o3d
import os.path as osp
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import open3d as o3d
import os
import numpy as np
import imageio
import os.path as osp
def render_frames(o3d_geometry, camera_all, output_dir, save_video=True, save_camera=True):
vis = o3d.visualization.Visualizer()
w, h = camera_all[0].intrinsic.width, camera_all[0].intrinsic.height
vis.create_window(width=w, height=h)
render_frame_path = os.path.join(output_dir, 'render_frames')
render_camera_path = os.path.join(output_dir, 'render_cameras')
os.makedirs(render_frame_path, exist_ok=True)
os.makedirs(render_camera_path, exist_ok=True)
video_path = os.path.join(output_dir, 'render_frame.mp4')
if save_video:
writer = imageio.get_writer(video_path, fps=10)
vis.add_geometry(o3d_geometry)
for i, camera_params in enumerate(camera_all):
if camera_params is None:
continue
ctr = vis.get_view_control()
ctr.convert_from_pinhole_camera_parameters(camera_params, True)
if save_camera:
o3d.io.write_pinhole_camera_parameters(os.path.join(render_camera_path, f'camera_{i:03d}.json'),
camera_params)
opt = vis.get_render_option()
opt.point_size = 1
opt.background_color = np.array([0, 0, 0])
vis.poll_events()
vis.update_renderer()
image = vis.capture_screen_float_buffer(do_render=True)
image_uint8 = (np.asarray(image) * 255).astype(np.uint8)
frame_filename = f'frame_{i:03d}.png'
imageio.imwrite(osp.join(render_frame_path, frame_filename), image_uint8)
if save_video:
writer.append_data(image_uint8)
if save_video:
writer.close()
vis.destroy_window()
return video_path
def find_render_cam(pcd):
last_camera_params = None
def print_camera_pose(vis):
nonlocal last_camera_params
ctr = vis.get_view_control()
camera_params = ctr.convert_to_pinhole_camera_parameters()
last_camera_params = camera_params
print("Intrinsic matrix:")
print(camera_params.intrinsic.intrinsic_matrix)
print("\nExtrinsic matrix:")
print(camera_params.extrinsic)
return False
vis = o3d.visualization.VisualizerWithKeyCallback()
vis.create_window(width=1920, height=1080)
vis.add_geometry(pcd)
opt = vis.get_render_option()
opt.point_size = 1
opt.background_color = np.array([0, 0, 0])
vis.register_key_callback(32, print_camera_pose)
while vis.poll_events():
vis.update_renderer()
vis.destroy_window()
return last_camera_params
def vis_pred_and_imgs(pts_all, save_path, images_all=None, conf_all=None, save_video=True):
# Normalization
min_val = pts_all.min(axis=(0, 1, 2), keepdims=True)
max_val = pts_all.max(axis=(0, 1, 2), keepdims=True)
pts_all = (pts_all - min_val) / (max_val - min_val)
pts_save_path = osp.join(save_path, 'pts')
os.makedirs(pts_save_path, exist_ok=True)
if images_all is not None:
images_save_path = osp.join(save_path, 'imgs')
os.makedirs(images_save_path, exist_ok=True)
if conf_all is not None:
conf_save_path = osp.join(save_path, 'confs')
os.makedirs(conf_save_path, exist_ok=True)
if save_video:
pts_video_path = osp.join(save_path, 'pts.mp4')
pts_writer = imageio.get_writer(pts_video_path, fps=10)
if images_all is not None:
imgs_video_path = osp.join(save_path, 'imgs.mp4')
imgs_writer = imageio.get_writer(imgs_video_path, fps=10)
if conf_all is not None:
conf_video_path = osp.join(save_path, 'confs.mp4')
conf_writer = imageio.get_writer(conf_video_path, fps=10)
for frame_id in range(pts_all.shape[0]):
pt_vis = pts_all[frame_id].astype(np.float32)
pt_vis_rgb = mcolors.hsv_to_rgb(1-pt_vis)
pt_vis_rgb_uint8 = (pt_vis_rgb * 255).astype(np.uint8)
plt.imsave(osp.join(pts_save_path, f'pts_{frame_id:04d}.png'), pt_vis_rgb_uint8)
if save_video:
pts_writer.append_data(pt_vis_rgb_uint8)
if images_all is not None:
image = images_all[frame_id]
image_uint8 = (image * 255).astype(np.uint8)
imageio.imwrite(osp.join(images_save_path, f'img_{frame_id:04d}.png'), image_uint8)
if save_video:
imgs_writer.append_data(image_uint8)
if conf_all is not None:
conf_image = plt.cm.jet(conf_all[frame_id])
conf_image_uint8 = (conf_image * 255).astype(np.uint8)
plt.imsave(osp.join(conf_save_path, f'conf_{frame_id:04d}.png'), conf_image_uint8)
if save_video:
conf_writer.append_data(conf_image_uint8)
if save_video:
pts_writer.close()
if images_all is not None:
imgs_writer.close()
if conf_all is not None:
conf_writer.close()