修改摄像头排布,新增显示窗口合并为一个的函数进行窗口排布。
Some checks failed
Secret Leaks / trufflehog (push) Has been cancelled

This commit is contained in:
2025-05-07 21:47:11 +08:00
parent ac85a0d17e
commit 2bcbddbfb6

View File

@@ -260,10 +260,11 @@ def control_loop(
dataset.add_frame(frame)
if display_cameras and not is_headless():
image_keys = [key for key in observation if "image" in key]
for key in image_keys:
cv2.imshow(key, cv2.cvtColor(observation[key].numpy(), cv2.COLOR_RGB2BGR))
cv2.waitKey(1)
# image_keys = [key for key in observation if "image" in key]
# for key in image_keys:
# cv2.imshow(key, cv2.cvtColor(observation[key].numpy(), cv2.COLOR_RGB2BGR))
# cv2.waitKey(1)
display_observations_combined(observation)
if fps is not None:
dt_s = time.perf_counter() - start_loop_t
@@ -277,6 +278,107 @@ def control_loop(
events["exit_early"] = False
break
import numpy as np
def display_observations_combined(observation, display_cameras=True):
"""将摄像头画面组合在一个窗口中显示,优化以防止抖动"""
if display_cameras and not is_headless():
image_keys = [key for key in observation if "image" in key]
if not image_keys:
return
# 获取所有图像并转换为BGR格式
images = []
for key in image_keys:
img = observation[key].numpy()
# 确保每个图像尺寸为640×480
if img.shape[0] != 480 or img.shape[1] != 640:
img = cv2.resize(img, (640, 480))
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
# 添加图像标题
cv2.putText(img, key, (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
images.append(img)
# 根据实际摄像头数量确定布局
num_cameras = len(images)
# 为固定数量的摄像头定义固定布局
margin = 10 # 图像之间的间距
if num_cameras == 1:
# 单个摄像头 - 直接显示
grid_image = images[0]
elif num_cameras == 2:
# 两个摄像头 - 水平排列
grid_width = 2 * 640 + margin
grid_height = 480
grid_image = np.zeros((grid_height, grid_width, 3), dtype=np.uint8)
# 放置两个图像
grid_image[0:480, 0:640] = images[0]
grid_image[0:480, 640+margin:] = images[1]
elif num_cameras == 3:
# 三个摄像头 - 上面一行2个下面一个
grid_width = 2 * 640 + margin
grid_height = 2 * 480 + margin
grid_image = np.zeros((grid_height, grid_width, 3), dtype=np.uint8)
# 放置三个图像
grid_image[0:480, 0:640] = images[0]
grid_image[0:480, 640+margin:] = images[1]
grid_image[480+margin:, (grid_width-640)//2:(grid_width+640)//2] = images[2] # 居中放置
else:
# 四个或更多摄像头 - 2×2网格
grid_cols = 2
grid_rows = 2
grid_width = grid_cols * 640 + (grid_cols - 1) * margin
grid_height = grid_rows * 480 + (grid_rows - 1) * margin
grid_image = np.zeros((grid_height, grid_width, 3), dtype=np.uint8)
# 最多显示4个
for i, img in enumerate(images[:4]):
row = i // grid_cols
col = i % grid_cols
y_start = row * (480 + margin)
y_end = y_start + 480
x_start = col * (640 + margin)
x_end = x_start + 640
grid_image[y_start:y_end, x_start:x_end] = img
# 创建一个固定名称的窗口
window_name = "Camera Views"
# 使用 getWindowProperty 检查窗口是否已经存在
try:
# 尝试获取窗口属性 - 如果窗口不存在会抛出异常
window_exists = cv2.getWindowProperty(window_name, cv2.WND_PROP_VISIBLE) >= 0
except:
window_exists = False
# 如果窗口不存在,创建并定位它
if not window_exists:
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
# 设置窗口位置和大小(只需要在创建时设置一次)
screen_width = 1920 # 您的屏幕宽度
screen_height = 1080 # 您的屏幕高度
# 根据实际图像计算合适的显示尺寸
scale_factor = min(screen_width / grid_width, screen_height / grid_height) * 0.95
display_width = int(grid_width * scale_factor)
display_height = int(grid_height * scale_factor)
cv2.resizeWindow(window_name, display_width, display_height)
cv2.moveWindow(window_name, (screen_width - display_width) // 2,
(screen_height - display_height) // 2) # 居中显示
# 显示图像
cv2.imshow(window_name, grid_image)
cv2.waitKey(1)
def reset_environment(robot, events, reset_time_s, fps):
# TODO(rcadene): refactor warmup_record and reset_environment