|
7 | 7 | from typing_extensions import Self |
8 | 8 |
|
9 | 9 | from t4_devkit.dataclass import Box2D, Box3D, HomogeneousMatrix, distance_box |
10 | | -from t4_devkit.filtering.parameter import FilterParams |
| 10 | +from t4_devkit.schema import VisibilityLevel |
| 11 | + |
| 12 | +from .parameter import FilterParams |
11 | 13 |
|
12 | 14 | if TYPE_CHECKING: |
13 | 15 | from t4_devkit.dataclass import BoxLike, SemanticLabel |
|
19 | 21 | "FilterByUUID", |
20 | 22 | "FilterByDistance", |
21 | 23 | "FilterByRegion", |
| 24 | + "FilterBySpeed", |
| 25 | + "FilterByNumPoints", |
| 26 | + "FilterByVisibility", |
22 | 27 | "BoxFilterFunction", |
23 | 28 | ] |
24 | 29 |
|
@@ -236,4 +241,36 @@ def __call__(self, box: BoxLike, _tf_matrix: HomogeneousMatrix | None = None) -> |
236 | 241 | return self.min_num_points <= box.num_points |
237 | 242 |
|
238 | 243 |
|
| 244 | +class FilterByVisibility(BaseBoxFilter): |
| 245 | + """A filter that excludes 3D boxes with lower visibility than a specified threshold. |
| 246 | +
|
| 247 | + Boxes with `UNAVAILABLE` visibility are always passed through (i.e., not filtered). |
| 248 | + """ |
| 249 | + |
| 250 | + def __init__(self, visibility: VisibilityLevel = VisibilityLevel.NONE) -> None: |
| 251 | + """ |
| 252 | + Initialize the filter with a visibility threshold. |
| 253 | +
|
| 254 | + Args: |
| 255 | + visibility (VisibilityLevel): The minimum visibility level for a box to pass the filter. |
| 256 | +
|
| 257 | + Raises: |
| 258 | + ValueError: If the given visibility is not comparable (e.g., UNAVAILABLE). |
| 259 | + """ |
| 260 | + super().__init__() |
| 261 | + if not visibility.is_comparable(): |
| 262 | + raise ValueError(f"Comparable visibility must be set as threshold: {visibility}") |
| 263 | + |
| 264 | + self.visibility = visibility |
| 265 | + |
| 266 | + def from_params(cls, params: FilterParams) -> Self: |
| 267 | + return cls(params.visibility) |
| 268 | + |
| 269 | + def __call__(self, box: BoxLike, _tf_matrix: HomogeneousMatrix | None = None) -> bool: |
| 270 | + if not isinstance(box, Box3D): |
| 271 | + return True |
| 272 | + else: |
| 273 | + return self.visibility <= box.visibility if box.visibility.is_comparable() else True |
| 274 | + |
| 275 | + |
239 | 276 | BoxFilterFunction = TypeVar("BoxFilterFunction", bound=BaseBoxFilter) |
0 commit comments