aboutsummaryrefslogtreecommitdiff
path: root/src/argaze/AreaOfInterest
diff options
context:
space:
mode:
authorThéo de la Hogue2022-04-20 14:41:12 +0200
committerThéo de la Hogue2022-04-20 14:41:12 +0200
commita4a0ef9e28a009ad073958891382b3215c8d96f6 (patch)
tree780c9238dbaa975b30257aa332ae8149ebc493b3 /src/argaze/AreaOfInterest
parent824c00abfa923b58d82e23615ce7c18db3ca152f (diff)
downloadargaze-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.py52
-rw-r--r--src/argaze/AreaOfInterest/AOI3DScene.py43
-rw-r--r--src/argaze/AreaOfInterest/AOIFeatures.py50
-rw-r--r--src/argaze/AreaOfInterest/__init__.py2
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