diffusion_policy_gbc / real_world /multi_camera_visualizer.py
ducido's picture
Initial commit
987ed1b verified
Raw
History Blame Contribute Delete
2.25 kB
import time
import multiprocessing as mp
import numpy as np
import cv2
from threadpoolctl import threadpool_limits
from diffusion_policy.real_world.multi_realsense import MultiRealsense
class MultiCameraVisualizer(mp.Process):
def __init__(self,
realsense: MultiRealsense,
row, col,
window_name='Multi Cam Vis',
vis_fps=60,
fill_value=0,
rgb_to_bgr=True
):
super().__init__()
self.row = row
self.col = col
self.window_name = window_name
self.vis_fps = vis_fps
self.fill_value = fill_value
self.rgb_to_bgr=rgb_to_bgr
self.realsense = realsense
# shared variables
self.stop_event = mp.Event()
def start(self, wait=False):
super().start()
def stop(self, wait=False):
self.stop_event.set()
if wait:
self.stop_wait()
def start_wait(self):
pass
def stop_wait(self):
self.join()
def run(self):
cv2.setNumThreads(1)
threadpool_limits(1)
channel_slice = slice(None)
if self.rgb_to_bgr:
channel_slice = slice(None,None,-1)
vis_data = None
vis_img = None
while not self.stop_event.is_set():
vis_data = self.realsense.get_vis(out=vis_data)
color = vis_data['color']
N, H, W, C = color.shape
assert C == 3
oh = H * self.row
ow = W * self.col
if vis_img is None:
vis_img = np.full((oh, ow, 3),
fill_value=self.fill_value, dtype=np.uint8)
for row in range(self.row):
for col in range(self.col):
idx = col + row * self.col
h_start = H * row
h_end = h_start + H
w_start = W * col
w_end = w_start + W
if idx < N:
# opencv uses bgr
vis_img[h_start:h_end,w_start:w_end
] = color[idx,:,:,channel_slice]
cv2.imshow(self.window_name, vis_img)
cv2.pollKey()
time.sleep(1 / self.vis_fps)