A lightweight Python library for visualizing camera poses, fields of view, coordinate axes, and geometric primitives in 3D using Matplotlib.
pip install git+https://github.com/cheind/plotgeom.git
This script renders the teaser image above.
import numpy as np
import matplotlib.pyplot as plt
# Main import
import plotgeom as pg
np.random.seed(112)
# Create figure
fig = plt.figure(figsize=(10, 10))
# Helper to create 3d axis
ax = pg.make_ax(fig=fig, proj="persp")
# Plot world axes
pg.plot_axes(
ax=ax,
rt=np.eye(4),
scale=0.05,
name="world",
)
# Plot a plane with limits
pg.plot_plane(
ax=ax,
rt=pg.random_pose(),
extent_xy=(0.2, 0.1),
name="pi",
draw_normal=True,
normal_scale=0.05,
)
# Plot a ray
pg.plot_ray(
ax=ax,
origin=[0, 0, 0],
dir=[0.1, 0.1, 0],
linestyle="--",
linewidth=1.0,
name="ray",
)
# Helper function to produce camera params
def random_camera_params():
pose = pg.random_pose()
K = np.array([[800, 0, 320], [0, 800, 240], [0, 0, 1]])
shape = (480, 640)
hfov, vfov = pg.fov_from_K(K, shape)
image = pg.generate_chessboard_image((8, 6), square_size=80)
image[:80, :80] = (0, 1, 1)
return pose, (hfov, vfov), image
# Plot camera field of view
pose, (hfov, vfov), image = random_camera_params()
pg.plot_camera_fov(
ax=ax,
rt=pose,
hfov=hfov,
vfov=vfov,
scale=0.1,
)
# Add an image to far plane
pg.plot_camera_image(
ax=ax,
rt=pose,
hfov=hfov,
vfov=vfov,
image=image,
scale=0.1,
tex_res=(32, 32),
)
# Mark camera origin
pg.plot_axes(ax, pose, scale=0.05, name="a camera")
# Final preps
pg.set_axes_equal(ax)
pg.style_ax(ax)
# Show
plt.show()