Files
nerfstudio/docs/notebooks/visualize_cameras.ipynb
T

4.2 MiB

Visualize Camera Models

In [1]:
import torch
from pyrad.cameras import cameras
import plotly.graph_objects as go
import mediapy as media
In [2]:
def vis_camera_rays(camera):
    coords = camera.get_image_coords()
    coords[..., 0] /= camera.get_image_height()
    coords[..., 1] /= camera.get_image_width()
    coords = torch.cat([coords, torch.ones((*coords.shape[:-1], 1))], dim=-1)

    print("Image UV coordinates")
    media.show_image(coords, width=400)

    ray_bundle = camera.get_camera_ray_bundle()

    print("Pixel Area")
    media.show_image(ray_bundle.pixel_area, width=400, cmap="hot")

    origins = ray_bundle.origins.view(-1, 3)
    directions = ray_bundle.directions.view(-1, 3)
    coords = coords.view(-1, 3)

    lines = torch.empty((origins.shape[0] * 2, 3))
    lines[0::2] = origins
    lines[1::2] = origins + directions

    colors = torch.empty((coords.shape[0] * 2, 3))
    colors[0::2] = coords
    colors[1::2] = coords

    fig = go.Figure(
        data=go.Scatter3d(
            x=lines[:, 0],
            y=lines[:, 1],
            z=lines[:, 2],
            marker=dict(
                size=4,
                color=colors,
            ),
            line=dict(color="lightblue", width=1),
        )
    )

    fig.show()

Pinhole Camera Model

In [3]:
cx = 20
cy = 10
fx = 20
fy = 20

camera = cameras.PinholeCamera(cx, cy, fx, fy)
vis_camera_rays(camera)
Image UV coordinates
Pixel Area

Equirectangular Camera Models

In [4]:
height = 10
width = 30

camera = cameras.EquirectangularCamera(height=height, width=width)
vis_camera_rays(camera)
Image UV coordinates
Pixel Area
In [ ]: