ソースを参照

cache the computed jpg bytes to reduce cpu usage

Blake Blackshear 5 年 前
コミット
6c87ce0879
2 ファイル変更21 行追加4 行削除
  1. 1 3
      detect_objects.py
  2. 20 1
      frigate/video.py

+ 1 - 3
detect_objects.py

@@ -123,10 +123,8 @@ def main():
             # max out at 1 FPS
             time.sleep(1)
             frame = cameras[camera_name].get_current_frame_with_objects()
-            # encode the image into a jpg
-            ret, jpg = cv2.imencode('.jpg', frame)
             yield (b'--frame\r\n'
-                b'Content-Type: image/jpeg\r\n\r\n' + jpg.tobytes() + b'\r\n\r\n')
+                b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
 
     app.run(host='0.0.0.0', port=WEB_PORT, debug=False)
 

+ 20 - 1
frigate/video.py

@@ -144,6 +144,12 @@ class Camera:
         self.frame_ready = mp.Condition()
         # Condition for notifying that objects were parsed
         self.objects_parsed = mp.Condition()
+        
+        # initialize the frame cache
+        self.cached_frame_with_objects = {
+            'frame_bytes': [],
+            'frame_time': 0
+        }
 
         self.ffmpeg_process = None
         self.capture_thread = None
@@ -315,6 +321,9 @@ class Camera:
         with self.frame_lock:
             frame = self.current_frame.copy()
             frame_time = self.frame_time.value
+        
+        if frame_time == self.cached_frame_with_objects['frame_time']:
+            return self.cached_frame_with_objects['frame_bytes']
 
         # draw the bounding boxes on the screen
         for obj in detected_objects:
@@ -333,7 +342,17 @@ class Camera:
         # convert to BGR
         frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
 
-        return frame
+        # encode the image into a jpg
+        ret, jpg = cv2.imencode('.jpg', frame)
+
+        frame_bytes = jpg.tobytes()
+
+        self.cached_frame_with_objects = {
+            'frame_bytes': frame_bytes,
+            'frame_time': frame_time
+        }
+
+        return frame_bytes