mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-07 03:35:26 +03:00
Fix motion region checking logic
This commit is contained in:
parent
7265848f94
commit
5829536884
@ -116,12 +116,13 @@ def get_cluster_region_from_grid(frame_shape, min_region, cluster, boxes, region
|
|||||||
|
|
||||||
def get_region_from_grid(
|
def get_region_from_grid(
|
||||||
frame_shape: tuple[int],
|
frame_shape: tuple[int],
|
||||||
box: list[int],
|
cluster: list[int],
|
||||||
min_region: int,
|
min_region: int,
|
||||||
region_grid: list[list[dict[str, any]]],
|
region_grid: list[list[dict[str, any]]],
|
||||||
) -> list[int]:
|
) -> list[int]:
|
||||||
"""Get a region for a box based on the region grid."""
|
"""Get a region for a box based on the region grid."""
|
||||||
centroid = (box[0] - (box[2] - box[0]), box[1] - (box[3] - box[1]))
|
box = calculate_region(frame_shape, cluster[0], cluster[1], cluster[2], cluster[3], min_region)
|
||||||
|
centroid = (box[0] + (min(frame_shape[1], box[2]) - box[0]) / 2, box[1] + (min(frame_shape[0], box[3]) - box[1]) / 2)
|
||||||
grid_x = int(centroid[0] / frame_shape[1] * len(region_grid))
|
grid_x = int(centroid[0] / frame_shape[1] * len(region_grid))
|
||||||
grid_y = int(centroid[1] / frame_shape[0] * len(region_grid))
|
grid_y = int(centroid[1] / frame_shape[0] * len(region_grid))
|
||||||
|
|
||||||
@ -134,16 +135,16 @@ def get_region_from_grid(
|
|||||||
calc_size = (box[2] - box[0]) / frame_shape[1]
|
calc_size = (box[2] - box[0]) / frame_shape[1]
|
||||||
|
|
||||||
# if region is within expected size, don't resize
|
# if region is within expected size, don't resize
|
||||||
if (cell["mean"] - cell["std_dev"]) < calc_size < (cell["mean"] + cell["std_dev"]):
|
if (cell["mean"] - cell["std_dev"]) <= calc_size <= (cell["mean"] + cell["std_dev"]):
|
||||||
return calculate_region(frame_shape, box[0], box[1], box[2], box[3], min_region)
|
return box
|
||||||
# TODO not sure how to handle case where cluster is larger than expected region
|
# TODO not sure how to handle case where cluster is larger than expected region
|
||||||
elif calc_size > (cell["mean"] + cell["std_dev"]):
|
elif calc_size > (cell["mean"] + cell["std_dev"]):
|
||||||
return calculate_region(frame_shape, box[0], box[1], box[2], box[3], min_region)
|
return box
|
||||||
|
|
||||||
size = cell["mean"] * frame_shape[1]
|
size = cell["mean"] * frame_shape[1]
|
||||||
|
|
||||||
# get region based on grid size
|
# get region based on grid size
|
||||||
new = calculate_region(
|
return calculate_region(
|
||||||
frame_shape,
|
frame_shape,
|
||||||
max(0, centroid[0] - size / 2),
|
max(0, centroid[0] - size / 2),
|
||||||
max(0, centroid[1] - size / 2),
|
max(0, centroid[1] - size / 2),
|
||||||
@ -151,7 +152,6 @@ def get_region_from_grid(
|
|||||||
min(frame_shape[0], centroid[1] + size / 2),
|
min(frame_shape[0], centroid[1] + size / 2),
|
||||||
min_region,
|
min_region,
|
||||||
)
|
)
|
||||||
return new
|
|
||||||
|
|
||||||
|
|
||||||
def is_object_filtered(obj, objects_to_track, object_filters):
|
def is_object_filtered(obj, objects_to_track, object_filters):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user