def test_requires_in_range_marker_id(marker_type: MarkerType) -> None: MarkerCamera(marker_type.max_id, marker_size=200, marker_type=marker_type) with pytest.raises(ValueError) as e: MarkerCamera(marker_type.max_id + 1, marker_size=200, marker_type=marker_type) assert "must be less than the maximum allowed" in e.value.args[0]
def is_valid_calibration(filename: Path) -> bool: if not filename.is_file(): return False # First, Try and parse the file try: parse_calibration_file(filename) except (SystemError, ValueError): return False with tempfile.NamedTemporaryFile(suffix=".png") as temp_file: marker_camera = MarkerCamera(0, 200, marker_type=MarkerType.APRILTAG_36H11) marker_camera.save_frame(Path(temp_file.name)) image_camera = ImageFileCamera( Path(temp_file.name), marker_size=200, marker_type=MarkerType.APRILTAG_36H11, calibration_file=filename, ) # Sanity check the image camera if image_camera.get_visible_markers() != [0]: return False # Then, confirm the detection works if len(list(marker_camera.process_frame_eager())) != 1: return False return True
def test_detects_markers(marker_id): markers = list( MarkerCamera(marker_id, marker_dict=MarkerDict.DICT_6X6_50, marker_size=200).process_frame()) assert len(markers) == 1 assert markers[0].id == marker_id
def test_sees_nothing_in_blank_image(): marker_camera = MarkerCamera(25, marker_dict=MarkerDict.DICT_6X6_50, marker_size=200) empty_frame = numpy.zeros((200, 200, 3), numpy.uint8) markers = list(marker_camera.process_frame(frame=empty_frame)) assert markers == []
def test_minimum_marker_size(marker_type: MarkerType) -> None: camera = MarkerCamera( marker_type.max_id, marker_size=marker_type.min_marker_image_size, marker_type=marker_type, ) assert camera.get_visible_markers() == [marker_type.max_id] with pytest.raises(ValueError) as e: MarkerCamera( marker_type.max_id, marker_size=marker_type.min_marker_image_size - 1, marker_type=marker_type, ) assert "marker must be at least" in e.value.args[0]
def test_process_eager_frame_without_calibrations(marker_type: MarkerType) -> None: marker_camera = MarkerCamera( MAX_ALL_ALLOWED_ID, marker_size=200, marker_type=marker_type ) marker_camera.calibration_params = None with pytest.raises(MissingCalibrationsError): list(marker_camera.process_frame_eager())
def test_marker_type_max_id_disallowed(marker_type: MarkerType) -> None: camera = MarkerCamera(marker_type.max_id, marker_size=100, marker_type=marker_type) camera.marker_id = marker_type.max_id + 1 # There's an assertion in the constructor with pytest.raises(cv2.error): camera.get_visible_markers()
def test_detects_markers(marker_type: MarkerType, marker_id: int) -> None: markers = list( MarkerCamera( marker_id, marker_size=100, marker_type=marker_type ).process_frame() ) assert len(markers) == 1 assert markers[0].id == marker_id
def test_eager_capture(marker_id): markers = list( MarkerCamera(marker_id, marker_dict=MarkerDict.DICT_6X6_50, marker_size=200).process_frame_eager()) assert len(markers) == 1 assert markers[0].id == marker_id assert markers[0]._is_eager()
def test_saved_image(temp_image_file, marker_id): marker_camera = MarkerCamera(marker_id, marker_dict=MarkerDict.DICT_6X6_50, marker_size=200) marker_camera.save_frame(temp_image_file) image_file_camera = ImageFileCamera(temp_image_file, marker_dict=MarkerDict.DICT_6X6_50) assert image_file_camera.get_visible_markers() == [marker_id]
def setUp(self) -> None: self.marker_camera = MarkerCamera( self.MARKER_ID, marker_size=self.MARKER_SIZE, marker_type=MarkerType.ARUCO_6X6, ) self.markers = list(self.marker_camera.process_frame_eager()) self.marker = self.markers[0]
def setUp(self): self.marker_camera = MarkerCamera( self.MARKER_ID, marker_dict=MarkerDict.DICT_6X6_50, marker_size=self.MARKER_SIZE, ) self.markers = list(self.marker_camera.process_frame()) self.marker = self.markers[0]
def test_eager_capture(marker_type: MarkerType, marker_id: int) -> None: markers = list( MarkerCamera( marker_id, marker_size=200, marker_type=marker_type ).process_frame_eager() ) assert len(markers) == 1 assert markers[0].id == marker_id assert isinstance(markers[0], EagerMarker)
def setUp(self) -> None: self.marker_camera = MarkerCamera( self.MARKER_ID, marker_size=self.MARKER_SIZE, marker_type=MarkerType.ARUCO_6X6, ) self.marker_camera.calibration_params = None self.markers = list(self.marker_camera.process_frame()) self.marker = self.markers[0]
def test_saved_image( marker_type: MarkerType, temp_image_file: Path, marker_id: int ) -> None: marker_camera = MarkerCamera(marker_id, marker_size=200, marker_type=marker_type) marker_camera.save_frame(temp_image_file) image_file_camera = ImageFileCamera( temp_image_file, marker_type=marker_type, marker_size=200 ) assert image_file_camera.get_visible_markers() == [marker_id]
def test_detect_at_minimum_size(marker_type: MarkerType) -> None: marker_camera = MarkerCamera( 0, marker_size=marker_type.min_marker_image_size, marker_type=marker_type, border_size=MarkerCamera.MIN_BORDER_SIZE, ) frame = marker_camera.capture_frame() assert frame.shape == marker_camera.get_resolution() marker = next(marker_camera.process_frame(frame=frame)) assert marker.id == 0
def test_marker_size( marker_type: MarkerType, temp_image_file: Path, marker_id: int ) -> None: class TestCamera(ImageFileCamera): def get_marker_size(self, inner_marker_id: int) -> int: return inner_marker_id * 10 marker_camera = MarkerCamera(marker_id, marker_size=200, marker_type=marker_type) marker_camera.save_frame(temp_image_file) image_file_camera = TestCamera(temp_image_file, marker_type=marker_type) marker = next(image_file_camera.process_frame()) assert marker.size == marker_id * 10 assert marker.id == marker_id
def test_no_markers(temp_image_file: Path) -> None: marker_camera = MarkerCamera( MAX_ALL_ALLOWED_ID, marker_size=100, marker_type=MarkerType.ARUCO_4X4, ) marker_camera.save_frame(temp_image_file) image_file_camera = ImageFileCamera( temp_image_file, marker_type=MarkerType.ARUCO_5X5, marker_size=100 ) assert marker_camera.marker_type != image_file_camera.marker_type assert image_file_camera.get_visible_markers() == []
def main(args: argparse.Namespace) -> None: from PIL import Image, ImageDraw marker_type = MarkerType[args.type] output_dir: Path = args.path.resolve() output_dir.mkdir(exist_ok=True, parents=True) marker_ids = (parse_ranges(args.range) if args.range != "ALL" else marker_type.marker_ids) for marker_id in sorted(marker_ids): with MarkerCamera( marker_id, marker_type=marker_type, marker_size=marker_type.min_marker_image_size, ) as camera: camera.border_size = 1 # HACK: There's validation in the constructor print("Saving", marker_id) # noqa:T001 if args.raw: camera.save_frame(output_dir / "{}.png".format(marker_id)) else: image = Image.fromarray(camera.capture_frame()) # Resize the image to the required size resized_image = image.resize((500, 500), resample=0) img_size = resized_image.size[0] ImageDraw.Draw(resized_image).text( (25, img_size - 25), args.description_format.format( marker_type=marker_type.name, marker_id=marker_id), anchor="lt", ) resized_image.save(output_dir / "{}.png".format(marker_id))
def test_marker_with_falsy_id(marker_type: MarkerType) -> None: with MarkerCamera(0, marker_size=200, marker_type=marker_type) as marker_camera: markers = list(marker_camera.get_visible_markers()) assert markers == [0]
def test_saved_image_with_annotation(temp_image_file, marker_id): marker_camera = MarkerCamera(marker_id, marker_dict=MarkerDict.DICT_6X6_50, marker_size=200) output_file = temp_image_file marker_camera.save_frame(output_file, annotate=True)
def test_saved_image_with_annotation( temp_image_file: Path, marker_id: int, marker_type: MarkerType ) -> None: marker_camera = MarkerCamera(marker_id, marker_size=200, marker_type=marker_type) output_file = temp_image_file marker_camera.save_frame(output_file, annotate=True)
def test_marker_with_falsy_id(): with MarkerCamera(0, marker_dict=MarkerDict.DICT_6X6_50, marker_size=200) as marker_camera: markers = list(marker_camera.get_visible_markers()) assert markers == [0]
def test_camera_as_context_manager(): with MarkerCamera(25, marker_dict=MarkerDict.DICT_6X6_50, marker_size=200) as marker_camera: markers = list(marker_camera.get_visible_markers()) assert markers == [25]
def test_captures_frame_at_correct_resolution( marker_size: int, marker_type: MarkerType ) -> None: marker_camera = MarkerCamera(25, marker_size=marker_size, marker_type=marker_type) frame = marker_camera.capture_frame() assert frame.shape == marker_camera.get_resolution()
def test_detects_marker_ids(marker_id): markers = MarkerCamera(marker_id, marker_dict=MarkerDict.DICT_6X6_50, marker_size=200).get_visible_markers() assert markers == [marker_id]
def test_captures_frame_at_correct_resolution(resolution): marker_camera = MarkerCamera(25, marker_dict=MarkerDict.DICT_6X6_50, marker_size=resolution) frame = marker_camera.capture_frame() assert frame.shape == marker_camera.get_resolution()
def marker_camera(): return MarkerCamera(25, marker_dict=MarkerDict.DICT_6X6_50, marker_size=200)
def test_detects_marker_ids(marker_type: MarkerType, marker_id: int) -> None: markers = MarkerCamera( marker_id, marker_size=200, marker_type=marker_type ).get_visible_markers() assert markers == [marker_id]
def test_camera_as_context_manager(marker_type: MarkerType) -> None: with MarkerCamera( MAX_ALL_ALLOWED_ID, marker_size=200, marker_type=marker_type ) as marker_camera: markers = list(marker_camera.get_visible_markers()) assert markers == [MAX_ALL_ALLOWED_ID]