Skip to main content

A Python package for camera utilities

Project description

omnicam

A small, unified API for reading frames from USB cameras, IP streams, video files, screen capture, and Raspberry Pi cameras.

Features

  • Unified BaseCamera interface across backends
  • OpenCV-based capture for USB webcams, video files, RTSP/HTTP streams, and GStreamer pipelines
  • Optional Raspberry Pi Camera support (Picamera2)
  • Optional screen capture via mss

Installation

pip install omnicam

Optional extras:

pip install omnicam[opencv]
pip install omnicam[screen]
pip install omnicam[pi]

Quickstart

from omnicam import SimpleCamera

with SimpleCamera(index=0) as cam:
    frame = cam.read()
    if frame is not None:
        print(frame.shape)

Camera types

from omnicam import FileCapture, InternetCapture, ScreenCapture

# Video file
cam = FileCapture("/path/to/video.mp4")

# IP camera or MJPEG stream
cam = InternetCapture("http://192.168.1.10:8080/video")

# Screen capture (requires omnicam[screen])
cam = ScreenCapture(index=1)

Raspberry Pi camera

from omnicam import PiCamera

cam = PiCamera(info="IMX219", resolution="720p")

GStreamer and Gazebo

from omnicam import GStreamerCapture, GazeboCamera

pipeline = (
    GStreamerCapture.GstPipeline()
    .add("v4l2src", device="/dev/video0")
    .add("videoconvert")
    .add("appsink")
)
cam = GStreamerCapture(pipeline)

# Gazebo (requires gz tools available on PATH)
cam = GazeboCamera(topic_name="my_camera")

BaseCamera geometry helper

All cameras implement project_pixel_to_ground for projecting a pixel to ground coordinates.

Usage example:

from omnicam import SimpleCamera

with SimpleCamera(index=0) as cam:
    north_m, east_m = cam.project_pixel_to_ground(
        px=640,
        py=360,
        alt_m=120.0,
        roll=0.0,
        pitch=0.0,
        yaw=0.0,
    )
    print(north_m, east_m)

Notes:

  • roll, pitch, yaw, and alt_m are for the body frame the camera is attached to.
  • The camera's offset and offset rotation are applied when projecting:
    • offset: [x_right, y_down, z_forward] in meters (optical frame)
    • offset_roll, offset_pitch, offset_yaw: radians

Parameters:

  • px, py: Pixel coordinates in the image.
  • alt_m: Camera altitude in meters.
  • roll, pitch, yaw: Camera attitude in radians.

Returns:

  • (north_m, east_m): Ground offset in meters relative to the camera.

CameraInfo (advanced)

CameraInfo describes physical camera parameters and enables focal-length math and focus validation. It is optional but useful when you need real-world camera intrinsics.

Fields:

  • name: Full model name.
  • short_names: Short identifiers (sensor/model code).
  • focal_length_mm: (fx_mm, fy_mm) in millimeters.
  • pixel_size_um: Pixel size in micrometers.
  • max_resolution: (width, height) at sensor maximum.
  • aperture_f: F-number (e.g., 2.0).
  • hfov_deg: Horizontal field of view in degrees.
  • focus_type: "Fixed" | "Autofocus" | "Manual" | "Unknown".
  • has_ir_filter: True if the camera has an IR filter.

Usage example:

from omnicam import SimpleCamera
from omnicam.base_camera import CameraInfo

info = CameraInfo(
    name="My Camera Model",
    short_name="MYCAM",
    focal_length_px=(4.0, 4.0),
    pixel_size_um=1.4,
    max_resolution=(1920, 1080),
    aperture_f=2.0,
    hfov_deg=70.0,
    focus_type="Manual",
    has_ir_filter=True,
)

with SimpleCamera(index=0, info=info) as cam:
    fx, fy = cam.focal_length  # focal length in pixels at current size

If you only know focal length in pixel units, use:

from omnicam.base_camera import CameraInfo

info = CameraInfo(
    name="Synthetic",
    short_name="SYN",
    aperture_f=1.0,
    focal_length_px=(800.0, 800.0),
    max_resolution=(1280, 720),
    update_rate=60.0
)

Default Raspberry Pi cameras (short name → full name):

  • OV5647, 1Camera Module 1
  • OV5647 NoIR, 1NCamera Module 1 NoIR
  • IMX219, 2Camera Module 2
  • IMX219 NoIR, 2NCamera Module 2 NoIR
  • IMX708 Standard, 3Camera Module 3 - Standard
  • IMX708 NoIR, 3NCamera Module 3 - Standard NoIR
  • IMX708 Wide, 3WCamera Module 3 - Wide
  • IMX708 Wide NoIR, 3WNCamera Module 3 - Wide NoIR
  • IMX477 6mm, HQ6High Quality Camera w/ 6mm Lens
  • IMX477 16mm, HQ16High Quality Camera w/ 16mm Lens
  • IMX477 35mm, HQ35High Quality Camera w/ 35mm Lens
  • IMX477 M12-8mm, HQ8High Quality Camera w/ 8mm M12 Lens
  • IMX477 M12-25mm, HQ25High Quality Camera w/ 25mm M12 Lens
  • IMX477 M12-Fish, HQ2.7High Quality Camera w/ 2.7mm M12 Fisheye
  • IMX296 6mm, HQ6Global Shutter Camera w/ 6mm Lens
  • IMX296 16mm, HQ16Global Shutter Camera w/ 16mm Lens
  • IMX500, PiAIRaspberry Pi AI Camera

Notes

  • numpy is required. OpenCV-based backends need omnicam[opencv].
  • GStreamer and Gazebo features rely on system-level tooling.

License

MIT. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

omnicam-0.3.4.tar.gz (14.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

omnicam-0.3.4-py3-none-any.whl (15.1 kB view details)

Uploaded Python 3

File details

Details for the file omnicam-0.3.4.tar.gz.

File metadata

  • Download URL: omnicam-0.3.4.tar.gz
  • Upload date:
  • Size: 14.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for omnicam-0.3.4.tar.gz
Algorithm Hash digest
SHA256 07e46278d15dda71c5d1c7de8d7ae152c9f73439ebdcf3ba9e9d96d334a90a21
MD5 c2a333511cdfbb08b9503e35ce22d9f2
BLAKE2b-256 0fcc9f983c74535aa08990e5599d820427e60c28b44f7634fde574b48eb572de

See more details on using hashes here.

File details

Details for the file omnicam-0.3.4-py3-none-any.whl.

File metadata

  • Download URL: omnicam-0.3.4-py3-none-any.whl
  • Upload date:
  • Size: 15.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for omnicam-0.3.4-py3-none-any.whl
Algorithm Hash digest
SHA256 34e0060787976054bf1e8c5764dd3285f56f3b11940f3c08e5e18942d0a8a6db
MD5 de0971abb1262c226e59f66d99f8b4a7
BLAKE2b-256 922f58b0a8db6c3ad67a6072a1cb5bd44f58c3122a3f273df0a3e7a257e3e833

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page