diff options
Diffstat (limited to 'src/argaze/ArUcoMarkers/ArUcoMarker.py')
-rw-r--r-- | src/argaze/ArUcoMarkers/ArUcoMarker.py | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/argaze/ArUcoMarkers/ArUcoMarker.py b/src/argaze/ArUcoMarkers/ArUcoMarker.py new file mode 100644 index 0000000..4f716bb --- /dev/null +++ b/src/argaze/ArUcoMarkers/ArUcoMarker.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +from dataclasses import dataclass, field + +from argaze.ArUcoMarkers import ArUcoMarkersDictionary + +import numpy +import cv2 as cv +import cv2.aruco as aruco + +@dataclass +class ArUcoMarker(): + """Define ArUco marker class.""" + + dictionary: ArUcoMarkersDictionary.ArUcoMarkersDictionary + """ """ + + identifier: int + """ """ + + size: float + """Size of marker in centimeters.""" + + corners: numpy.array = field(init=False, repr=False) + """Estimated 2D corner positions in camera image referential.""" + + translation: numpy.array = field(init=False, repr=False) + """Estimated 3D center position in camera referential.""" + + rotation: numpy.array = field(init=False, repr=False) + """Estimated 3D marker rotation in camera referential.""" + + points: numpy.array = field(init=False, repr=False) + """Estimated 3D corners positions in camera referential.""" + + def center(self, i): + """Get 2D center position in camera image referential.""" + return self.corners[0].mean(axis=0) + + def draw(self, frame, K, D): + """Draw marker in frame.""" + + # Draw marker axis if pose has been estimated + if self.translation.size == 3 and self.rotation.size == 3: + + cv.drawFrameAxes(frame, K, D, self.rotation, self.translation, self.size) + + aruco.drawDetectedMarkers(frame, [self.corners], numpy.array([self.identifier]))
\ No newline at end of file |