Source code for vsi.vxl.plot_scene

from boxm2_scene_adaptor import boxm2_scene_adaptor
import boxm2_adaptor
from glob import glob
import numpy as np
import matplotlib.pyplot as plt
import os
import argparse

from vsi.io.krt import Krt
from vsi.tools.natural_sort import natural_sorted

from itertools import combinations
from mpl_toolkits.mplot3d.axes3d import Axes3D

[docs]class PlotScene(object): def __init__(self): self.figure = plt.figure() self.figure.clf() self.axes = self.figure.add_subplot(1, 1, 1, projection='3d')
[docs] def set_limits(self, xmin, xmax, ymin, ymax, zmin, zmax): self.axes.set_xlim(xmin, xmax) self.axes.set_ylim(ymin, ymax) self.axes.set_zlim(zmin, zmax)
[docs] def clear_plot(self): self.axes.clf()
[docs] def draw_scene_box(self, scene): bbox = {k:v for (k,v) in zip(['x_min','y_min','z_min', 'x_max','y_max','z_max'], [x for y in scene.bbox for x in y])} self.draw_cube(**bbox)
[docs] def draw_cameras(self, cameras, z_min=None, color='k'): camera_centers = np.array(map(lambda x:x.camera_center(), cameras)) self.axes.hold('on') self.axes.plot(camera_centers[:,0], camera_centers[:,1], camera_centers[:,2], 'or') for camera in cameras: if z_min is not None: l = (z_min - camera.camera_center()[2])/camera.direction()[2] else: l = 100 line = np.array([camera.camera_center(), camera.camera_center() + camera.direction()*l]) self.axes.plot(line[:,0], line[:,1], line[:,2], color) self.axes.hold('off')
[docs] def draw_cube(self, x_min, x_max, y_min, y_max, z_min, z_max): self.axes.hold('on') x_span = [x_min, x_max] x_min = [x_min, x_min] x_max = [x_max, x_max] y_span = [y_min, y_max] y_min = [y_min, y_min] y_max = [y_max, y_max] z_span = [z_min, z_max] z_min = [z_min, z_min] z_max = [z_max, z_max] plot = self.axes.plot plot(x_min, y_min, z_span, 'b') plot(x_min, y_max, z_span, 'b') plot(x_max, y_min, z_span, 'b') plot(x_max, y_max, z_span, 'b') plot(x_min, y_span, z_min, 'b') plot(x_min, y_span, z_max, 'b') plot(x_max, y_span, z_min, 'b') plot(x_max, y_span, z_max, 'b') plot(x_span, y_min, z_min, 'b') plot(x_span, y_min, z_max, 'b') plot(x_span, y_max, z_min, 'b') plot(x_span, y_max, z_max, 'b') self.axes.hold('off')
[docs] def show(self): plt.show()
[docs]def parse_args(): parser = argparse.ArgumentParser() aa = parser.add_argument aa('--scene', '-s', default=None, help="Scene file filename") aa('--cameras', '-c', default=None, nargs='+', help='List of cameras to be plotted, can be camera filenames ' 'or glob expressions') aa('--diff', '-d', default=None, nargs='+', help='List of cameras to be compared, can be camera filenames ' 'or glob expressions') aa('--limits', '-l', default=None, nargs=6, help='Set axis manually, ' 'takes 6 arguments: xmin xmax ymin ymax zmin zmax') args = parser.parse_args() return args
[docs]def main(): import matplotlib args = parse_args() plot_scene = PlotScene() if args.limits: xyz = [float(i) for i in args.limits] plot_scene.set_limits(xyz[0], xyz[1],\ xyz[2], xyz[3],\ xyz[4], xyz[5]) z_min = None if args.scene: scene = boxm2_scene_adaptor(args.scene, 'cpp') plot_scene.draw_scene_box(scene) z_min = scene.bbox[0][2] if (args.limits and not z_min): z_min= xyz[4] if args.cameras: cameras = [] camera_files = [x for y in map(lambda x: glob(x), args.cameras) for x in y] camera_files = natural_sorted(camera_files) for camera_file in camera_files: krt = Krt.load(camera_file) cameras.append(krt) plot_scene.draw_cameras(cameras, z_min) if args.cameras and args.diff: cameras = [] camera_files = [x for y in map(lambda x: glob(x), args.diff) for x in y] camera_files = natural_sorted(camera_files) for camera_file in camera_files: krt = Krt.load(camera_file) cameras.append(krt) plot_scene.draw_cameras(cameras, z_min, 'g') plt.show()
if __name__=='__main__': # import vsi.tools.vdb as vdb; vdb.dbstop_if_error() main()