mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-01-02 00:07:11 +01:00
Allow improve_contrast to be toggled via mqtt (#3011)
* Toggle improve_contrast for cameras via MQTT * Process parameter to mqtt toggle improve_contrast * Update mqtt docs for improve_contrast topic * Spacing * Add class variable and update in process_frames * Pass to constructor * pass by reference mistake * remove parameter * remove parameter
This commit is contained in:
parent
a5016afdd4
commit
65e0ec7826
@ -117,3 +117,11 @@ Topic to turn snapshots for a camera on and off. Expected values are `ON` and `O
|
|||||||
### `frigate/<camera_name>/snapshots/state`
|
### `frigate/<camera_name>/snapshots/state`
|
||||||
|
|
||||||
Topic with current state of snapshots for a camera. Published values are `ON` and `OFF`.
|
Topic with current state of snapshots for a camera. Published values are `ON` and `OFF`.
|
||||||
|
|
||||||
|
### `frigate/<camera_name>/improve_contrast/set`
|
||||||
|
|
||||||
|
Topic to turn improve_contrast for a camera on and off. Expected values are `ON` and `OFF`.
|
||||||
|
|
||||||
|
### `frigate/<camera_name>/improve_contrast/state`
|
||||||
|
|
||||||
|
Topic with current state of improve_contrast for a camera. Published values are `ON` and `OFF`.
|
||||||
|
@ -92,6 +92,9 @@ class FrigateApp:
|
|||||||
"detection_enabled": mp.Value(
|
"detection_enabled": mp.Value(
|
||||||
"i", self.config.cameras[camera_name].detect.enabled
|
"i", self.config.cameras[camera_name].detect.enabled
|
||||||
),
|
),
|
||||||
|
"improve_contrast_enabled": mp.Value(
|
||||||
|
"i", self.config.cameras[camera_name].motion.improve_contrast
|
||||||
|
),
|
||||||
"detection_fps": mp.Value("d", 0.0),
|
"detection_fps": mp.Value("d", 0.0),
|
||||||
"detection_frame": mp.Value("d", 0.0),
|
"detection_frame": mp.Value("d", 0.0),
|
||||||
"read_start": mp.Value("d", 0.0),
|
"read_start": mp.Value("d", 0.0),
|
||||||
|
@ -5,7 +5,7 @@ from frigate.config import MotionConfig
|
|||||||
|
|
||||||
|
|
||||||
class MotionDetector:
|
class MotionDetector:
|
||||||
def __init__(self, frame_shape, config: MotionConfig):
|
def __init__(self, frame_shape, config: MotionConfig, improve_contrast_enabled):
|
||||||
self.config = config
|
self.config = config
|
||||||
self.frame_shape = frame_shape
|
self.frame_shape = frame_shape
|
||||||
self.resize_factor = frame_shape[0] / config.frame_height
|
self.resize_factor = frame_shape[0] / config.frame_height
|
||||||
@ -24,6 +24,7 @@ class MotionDetector:
|
|||||||
)
|
)
|
||||||
self.mask = np.where(resized_mask == [0])
|
self.mask = np.where(resized_mask == [0])
|
||||||
self.save_images = False
|
self.save_images = False
|
||||||
|
self.improve_contrast = improve_contrast_enabled
|
||||||
|
|
||||||
def detect(self, frame):
|
def detect(self, frame):
|
||||||
motion_boxes = []
|
motion_boxes = []
|
||||||
@ -38,14 +39,15 @@ class MotionDetector:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Improve contrast
|
# Improve contrast
|
||||||
minval = np.percentile(resized_frame, 4)
|
if self.improve_contrast.value:
|
||||||
maxval = np.percentile(resized_frame, 96)
|
minval = np.percentile(resized_frame, 4)
|
||||||
# don't adjust if the image is a single color
|
maxval = np.percentile(resized_frame, 96)
|
||||||
if minval < maxval:
|
# don't adjust if the image is a single color
|
||||||
resized_frame = np.clip(resized_frame, minval, maxval)
|
if minval < maxval:
|
||||||
resized_frame = (
|
resized_frame = np.clip(resized_frame, minval, maxval)
|
||||||
((resized_frame - minval) / (maxval - minval)) * 255
|
resized_frame = (
|
||||||
).astype(np.uint8)
|
((resized_frame - minval) / (maxval - minval)) * 255
|
||||||
|
).astype(np.uint8)
|
||||||
|
|
||||||
# mask frame
|
# mask frame
|
||||||
resized_frame[self.mask] = [255]
|
resized_frame[self.mask] = [255]
|
||||||
|
@ -89,6 +89,30 @@ def create_mqtt_client(config: FrigateConfig, camera_metrics):
|
|||||||
state_topic = f"{message.topic[:-4]}/state"
|
state_topic = f"{message.topic[:-4]}/state"
|
||||||
client.publish(state_topic, payload, retain=True)
|
client.publish(state_topic, payload, retain=True)
|
||||||
|
|
||||||
|
def on_improve_contrast_command(client, userdata, message):
|
||||||
|
payload = message.payload.decode()
|
||||||
|
logger.debug(f"on_improve_contrast_toggle: {message.topic} {payload}")
|
||||||
|
|
||||||
|
camera_name = message.topic.split("/")[-3]
|
||||||
|
|
||||||
|
motion_settings = config.cameras[camera_name].motion
|
||||||
|
|
||||||
|
if payload == "ON":
|
||||||
|
if not camera_metrics[camera_name]["improve_contrast_enabled"].value:
|
||||||
|
logger.info(f"Turning on improve contrast for {camera_name} via mqtt")
|
||||||
|
camera_metrics[camera_name]["improve_contrast_enabled"].value = True
|
||||||
|
motion_settings.improve_contrast = True
|
||||||
|
elif payload == "OFF":
|
||||||
|
if camera_metrics[camera_name]["improve_contrast_enabled"].value:
|
||||||
|
logger.info(f"Turning off improve contrast for {camera_name} via mqtt")
|
||||||
|
camera_metrics[camera_name]["improve_contrast_enabled"].value = False
|
||||||
|
motion_settings.improve_contrast = False
|
||||||
|
else:
|
||||||
|
logger.warning(f"Received unsupported value at {message.topic}: {payload}")
|
||||||
|
|
||||||
|
state_topic = f"{message.topic[:-4]}/state"
|
||||||
|
client.publish(state_topic, payload, retain=True)
|
||||||
|
|
||||||
def on_restart_command(client, userdata, message):
|
def on_restart_command(client, userdata, message):
|
||||||
restart_frigate()
|
restart_frigate()
|
||||||
|
|
||||||
@ -128,6 +152,9 @@ def create_mqtt_client(config: FrigateConfig, camera_metrics):
|
|||||||
client.message_callback_add(
|
client.message_callback_add(
|
||||||
f"{mqtt_config.topic_prefix}/{name}/detect/set", on_detect_command
|
f"{mqtt_config.topic_prefix}/{name}/detect/set", on_detect_command
|
||||||
)
|
)
|
||||||
|
client.message_callback_add(
|
||||||
|
f"{mqtt_config.topic_prefix}/{name}/improve_contrast/set", on_improve_contrast_command
|
||||||
|
)
|
||||||
|
|
||||||
client.message_callback_add(
|
client.message_callback_add(
|
||||||
f"{mqtt_config.topic_prefix}/restart", on_restart_command
|
f"{mqtt_config.topic_prefix}/restart", on_restart_command
|
||||||
@ -173,6 +200,11 @@ def create_mqtt_client(config: FrigateConfig, camera_metrics):
|
|||||||
"ON" if config.cameras[name].detect.enabled else "OFF",
|
"ON" if config.cameras[name].detect.enabled else "OFF",
|
||||||
retain=True,
|
retain=True,
|
||||||
)
|
)
|
||||||
|
client.publish(
|
||||||
|
f"{mqtt_config.topic_prefix}/{name}/improve_contrast/state",
|
||||||
|
"ON" if config.cameras[name].motion.improve_contrast else "OFF",
|
||||||
|
retain=True,
|
||||||
|
)
|
||||||
|
|
||||||
return client
|
return client
|
||||||
|
|
||||||
|
@ -362,12 +362,13 @@ def track_camera(
|
|||||||
|
|
||||||
frame_queue = process_info["frame_queue"]
|
frame_queue = process_info["frame_queue"]
|
||||||
detection_enabled = process_info["detection_enabled"]
|
detection_enabled = process_info["detection_enabled"]
|
||||||
|
improve_contrast_enabled = process_info["improve_contrast_enabled"]
|
||||||
|
|
||||||
frame_shape = config.frame_shape
|
frame_shape = config.frame_shape
|
||||||
objects_to_track = config.objects.track
|
objects_to_track = config.objects.track
|
||||||
object_filters = config.objects.filters
|
object_filters = config.objects.filters
|
||||||
|
|
||||||
motion_detector = MotionDetector(frame_shape, config.motion)
|
motion_detector = MotionDetector(frame_shape, config.motion, improve_contrast_enabled)
|
||||||
object_detector = RemoteObjectDetector(
|
object_detector = RemoteObjectDetector(
|
||||||
name, labelmap, detection_queue, result_connection, model_shape
|
name, labelmap, detection_queue, result_connection, model_shape
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user