integration of camera handler into settings manager

This commit is contained in:
ori
2019-05-02 12:42:44 -07:00
parent ce94cea27b
commit 0907c31aad
5 changed files with 92 additions and 38 deletions

View File

@@ -1,15 +1,15 @@
import os
import json
import cv2
import cscore
from cscore._cscore import VideoMode
from .Singleton import Singleton
from ..handlers.CamerasHandler import CamerasHandler
from .Exceptions import PipelineAlreadyExistsException, NoCameraConnectedException
class SettingsManager(metaclass=Singleton):
cams = {}
cams_info = {}
general_settings = {}
default_pipeline = {
@@ -37,10 +37,13 @@ class SettingsManager(metaclass=Singleton):
}
def __init__(self):
pass
self.settings_path = os.path.join(os.getcwd(), "settings")
self.cams_path = os.path.join(self.settings_path, "cams")
self._init_general_settings()
self._init_cameras()
self._init_camera()
if self.general_settings["curr_camera"] not in self.cams and len(self.cams) > 0:
cam_name = list(self.cams.keys())[0]
@@ -55,7 +58,7 @@ class SettingsManager(metaclass=Singleton):
self.general_settings = self.default_general_settings.copy()
def _init_cameras(self):
cameras = CamerasHandler.get_cameras_info()
cameras = self._get_cameras_info()
for cam in cameras:
if os.path.exists(os.path.join(self.cams_path, cam.name + '.json')):
@@ -71,7 +74,7 @@ class SettingsManager(metaclass=Singleton):
if "path" not in self.cams[cam.name]:
self.cams[cam.name]["path"] = cam.otherPaths[0] if len(cam.otherPaths) == 1 else cam.otherPaths[1]
if "video_mode" not in self.cams[cam.name]:
video_mode: VideoMode = CamerasHandler.get_usb_camera_by_name(cam.name).enumerateVideoModes()[0]
video_mode: VideoMode = self.cams(cam.name).enumerateVideoModes()[0]
self.cams[cam.name]["video_mode"] = {
"fps": video_mode.fps,
"width": video_mode.width,
@@ -79,6 +82,59 @@ class SettingsManager(metaclass=Singleton):
"pixel_format": str(video_mode.pixelFormat).split('.')[1]
}
def _get_cameras_info(self):
arr = []
usb_devices = cscore.UsbCamera.enumerateUsbCameras()
for index in range(len(usb_devices)):
cap = cv2.VideoCapture(index)
if cap.isOpened():
arr.append(index)
cap.release()
index += 1
return [usb_devices[i] for i in arr]
def _get_or_start_cameras(self):
for device in self.cams_info:
device_name = device.name
if device.name in self.cams_info:
suffix = 0
device_name = device.name + str(suffix)
while device_name in self.cams:
suffix +=1
device_name = "pipeline" + str(suffix)
camera = cscore.UsbCamera(name=device_name, dev=device.dev)
camera.setPixelFormat(pixelFormat=
getattr(VideoMode.PixelFormat,
self.get_curr_cam()["video_mode"]["pixel_format"]))
camera.setFPS(self.get_curr_cam()["video_mode"]["fps"])
camera.setResolution(width=self.get_curr_cam()["video_mode"]["width"],
height=self.get_curr_cam()["video_mode"]["height"])
self.cams[device_name] = camera
def _init_camera(self):
return self._get_or_start_cameras()
def _get_usb_camera_by_name(self):
pass
def set_camera_settings(self,usb_camera:cscore.UsbCamera, dic):
if "brightness" in dic:
usb_camera.setBrightness(dic["brightness"])
if "exposure" in dic:
usb_camera.setExposureManual(dic["exposure"])
if "video_mode" in dic:
usb_camera.setVideoMode(dic["video_mode"])
# Access methods
def get_curr_pipeline(self):