Source code for go2.modules.video.sources.opencv_source
import time
import cv2
import threading
import numpy as np
from typing import Optional
from typing_extensions import override
from ..frame_result import FrameResult
from .camera_source import CameraSource
[docs]
class OpenCVCameraSource(CameraSource):
def __init__(self, camera_index: int = 0) -> None:
self._capture = None
self._camera_index = camera_index
self._thread = None
self._stop_event = threading.Event()
self._latest_rgb: Optional[np.ndarray] = None
self._initialize_source()
def _initialize_source(self) -> None:
self._capture = cv2.VideoCapture(self._camera_index)
if not self._capture.isOpened():
raise RuntimeError(f"[OpenCVCamera] Failed to open camera at index {self._camera_index}")
@override
def _start(self) -> None:
self._thread = threading.Thread(target=self._capture_thread, daemon=True)
self._thread.start()
def _capture_thread(self):
while not self._stop_event.is_set():
ret, frame = self._capture.read()
if not ret:
continue
self._latest_rgb = frame
self._capture.release()
@override
def _get_frames(self) -> FrameResult:
ret, self._latest_rgb = self._latest_rgb, None
if ret is None:
return FrameResult.pending()
return FrameResult.color_only(ret)
@override
def _shutdown(self) -> None:
self._stop_event.set()
if self._thread:
self._thread.join()
self._thread = None
self._latest_rgb = None