#!/usr/bin/env python from argaze import DataStructures import cv2 as cv import matplotlib.path as mpath class ROI2D(DataStructures.DictObject): """Define Region Of Interest 2D ``` { 'vertices': array of (x, y) tuples, 'pointer': (x, y) tuple or None } ``` """ def __init__(self, vertices, pointer = None): super().__init__(type(self).__name__, **{'vertices': vertices, 'pointer': pointer}) class ROI2DScene(DataStructures.DictObject): """Define ROI 2D scene as dictionnary of named ROI2Ds.""" def __init__(self, **rois_2d): super().__init__(type(self).__name__, **rois_2d) def __del__(self): pass def inside(self, pointer): """Store pointer position if it is inside ROIs.""" for name in self.keys(): roi2D = self[name] if mpath.Path(roi2D.vertices).contains_points([pointer])[0]: roi2D.pointer = pointer else: roi2D.pointer = None def draw(self, frame): """Draw ROI polygons on frame.""" for name in self.keys(): roi2D = self[name] inside = roi2D.pointer != None color = (0, 255, 0) if inside else (0, 0, 255) if inside: cv.putText(frame, name, (roi2D.vertices[3][0], roi2D.vertices[3][1]), cv.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1, cv.LINE_AA) cv.line(frame, roi2D.vertices[-1], roi2D.vertices[0], color, 1) for A, B in zip(roi2D.vertices, roi2D.vertices[1:]): cv.line(frame, A, B, color, 1) class TimeStampedROI2DScenes(DataStructures.TimeStampedBuffer): """Define timestamped buffer to store ROI2D scenes""" def __setitem__(self, key, value: ROI2DScene): """Force value to be a ROI2DScene""" if type(value) != ROI2DScene: raise ValueError('value must be a ROI2DScene') super().__setitem__(key, value)