import os import json import argparse import cv2 import numpy as np import matplotlib.pyplot as plt from shapely.geometry import Polygon from descartes.patch import PolygonPatch from misc.panorama import draw_boundary_from_cor_id from misc.colors import colormap_255 def visualize_panorama(args): """visualize panorama layout """ scene_path = os.path.join(args.path, f"scene_{args.scene:05d}", "2D_rendering") for room_id in np.sort(os.listdir(scene_path)): room_path = os.path.join(scene_path, room_id, "panorama") cor_id = np.loadtxt(os.path.join(room_path, "layout.txt")) img_src = cv2.imread(os.path.join(room_path, "full", "rgb_rawlight.png")) img_src = cv2.cvtColor(img_src, cv2.COLOR_BGR2RGB) img_viz = draw_boundary_from_cor_id(cor_id, img_src) plt.axis('off') plt.imshow(img_viz) plt.show() def visualize_perspective(args): """visualize perspective layout """ colors = np.array(colormap_255) / 255 scene_path = os.path.join(args.path, f"scene_{args.scene:05d}", "2D_rendering") for room_id in np.sort(os.listdir(scene_path)): room_path = os.path.join(scene_path, room_id, "perspective", "full") if not os.path.exists(room_path): continue for position_id in np.sort(os.listdir(room_path)): position_path = os.path.join(room_path, position_id) image = cv2.imread(os.path.join(position_path, "rgb_rawlight.png")) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) with open(os.path.join(position_path, "layout.json")) as f: annos = json.load(f) fig = plt.figure() for i, key in enumerate(['amodal_mask', 'visible_mask']): ax = fig.add_subplot(2, 1, i + 1) plt.axis('off') plt.imshow(image) for i, planes in enumerate(annos['planes']): if len(planes[key]): for plane in planes[key]: polygon = Polygon([annos['junctions'][id]['coordinate'] for id in plane]) patch = PolygonPatch(polygon, facecolor=colors[i], alpha=0.5) ax.add_patch(patch) plt.title(key) plt.show() def parse_args(): parser = argparse.ArgumentParser(description="Structured3D 2D Layout Visualization") parser.add_argument("--path", required=True, help="dataset path", metavar="DIR") parser.add_argument("--scene", required=True, help="scene id", type=int) parser.add_argument("--type", choices=["perspective", "panorama"], required=True, help="type of camera", type=str) return parser.parse_args() def main(): args = parse_args() if args.type == 'panorama': visualize_panorama(args) elif args.type == 'perspective': visualize_perspective(args) if __name__ == "__main__": main()