Skip to main content

A Python library for object distance calculations in images using pinhole projection.

Project description

pinhole-distance

A Python library for pinhole distance calculations.

Installation

pip install pinhole-distance

Usage

# Calculate the distance to an object known to be 21" wide that is 70px wide in the image
# Assumes you're using the USB pinhole camera defined in usb_pinhole.py
from pinhole_distance import usb_pinhole

distance = usb_pinhole.distance_to_object(
    dimension='x',
    actual_dimension=0.5334,
    observed_dimension_px=70
)
print(f"Distance to object: {distance:.4f} meters")

API Reference

class Lens

Represents a camera lens.

Attributes:

  • focal_length (float): Focal length of the lens in millimeters.
  • pixel_width_um (float): Width of a single pixel in micrometers (μm).
  • distortion_table (Optional[dict[float, float]]): Optional mapping of observed radius (pixels or mm) to distortion correction factor (for fisheye lenses).

Example:

lens = Lens(focal_length=4.0, pixel_width_um=1.4, distortion_table={0.0: 1.0, 100.0: 0.98})

class Sensor

Represents a camera sensor.

Attributes:

  • pixel_height_um (float): Height of a single pixel in micrometers (μm).
  • resolution (tuple[int, int]): Sensor resolution as (width_px, height_px).

Example:

sensor = Sensor(pixel_height_um=1.4, resolution=(1920, 1080))

class Package

Combines a Lens and a Sensor for distance and dimension calculations.

Attributes:

  • lens (Lens): The lens used.
  • sensor (Sensor): The sensor used.

Methods:

  • distance_to_object(actual_dimension: float, observed_dimension_px: float) -> float
    Returns the distance (in meters) to an object given its actual dimension (height or width, in meters) and observed dimension in the image.
  • object_dimension_at_distance(distance: float, observed_dimension_px: float) -> float
    Returns the actual dimension (in meters) of an object at a given distance (in meters), given its observed dimension in the image.

Example:

pkg = Package(lens, sensor)
dist = pkg.distance_to_object(actual_dimension=0.2, observed_dimension_px=150)
dimension = pkg.object_dimension_at_distance(distance=1.0, observed_dimension_px=150)

Example: Using the OV5647 Package

from pinhole_distance import ov5647

distance = ov5647.distance_to_object(
    dimension='y',
    actual_dimension=0.1e-3,  # 0.1 mm in meters
    observed_dimension_px=160
)
print(f"Distance to object: {distance:.4f} meters")

Output: Distance to object: 0.0011 meters, or 1.1mm.

Example: USB Pinhole with manually checked distances

The following example computes the distance to a person with:

  • Known width of 21" (0.5334m)
  • Observed width of 70 pixels, using YOLO bounding box

I know from measuring that the person was 5m away.

from pinhole_distance import usb_pinhole

distance = usb_pinhole.distance_to_object(
    dimension='x',
    actual_dimension=0.5334,
    observed_dimension_px=70
)
print(f"Distance to object: {distance:.4f} meters")

The output is a distance of 4.8986 meters, or roughly a 2% error.

Publishing

  • Build: python -m build
  • Publish: twine upload dist/*

License

MIT

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

pinhole_distance-0.1.1.tar.gz (4.8 kB view details)

Uploaded Source

Built Distribution

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

pinhole_distance-0.1.1-py3-none-any.whl (6.9 kB view details)

Uploaded Python 3

File details

Details for the file pinhole_distance-0.1.1.tar.gz.

File metadata

  • Download URL: pinhole_distance-0.1.1.tar.gz
  • Upload date:
  • Size: 4.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for pinhole_distance-0.1.1.tar.gz
Algorithm Hash digest
SHA256 dfc81c40d88033e9dc0c66529256118cc22c9e172f0914da708d28a60fc6ff89
MD5 65112381668c8102e5099128d07de93b
BLAKE2b-256 f6fc7933b888f80b75d9df1992fa0e25ffb923dd4901db45c18836940a7391af

See more details on using hashes here.

File details

Details for the file pinhole_distance-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for pinhole_distance-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a81ae1ec6d98dd23827950bbef9ece1f3d12a7c78945247595c0f15a388d3a0a
MD5 f1bee95f54682eae693771f7ce37d543
BLAKE2b-256 29ef5ffea49db394bdc3df97a924fedd6b1b5d06e0a1ee820c23165ea0323a4c

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