from __future__ import annotations
from pathlib import Path
import picamera
import picamera.array
from numpy.typing import NDArray
from zoloto.marker_type import MarkerType
from .base import BaseCamera
from .mixins import IterableCameraMixin, ViewableCameraMixin
[docs]class PiCamera(IterableCameraMixin, BaseCamera, ViewableCameraMixin):
[docs] def __init__(
self,
*,
marker_size: int | None = None,
marker_type: MarkerType,
calibration_file: Path | None = None,
) -> None:
super().__init__(
marker_size=marker_size,
marker_type=marker_type,
calibration_file=calibration_file,
)
self.camera = picamera.PiCamera()
[docs] def capture_frame(self) -> NDArray:
with picamera.array.PiRGBArray(self.camera) as raw_capture:
self.camera.capture(raw_capture, format="bgr")
return raw_capture.array
[docs] def close(self) -> None:
super().close()
self.camera.close()
[docs]class PiSnapshotCamera(BaseCamera):
"""
A modified version of PiCamera optimised for single use.
- Doesn't keep the camera open between captures
"""
[docs] def capture_frame(self) -> NDArray:
with picamera.PiCamera() as camera:
with picamera.array.PiRGBArray(camera) as raw_capture:
camera.capture(raw_capture, format="bgr")
return raw_capture.array
[docs] def close(self) -> None:
super().close()