Skip to content

360° & cameras

Panoramic cameras don't produce a flat, ready-to-watch image — they produce a warped one (an equirectangular strip) that has to be reprojected into a normal perspective view before it's watchable. Streamcatcher does that reprojection on the fly and lets you steer a virtual pinhole camera around the sphere.

Projections

Pick one with --projection/-p:

Projection Source geometry Coverage Use it for
flat Ordinary rectilinear video Normal 2D cameras (default)
equirect Equirectangular panorama (2:1) 360° × 180° Fully stitched 360 cameras

In equirect mode the window (or the API) shows a flat viewport you look around with W/A/S/D (aim) and +/- (zoom).

Equirectangular ≠ raw fisheye

A stitched 360 camera (e.g. an Insta360 Pro streaming over RTSP) already outputs an equirectangular panorama — the "warped" look is inherent equirect distortion, not raw per-lens fisheye, so it needs equirect and no lens calibration. Raw single-lens fisheye sources are not supported.

How the reprojection works

The reprojection is pure NumPy — it builds cv2.remap lookup tables and hands them to OpenCV, but the geometry itself uses no OpenCV, no GPU, and no live stream, which keeps it deterministic and unit-testable.

  • Equirectangular → pinhole: a virtual pinhole camera's rays are mapped onto the sphere (longitude = atan2(x, z), latitude = atan2(y, ·)), then back to pixel coordinates in the full 360° × 180° panorama.

The view supports fixed mounting offsets (roll → pitch → yaw), folded into the ray generation so a camera that isn't level still produces a level viewport. Zero offsets are a numeric identity, so a plain 360 stream is byte-for-byte unaffected.