use a different method for blur and contrast to reduce CPU

This commit is contained in:
Blake Blackshear 2023-06-28 07:18:30 -05:00
parent ef14a43930
commit 959aa6cc22

View File

@ -1,6 +1,7 @@
import cv2 import cv2
import imutils import imutils
import numpy as np import numpy as np
from scipy.ndimage import gaussian_filter
from frigate.config import MotionConfig from frigate.config import MotionConfig
from frigate.motion import MotionDetector from frigate.motion import MotionDetector
@ -15,8 +16,6 @@ class ImprovedMotionDetector(MotionDetector):
improve_contrast, improve_contrast,
threshold, threshold,
contour_area, contour_area,
clipLimit=2.0,
tileGridSize=(2, 2),
name="improved", name="improved",
): ):
self.name = name self.name = name
@ -28,7 +27,6 @@ class ImprovedMotionDetector(MotionDetector):
config.frame_height * frame_shape[1] // frame_shape[0], config.frame_height * frame_shape[1] // frame_shape[0],
) )
self.avg_frame = np.zeros(self.motion_frame_size, np.float32) self.avg_frame = np.zeros(self.motion_frame_size, np.float32)
self.avg_delta = np.zeros(self.motion_frame_size, np.float32)
self.motion_frame_count = 0 self.motion_frame_count = 0
self.frame_counter = 0 self.frame_counter = 0
resized_mask = cv2.resize( resized_mask = cv2.resize(
@ -42,7 +40,6 @@ class ImprovedMotionDetector(MotionDetector):
self.improve_contrast = improve_contrast self.improve_contrast = improve_contrast
self.threshold = threshold self.threshold = threshold
self.contour_area = contour_area self.contour_area = contour_area
self.clahe = cv2.createCLAHE(clipLimit=clipLimit, tileGridSize=tileGridSize)
def detect(self, frame): def detect(self, frame):
motion_boxes = [] motion_boxes = []
@ -56,24 +53,31 @@ class ImprovedMotionDetector(MotionDetector):
interpolation=cv2.INTER_LINEAR, interpolation=cv2.INTER_LINEAR,
) )
# mask frame
resized_frame[self.mask] = [255]
if self.save_images: if self.save_images:
resized_saved = resized_frame.copy() resized_saved = resized_frame.copy()
resized_frame = cv2.GaussianBlur(resized_frame, (3, 3), cv2.BORDER_DEFAULT) resized_frame = gaussian_filter(resized_frame, sigma=1, truncate=1.0)
if self.save_images: if self.save_images:
blurred_saved = resized_frame.copy() blurred_saved = resized_frame.copy()
# Improve contrast # Improve contrast
if self.improve_contrast.value: if self.improve_contrast.value:
resized_frame = self.clahe.apply(resized_frame) minval = np.percentile(resized_frame, 4)
maxval = np.percentile(resized_frame, 96)
# don't adjust if the image is a single color
if minval < maxval:
resized_frame = np.clip(resized_frame, minval, maxval)
resized_frame = (
((resized_frame - minval) / (maxval - minval)) * 255
).astype(np.uint8)
if self.save_images: if self.save_images:
contrasted_saved = resized_frame.copy() contrasted_saved = resized_frame.copy()
# mask frame
resized_frame[self.mask] = [255]
if self.save_images or self.calibrating: if self.save_images or self.calibrating:
self.frame_counter += 1 self.frame_counter += 1
# compare to average # compare to average