diff options
author | Théo de la Hogue | 2022-04-20 14:41:12 +0200 |
---|---|---|
committer | Théo de la Hogue | 2022-04-20 14:41:12 +0200 |
commit | a4a0ef9e28a009ad073958891382b3215c8d96f6 (patch) | |
tree | 780c9238dbaa975b30257aa332ae8149ebc493b3 /src/argaze/AreaOfInterest | |
parent | 824c00abfa923b58d82e23615ce7c18db3ca152f (diff) | |
download | argaze-a4a0ef9e28a009ad073958891382b3215c8d96f6.zip argaze-a4a0ef9e28a009ad073958891382b3215c8d96f6.tar.gz argaze-a4a0ef9e28a009ad073958891382b3215c8d96f6.tar.bz2 argaze-a4a0ef9e28a009ad073958891382b3215c8d96f6.tar.xz |
Adding AOIFeatures file to genaralize some AOI classes definition. Working on new visual scan class.
Diffstat (limited to 'src/argaze/AreaOfInterest')
-rw-r--r-- | src/argaze/AreaOfInterest/AOI2DScene.py | 52 | ||||
-rw-r--r-- | src/argaze/AreaOfInterest/AOI3DScene.py | 43 | ||||
-rw-r--r-- | src/argaze/AreaOfInterest/AOIFeatures.py | 50 | ||||
-rw-r--r-- | src/argaze/AreaOfInterest/__init__.py | 2 |
4 files changed, 87 insertions, 60 deletions
diff --git a/src/argaze/AreaOfInterest/AOI2DScene.py b/src/argaze/AreaOfInterest/AOI2DScene.py index fc4b3b2..929cc30 100644 --- a/src/argaze/AreaOfInterest/AOI2DScene.py +++ b/src/argaze/AreaOfInterest/AOI2DScene.py @@ -1,44 +1,42 @@ #!/usr/bin/env python from argaze import DataStructures +from argaze.AreaOfInterest import AOIFeatures +from argaze import GazeFeatures import cv2 as cv import matplotlib.path as mpath -class AOI2D(DataStructures.DictObject): - """Define Area Of Interest 2D - ``` +class AOI2DScene(AOIFeatures.AOIScene): + """Define AOI 2D scene as: + ``` { - 'vertices': array of (x, y) tuples, - 'pointer': (x, y) tuple or None + 'dimension': 2, + 'name 1': AOI 1, + 'name 2': AOI 2, + ... } - ``` + ``` """ - def __init__(self, vertices, pointer = None): - - super().__init__(type(self).__name__, **{'vertices': vertices, 'pointer': pointer}) - -class AOI2DScene(DataStructures.DictObject): - """Define AOI 2D scene as dictionnary of named AOI2Ds.""" - def __init__(self, **aois_2d): - super().__init__(type(self).__name__, **aois_2d) + super().__init__(**aois_2d) - def __del__(self): - pass + # set dimension member + self.dimension = 2 - def inside(self, pointer): - """Store pointer position if it is inside AOIs.""" + def look_at(self, gaze_position: GazeFeatures.GazePosition): + """Store gaze position as a pointer inside looked AOIs.""" - for name in self.keys(): + for name in self.areas(): aoi2D = self[name] - if mpath.Path(aoi2D.vertices).contains_points([pointer])[0]: + if mpath.Path(aoi2D.vertices).contains_points([(gaze_position.x, gaze_position.y)])[0]: - aoi2D.pointer = pointer + # TODO : edit area relative pointer position + aoi2D.pointer = (gaze_position.x, gaze_position.y) else: @@ -47,7 +45,7 @@ class AOI2DScene(DataStructures.DictObject): def draw(self, frame): """Draw AOI polygons on frame.""" - for name in self.keys(): + for name in self.areas(): aoi2D = self[name] inside = aoi2D.pointer != None @@ -60,13 +58,3 @@ class AOI2DScene(DataStructures.DictObject): cv.line(frame, aoi2D.vertices[-1], aoi2D.vertices[0], color, 1) for A, B in zip(aoi2D.vertices, aoi2D.vertices[1:]): cv.line(frame, A, B, color, 1) - -class TimeStampedAOI2DScenes(DataStructures.TimeStampedBuffer): - """Define timestamped buffer to store AOI2D scenes""" - - def __setitem__(self, key, value: AOI2DScene): - """Force value to be a AOI2DScene""" - if type(value) != AOI2DScene: - raise ValueError('value must be a AOI2DScene') - - super().__setitem__(key, value) diff --git a/src/argaze/AreaOfInterest/AOI3DScene.py b/src/argaze/AreaOfInterest/AOI3DScene.py index 73fc755..2930983 100644 --- a/src/argaze/AreaOfInterest/AOI3DScene.py +++ b/src/argaze/AreaOfInterest/AOI3DScene.py @@ -4,32 +4,20 @@ import math import re from argaze import DataStructures -from argaze.AreaOfInterest import AOI2DScene +from argaze.AreaOfInterest import AOIFeatures, AOI2DScene import numpy import cv2 as cv -class AOI3D(DataStructures.DictObject): - """Define Area Of Interest 3D - ``` - { - 'vertices': array of (x, y, z) tuples - } - ``` - """ - - def __init__(self, vertices): - - super().__init__(type(self).__name__, **{'vertices': vertices}) - -class AOI3DScene(DataStructures.DictObject): - """Define AOI 3D scene as dictionnary of named AOI3Ds. +class AOI3DScene(AOIFeatures.AOIScene): + """Define AOI 3D scene as: ``` { + 'dimension': 3, 'rotation': (x, y, z) tuples, 'translation': (x, y, z) tuples, - 'AOI name 1': AOI3D, - 'AOI name 2': AOI3D, + 'name 1': AOI 1, + 'name 2': AOI 2, ... } ``` @@ -41,10 +29,14 @@ class AOI3DScene(DataStructures.DictObject): aois_3d['rotation'] = numpy.asarray([0., 0., 0.]) aois_3d['translation'] = numpy.asarray([0., 0., 0.]) - super().__init__(type(self).__name__, **aois_3d) + super().__init__(**aois_3d) - def __del__(self): - pass + # set dimension member + self.dimension = 3 + + def areas(self): + """Get areas names""" + return self.keys()[3::] def load(self, obj_filepath: str): """Load AOI3D scene from .obj file.""" @@ -111,7 +103,7 @@ class AOI3DScene(DataStructures.DictObject): # retreive all aoi3D vertices for name, face in faces.items(): - self.append(name, AOI3D(**{'vertices': [ vertices[i-1] for i in face ]})) + self.append(name, AOIFeatures.AreaOfInterest(**{'vertices': [ vertices[i-1] for i in face ]})) except IOError: raise IOError(f'File not found: {obj_filepath}') @@ -122,10 +114,7 @@ class AOI3DScene(DataStructures.DictObject): aoi2D_scene = {} - for name in self.keys(): - - if name == 'rotation' or name == 'translation': - continue + for name in self.areas(): aoi3D = self[name] @@ -134,7 +123,7 @@ class AOI3DScene(DataStructures.DictObject): vertices_2D, J = cv.projectPoints(vertices_3D, self.rotation, self.translation, K, D) vertices_2D = vertices_2D.astype('int').reshape((len(vertices_2D), 2)).tolist() - aoi2D = AOI2DScene.AOI2D(vertices_2D) + aoi2D = AOIFeatures.AreaOfInterest(vertices_2D) aoi2D_scene[name] = aoi2D diff --git a/src/argaze/AreaOfInterest/AOIFeatures.py b/src/argaze/AreaOfInterest/AOIFeatures.py new file mode 100644 index 0000000..4788100 --- /dev/null +++ b/src/argaze/AreaOfInterest/AOIFeatures.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +from argaze import DataStructures + +class AreaOfInterest(DataStructures.DictObject): + """Define 2D/3D Area Of Interest + ``` + { + 'vertices': array of (x, y(,z)) tuples for each vertices of the area + 'pointer': None or (x, y(,z)) tuple to set where the area is looked + } + ``` + """ + + def __init__(self, vertices, pointer = None): + + super().__init__(type(self).__name__, **{'dimension': len(vertices[0]),'vertices': vertices, 'pointer': pointer}) + +class AOIScene(DataStructures.DictObject): + """Define AOI scene as: + ``` + { + 'dimension': 2 or 3, + 'name 1': AOI 1, + 'name 2': AOI 2, + ... + } + ``` + """ + + def __init__(self, **aois): + + # append dimension member + aois['dimension'] = None + + super().__init__(type(self).__name__, **aois) + + def areas(self): + """Get areas names.""" + return self.keys()[:-1] + +class TimeStampedAOIScenes(DataStructures.TimeStampedBuffer): + """Define timestamped buffer to store AOI scenes in time.""" + + def __setitem__(self, key, value): + """Force value to inherit from AOIScene.""" + if type(value).__bases__[0] != AOIScene: + raise ValueError(f'value must inherit from AOIScene') + + super().__setitem__(key, value) diff --git a/src/argaze/AreaOfInterest/__init__.py b/src/argaze/AreaOfInterest/__init__.py index 57ce80a..a1e9f47 100644 --- a/src/argaze/AreaOfInterest/__init__.py +++ b/src/argaze/AreaOfInterest/__init__.py @@ -2,4 +2,4 @@ .. include:: README.md """ __docformat__ = "restructuredtext" -__all__ = ['AOI2DScene', 'AOI3DScene']
\ No newline at end of file +__all__ = ['AOIFeatures', 'AOI2DScene', 'AOI3DScene']
\ No newline at end of file |