浏览代码

add the ability to mask the standing location of a person

blakeblackshear 6 年之前
父节点
当前提交
4dacf02ef9
共有 3 个文件被更改,包括 17 次插入21 次删除
  1. 二进制
      config/back-mask.bmp
  2. 1 21
      config/config.yml
  3. 16 0
      frigate/video.py

二进制
config/back-mask.bmp


+ 1 - 21
config/config.yml

@@ -13,6 +13,7 @@ cameras:
       # values that begin with a "$" will be replaced with environment variable
       password: $RTSP_PASSWORD
       path: /cam/realmonitor?channel=1&subtype=2
+    mask: back-mask.bmp
     regions:
       - size: 350
         x_offset: 0
@@ -26,24 +27,3 @@ cameras:
         x_offset: 750
         y_offset: 250
         min_person_area: 2000
-  back2:
-    rtsp:
-      user: viewer
-      host: 10.0.10.10
-      port: 554
-      # values that begin with a "$" will be replaced with environment variable
-      password: $RTSP_PASSWORD
-      path: /cam/realmonitor?channel=1&subtype=2
-    regions:
-      - size: 350
-        x_offset: 0
-        y_offset: 300
-        min_person_area: 5000
-      - size: 400
-        x_offset: 350
-        y_offset: 250
-        min_person_area: 2000
-      - size: 400
-        x_offset: 750
-        y_offset: 250
-        min_person_area: 2000

+ 16 - 0
frigate/video.py

@@ -170,6 +170,13 @@ class Camera:
         # start a thread to publish object scores (currently only person)
         mqtt_publisher = MqttObjectPublisher(self.mqtt_client, self.mqtt_topic_prefix, self.objects_parsed, self.detected_objects)
         mqtt_publisher.start()
+
+        # load in the mask for person detection
+        if 'mask' in self.config:
+            self.mask = cv2.imread("/config/{}".format(self.config['mask']), cv2.IMREAD_GRAYSCALE)
+        else:
+            self.mask = np.zeros((self.frame_shape[0], self.frame_shape[1], 1), np.uint8)
+            self.mask[:] = 255
     
     def start(self):
         self.capture_process.start()
@@ -206,6 +213,15 @@ class Camera:
                 # detected person, don't add it to detected objects
                 if region and region['min_person_area'] > person_area:
                     continue
+            
+                # compute the coordinates of the person and make sure
+                # the location isnt outide the bounds of the image (can happen from rounding)
+                y_location = min(int(obj['ymax']), len(self.mask)-1)
+                x_location = min(int((obj['xmax']-obj['xmin'])/2.0), len(self.mask[0])-1)
+
+                # if the person is in a masked location, continue
+                if self.mask[y_location][x_location] == [0]:
+                    continue
 
             self.detected_objects.append(obj)