|
25 | 25 | ############################################################################# |
26 | 26 |
|
27 | 27 | import abc |
| 28 | +from typing import List, Mapping |
28 | 29 |
|
29 | | -from . frame_transformer import BaseDecoratedFrameTransformer |
| 30 | +import numpy as np |
| 31 | + |
| 32 | +import mpf_component_api as mpf |
| 33 | +from . frame_transformer import BaseDecoratedFrameTransformer, IFrameTransformer |
30 | 34 | from .. import utils |
31 | 35 |
|
32 | 36 |
|
33 | 37 | class _BaseFrameCropper(BaseDecoratedFrameTransformer, abc.ABC): |
34 | 38 |
|
35 | | - def get_frame_size(self, frame_index): |
| 39 | + def get_frame_size(self, frame_index: int) -> utils.Size: |
36 | 40 | return self._get_region_of_interest(frame_index).size |
37 | 41 |
|
38 | 42 |
|
39 | | - def _do_frame_transform(self, frame, frame_index): |
| 43 | + def _do_frame_transform(self, frame: np.ndarray, frame_index: int) -> np.ndarray: |
40 | 44 | region = self._get_region_of_interest(frame_index) |
41 | 45 | return frame[region.y:region.br.y, region.x:region.br.x] |
42 | 46 |
|
43 | 47 |
|
44 | | - def _do_reverse_transform(self, image_location, frame_index): |
| 48 | + def _do_reverse_transform(self, image_location: mpf.ImageLocation, frame_index: int) -> None: |
45 | 49 | region = self._get_region_of_interest(frame_index) |
46 | 50 | image_location.x_left_upper += region.x |
47 | 51 | image_location.y_left_upper += region.y |
48 | 52 |
|
49 | 53 |
|
| 54 | + def _get_intersecting_region( |
| 55 | + self, region_of_interest: utils.Rect, frame_index: int) -> utils.Rect: |
| 56 | + frame_rect = utils.Rect.from_corner_and_size( |
| 57 | + utils.Point(0, 0), self._get_inner_frame_size(frame_index)) |
| 58 | + return region_of_interest.intersection(frame_rect) |
| 59 | + |
| 60 | + |
50 | 61 | @abc.abstractmethod |
51 | | - def _get_region_of_interest(self, frame_index): |
| 62 | + def _get_region_of_interest(self, frame_index: int) -> utils.Rect: |
52 | 63 | raise NotImplementedError() |
53 | 64 |
|
54 | 65 |
|
55 | 66 |
|
56 | 67 | class SearchRegionFrameCropper(_BaseFrameCropper): |
57 | | - def __init__(self, search_region, inner_transform): |
| 68 | + def __init__(self, search_region: utils.Rect, inner_transform: IFrameTransformer): |
58 | 69 | super().__init__(inner_transform) |
59 | | - self.__search_region = self.__get_intersecting_region(search_region, 0) |
| 70 | + self.__search_region: utils.Rect = self._get_intersecting_region(search_region, 0) |
60 | 71 |
|
61 | 72 |
|
62 | | - def _get_region_of_interest(self, frame_index): |
| 73 | + def _get_region_of_interest(self, frame_index: int) -> utils.Rect: |
63 | 74 | return self.__search_region |
64 | 75 |
|
65 | | - def __get_intersecting_region(self, search_region, frame_index): |
66 | | - frame_rect = utils.Rect.from_corner_and_size(utils.Point(0, 0), self._get_inner_frame_size(frame_index)) |
67 | | - return search_region.intersection(frame_rect) |
68 | | - |
69 | | - |
70 | 76 |
|
71 | 77 | class FeedForwardFrameCropper(_BaseFrameCropper): |
72 | | - def __init__(self, frame_location_map, inner_transform): |
| 78 | + def __init__(self, frame_location_map: Mapping[int, mpf.ImageLocation], |
| 79 | + inner_transform: IFrameTransformer): |
73 | 80 | super().__init__(inner_transform) |
74 | | - self.__fed_forward_detections = [utils.Rect.from_image_location(loc) |
75 | | - for loc in utils.dict_values_ordered_by_key(frame_location_map)] |
| 81 | + self.__fed_forward_detections: List[utils.Rect] = \ |
| 82 | + [self._get_intersecting_region(utils.Rect.from_image_location(loc), idx) |
| 83 | + for idx, loc in utils.dict_items_ordered_by_key(frame_location_map)] |
76 | 84 |
|
77 | 85 |
|
78 | | - def _get_region_of_interest(self, frame_index): |
| 86 | + def _get_region_of_interest(self, frame_index: int) -> utils.Rect: |
79 | 87 | try: |
80 | 88 | return self.__fed_forward_detections[frame_index] |
81 | 89 | except IndexError: |
82 | 90 | raise IndexError( |
83 | | - 'Attempted to get feed forward region of interest for frame: %s, ' |
84 | | - 'but there are only %s entries in the feed forward track.' |
85 | | - % (frame_index, len(self.__fed_forward_detections))) |
| 91 | + f'Attempted to get feed forward region of interest for frame: {frame_index}, ' |
| 92 | + f'but there are only {len(self.__fed_forward_detections)} entries in the ' |
| 93 | + f'feed forward track.') |
0 commit comments