Source code for gbvision.utils.cameras.usb_camera

from typing import Union

from .camera import CameraData, Camera
from gbvision.models.cameras import UNKNOWN_CAMERA
import cv2
import platform
import sys
import subprocess


[docs]class USBCamera(cv2.VideoCapture, Camera): """ A basic usb connected camera which inherits from cv2 VideoCapture Can also be used to represent a video file instead of a camera :param port: The usb port to which the camera is connected (or path to the video file) :param data: The camera data object that describes this camera """ def __init__(self, port: Union[int, str], data: CameraData = UNKNOWN_CAMERA): """ initializes the camera """ cv2.VideoCapture.__init__(self, port) self._data = data.copy() self.port = port
[docs] def is_opened(self) -> bool: return self.isOpened()
@staticmethod def __is_on_linux() -> bool: return platform.system() == 'Linux' def __v4l2_ctl_command(self, cmd: str, value: Union[str, int, float]) -> int: try: return subprocess.call(['v4l2-ctl', '-d', f'/dev/video{self.port}', '-c', f'{cmd}={value}']) except FileNotFoundError: print( "[WARN] setting some parameters such as exposure may not on a Linux machine work if you do not have " "v4l2 installed, if the command you tried to run does not work please install v4l2 using 'sudo apt " "install v4l-utils'", file=sys.stderr) return -1
[docs] def set_exposure(self, exposure) -> bool: if self.__is_on_linux(): if type(exposure) is bool: _exposure = int(exposure) + 10 else: _exposure = exposure code = self.__v4l2_ctl_command('exposure_absolute', _exposure) if code == 0: return True if type(exposure) is bool: return self.set(cv2.CAP_PROP_EXPOSURE, int(exposure)) return self.set(cv2.CAP_PROP_EXPOSURE, exposure)
[docs] def set_auto_exposure(self, auto) -> bool: if self.__is_on_linux(): if type(auto) is bool: _auto = 3 if auto else 1 else: _auto = auto code = self.__v4l2_ctl_command('exposure_auto', _auto) if code == 0: return True if type(auto) is bool: return self.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0.75 if auto else 0.25) return self.set(cv2.CAP_PROP_AUTO_EXPOSURE, auto)
[docs] def get_data(self): return self._data
[docs] def get_width(self): return self.get(cv2.CAP_PROP_FRAME_WIDTH)
[docs] def get_height(self): return self.get(cv2.CAP_PROP_FRAME_HEIGHT)
def _set_width(self, width): return self.set(cv2.CAP_PROP_FRAME_WIDTH, width) def _set_height(self, height): return self.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
[docs] def get_fps(self): return self.get(cv2.CAP_PROP_FPS)
[docs] def set_fps(self, fps): return self.set(cv2.CAP_PROP_FPS, fps)