"""
capture
Picamera2 を使用してカメラ画像を取得するモジュール
"""
import cv2
import numpy as np
from picamera2 import Picamera2
from common import config
class CameraCapture:
"""Picamera2 でフレームを取得するクラス"""
def __init__(self) -> None:
self._camera: Picamera2 | None = None
def start(self) -> None:
"""カメラを初期化して撮影を開始する"""
self._camera = Picamera2()
camera_config = self._camera.create_preview_configuration(
main={
"size": (
config.CAPTURE_WIDTH,
config.CAPTURE_HEIGHT,
),
"format": "YUV420",
},
)
self._camera.configure(camera_config)
self._camera.start()
def capture(self) -> np.ndarray:
"""1フレームを取得する
撮影後に INTER_AREA で縮小して返す
Returns:
グレースケールの画像(NumPy 配列)
"""
yuv = self._camera.capture_array()
gray = yuv[
:config.CAPTURE_HEIGHT,
:config.CAPTURE_WIDTH,
]
return cv2.resize(
gray,
(config.FRAME_WIDTH, config.FRAME_HEIGHT),
interpolation=cv2.INTER_AREA,
)
def stop(self) -> None:
"""カメラを停止する"""
if self._camera is not None:
self._camera.stop()
self._camera.close()
self._camera = None