- introduced board_id
- board_id is encoded as Reed Solomon bytes array into marker
This commit is contained in:
@@ -1,16 +1,13 @@
|
|||||||
import os
|
|
||||||
import abc
|
import abc
|
||||||
import math
|
|
||||||
import cv2 as cv
|
import cv2 as cv
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from pathlib import Path
|
from reedsolo import RSCodec, ReedSolomonError
|
||||||
from ar_tag_pose.utils import to_board_pose_euler
|
|
||||||
import mimetypes
|
|
||||||
|
|
||||||
RESULTS_FOLDER = "results"
|
RESULTS_FOLDER = "results"
|
||||||
|
|
||||||
class BoardDetector(abc.ABC):
|
class BoardDetector(abc.ABC):
|
||||||
name = None
|
name = None
|
||||||
|
ids = None
|
||||||
mtx = None
|
mtx = None
|
||||||
dist = None
|
dist = None
|
||||||
r_vecs = None
|
r_vecs = None
|
||||||
@@ -21,8 +18,15 @@ class BoardDetector(abc.ABC):
|
|||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name: str, board_id: str, n_syms: int):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
msg_size = len(board_id)
|
||||||
|
n_rs = n_syms - msg_size
|
||||||
|
rs = RSCodec(n_rs, c_exp=7)
|
||||||
|
msg = bytes(f"{board_id}", 'utf-8')
|
||||||
|
byte_string = rs.encode(msg)
|
||||||
|
self.ids = np.array([x for x in byte_string])
|
||||||
|
print(f"{name}: markers: {self.ids}")
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def get_board_name(self) -> str:
|
def get_board_name(self) -> str:
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ import numpy as np
|
|||||||
from ar_tag_pose.detector_board import BoardDetector
|
from ar_tag_pose.detector_board import BoardDetector
|
||||||
from ar_tag_pose.aruco_types import ARUCO_DICT
|
from ar_tag_pose.aruco_types import ARUCO_DICT
|
||||||
|
|
||||||
def factory(dict_type: int, board_size: cv.typing.Size, marker_length: float=100.0, marker_sep=10):
|
def factory(dict_type: int, board_size: cv.typing.Size, marker_length: float=100.0, marker_sep=10, ids: np.array=None):
|
||||||
aruco_dict = cv.aruco.getPredefinedDictionary(dict_type)
|
aruco_dict = cv.aruco.getPredefinedDictionary(dict_type)
|
||||||
params = cv.aruco.DetectorParameters()
|
params = cv.aruco.DetectorParameters()
|
||||||
board = cv.aruco.GridBoard(size=board_size, markerLength=marker_length, markerSeparation=marker_sep, dictionary=aruco_dict)
|
board = cv.aruco.GridBoard(size=board_size, markerLength=marker_length, markerSeparation=marker_sep, dictionary=aruco_dict, ids=ids)
|
||||||
detector = cv.aruco.ArucoDetector(aruco_dict, params)
|
detector = cv.aruco.ArucoDetector(aruco_dict, params)
|
||||||
return detector, board
|
return detector, board
|
||||||
|
|
||||||
@@ -14,11 +14,11 @@ class BoardDetectorAruco(BoardDetector):
|
|||||||
detector: cv.aruco.ArucoDetector = None
|
detector: cv.aruco.ArucoDetector = None
|
||||||
board: cv.aruco.GridBoard = None
|
board: cv.aruco.GridBoard = None
|
||||||
dict_type = None
|
dict_type = None
|
||||||
def __init__(self, name: str, dict_type: int, board_size: tuple[int, int], marker_ids: list[int]=None):
|
def __init__(self, name: str, dict_type: int, board_id: str, board_size: tuple[int, int]):
|
||||||
BoardDetector.__init__(self, name)
|
|
||||||
self.dict_type = dict_type
|
self.dict_type = dict_type
|
||||||
self.board_size = board_size
|
self.board_size = board_size
|
||||||
self.detector, self.board = factory(dict_type, board_size)
|
self.detector, self.board = factory(dict_type, board_size, ids=self.ids)
|
||||||
|
BoardDetector.__init__(self, name, board_id, len(self.board.getIds()))
|
||||||
|
|
||||||
def get_board_name(self):
|
def get_board_name(self):
|
||||||
grid_size = self.board.getGridSize()
|
grid_size = self.board.getGridSize()
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ import numpy as np
|
|||||||
from ar_tag_pose.detector_board import BoardDetector
|
from ar_tag_pose.detector_board import BoardDetector
|
||||||
from ar_tag_pose.aruco_types import ARUCO_DICT
|
from ar_tag_pose.aruco_types import ARUCO_DICT
|
||||||
|
|
||||||
def factory(dict_type: int, board_size: cv.typing.Size, square_length: float = 5.0, marker_length: float = 3.0):
|
def factory(dict_type: int, board_size: cv.typing.Size, square_length: float = 5.0, marker_length: float = 3.0, ids: np.array=None):
|
||||||
aruco_dict = cv.aruco.getPredefinedDictionary(dict_type)
|
aruco_dict = cv.aruco.getPredefinedDictionary(dict_type)
|
||||||
params = cv.aruco.CharucoParameters()
|
params = cv.aruco.CharucoParameters()
|
||||||
board = cv.aruco.CharucoBoard(size=board_size, squareLength=square_length, markerLength=marker_length, dictionary=aruco_dict)
|
board = cv.aruco.CharucoBoard(size=board_size, squareLength=square_length, markerLength=marker_length, dictionary=aruco_dict, ids=ids)
|
||||||
detector = cv.aruco.CharucoDetector(board, params)
|
detector = cv.aruco.CharucoDetector(board, params)
|
||||||
return detector, board
|
return detector, board
|
||||||
|
|
||||||
@@ -14,11 +14,11 @@ class BoardDetectorCharuco(BoardDetector):
|
|||||||
detector: cv.aruco.CharucoDetector = None
|
detector: cv.aruco.CharucoDetector = None
|
||||||
board: cv.aruco.CharucoBoard = None
|
board: cv.aruco.CharucoBoard = None
|
||||||
dict_type = None
|
dict_type = None
|
||||||
def __init__(self, name: str, dict_type: int, board_size: tuple[int, int], marker_ids: list[int]=None):
|
def __init__(self, name: str, dict_type: int, board_id: str, board_size: tuple[int, int]):
|
||||||
BoardDetector.__init__(self, name)
|
self.detector, self.board = factory(dict_type, board_size, ids=self.ids)
|
||||||
self.dict_type = dict_type
|
self.dict_type = dict_type
|
||||||
self.board_size = board_size
|
self.board_size = board_size
|
||||||
self.detector, self.board = factory(dict_type, board_size)
|
BoardDetector.__init__(self, name, board_id, len(self.board.getIds()))
|
||||||
|
|
||||||
def get_board_name(self):
|
def get_board_name(self):
|
||||||
grid_size = self.board.getChessboardSize()
|
grid_size = self.board.getChessboardSize()
|
||||||
|
|||||||
@@ -154,6 +154,13 @@ class Detector(abc.ABC):
|
|||||||
|
|
||||||
cv.destroyAllWindows()
|
cv.destroyAllWindows()
|
||||||
|
|
||||||
|
def gen_marker_list():
|
||||||
|
msg = bytes(f"{n:0{msg_size}d}", 'utf-8')
|
||||||
|
byte_string = rs.encode(msg)
|
||||||
|
marker_list = [x for x in byte_string]
|
||||||
|
print(marker_list)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
# construct the argument parser and parse the arguments
|
# construct the argument parser and parse the arguments
|
||||||
ap = argparse.ArgumentParser()
|
ap = argparse.ArgumentParser()
|
||||||
@@ -175,16 +182,22 @@ def main():
|
|||||||
ap.add_argument("-m", "--margin_length", type=int,
|
ap.add_argument("-m", "--margin_length", type=int,
|
||||||
default=10,
|
default=10,
|
||||||
help="Margin length of board [Pixels]")
|
help="Margin length of board [Pixels]")
|
||||||
|
ap.add_argument("-n", "--num_boards", type=int,
|
||||||
|
default=1,
|
||||||
|
help="Number of boards")
|
||||||
args = vars(ap.parse_args())
|
args = vars(ap.parse_args())
|
||||||
|
|
||||||
|
msg_size = 3
|
||||||
board_detector = []
|
board_detector = []
|
||||||
if "Aruco" in args["type"]:
|
if "Aruco" in args["type"]:
|
||||||
for n in range(2):
|
for n in range(args["num_boards"]):
|
||||||
det = BoardDetectorAruco(f"Aruco_det-{n}", args["dict_type"], (args["board_width"], args["board_height"]))
|
board_id = f"{n:0{msg_size}d}"
|
||||||
|
det = BoardDetectorAruco(f"Aruco_det-{n}", args["dict_type"], board_id, (args["board_width"], args["board_height"]))
|
||||||
board_detector.append(det)
|
board_detector.append(det)
|
||||||
elif "Charuco" in args["type"]:
|
elif "Charuco" in args["type"]:
|
||||||
for n in range(2):
|
for n in range(args["num_boards"]):
|
||||||
det = BoardDetectorCharuco(f"Charuco_det-{n}", args["dict_type"], (args["board_width"], args["board_height"]))
|
board_id = f"{n:0{msg_size}d}"
|
||||||
|
det = BoardDetectorCharuco(f"Charuco_det-{n}", args["dict_type"], board_id, (args["board_width"], args["board_height"]))
|
||||||
board_detector.append(det)
|
board_detector.append(det)
|
||||||
|
|
||||||
detector = Detector(args["source"], board_detector)
|
detector = Detector(args["source"], board_detector)
|
||||||
@@ -194,4 +207,4 @@ def main():
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|||||||
+2
-1
@@ -14,7 +14,8 @@ authors = [
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"opencv-python",
|
"opencv-python",
|
||||||
"opencv-contrib-python",
|
"opencv-contrib-python",
|
||||||
"scipy"
|
"scipy",
|
||||||
|
"reedsolo"
|
||||||
]
|
]
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user