Browse Source

add support for polygon masks

Blake Blackshear 4 years ago
parent
commit
1ce993051e
2 changed files with 10 additions and 3 deletions
  1. 4 3
      config/config.example.yml
  2. 6 0
      frigate/video.py

+ 4 - 3
config/config.example.yml

@@ -140,9 +140,10 @@ cameras:
     # fps: 5
 
     ################
-    ## Optional mask. Must be the same aspect ratio as your video feed. Value is either the
-    ## name of a file in the config directory or a base64 encoded bmp image prefixed with
-    ## 'base64,' eg. 'base64,asfasdfasdf....'.
+    ## Optional mask. Must be the same aspect ratio as your video feed. Value is any of the following:
+    ##   - name of a file in the config directory
+    ##   - base64 encoded image prefixed with 'base64,' eg. 'base64,asfasdfasdf....'
+    ##   - polygon of x,y coordinates prefixed with 'poly,' eg. 'poly,0,900,1080,900,1080,1920,0,1920'
     ## 
     ## The mask works by looking at the bottom center of the bounding box for the detected
     ## person in the image. If that pixel in the mask is a black pixel, it ignores it as a

+ 6 - 0
frigate/video.py

@@ -202,6 +202,12 @@ def track_camera(name, config, frame_queue, frame_shape, detection_queue, detect
             img = base64.b64decode(config['mask'][7:]) 
             npimg = np.fromstring(img, dtype=np.uint8)
             mask = cv2.imdecode(npimg, cv2.IMREAD_GRAYSCALE)
+        elif config['mask'].startswith('poly,'):
+            points = config['mask'].split(',')[1:]
+            contour =  np.array([[int(points[i]), int(points[i+1])] for i in range(0, len(points), 2)])
+            mask = np.zeros((frame_shape[0], frame_shape[1]), np.uint8)
+            mask[:] = 255
+            cv2.fillPoly(mask, pts=[contour], color=(0))
         else:
             mask = cv2.imread("/config/{}".format(config['mask']), cv2.IMREAD_GRAYSCALE)
     else: