fix(demo): stabilize visualizer bbox and mask rendering
Align bbox coordinate handling across primary and fallback paths, normalize Both-mode raw mask rendering, and tighten demo result typing to reduce runtime/display inconsistencies.
This commit is contained in:
@@ -13,8 +13,11 @@ import cv2
|
||||
import numpy as np
|
||||
from numpy.typing import NDArray
|
||||
|
||||
from .preprocess import BBoxXYXY
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# Window names
|
||||
MAIN_WINDOW = "Scoliosis Detection"
|
||||
SEG_WINDOW = "Segmentation"
|
||||
@@ -66,13 +69,13 @@ class OpenCVVisualizer:
|
||||
def _draw_bbox(
|
||||
self,
|
||||
frame: ImageArray,
|
||||
bbox: tuple[int, int, int, int] | None,
|
||||
bbox: BBoxXYXY | None,
|
||||
) -> None:
|
||||
"""Draw bounding box on frame if present.
|
||||
|
||||
Args:
|
||||
frame: Input frame (H, W, 3) uint8 - modified in place
|
||||
bbox: Bounding box as (x1, y1, x2, y2) or None
|
||||
bbox: Bounding box in XYXY format as (x1, y1, x2, y2) or None
|
||||
"""
|
||||
if bbox is None:
|
||||
return
|
||||
@@ -145,7 +148,7 @@ class OpenCVVisualizer:
|
||||
def _prepare_main_frame(
|
||||
self,
|
||||
frame: ImageArray,
|
||||
bbox: tuple[int, int, int, int] | None,
|
||||
bbox: BBoxXYXY | None,
|
||||
track_id: int,
|
||||
fps: float,
|
||||
label: str | None,
|
||||
@@ -155,7 +158,7 @@ class OpenCVVisualizer:
|
||||
|
||||
Args:
|
||||
frame: Input frame (H, W, C) uint8
|
||||
bbox: Bounding box or None
|
||||
bbox: Bounding box in XYXY format (x1, y1, x2, y2) or None
|
||||
track_id: Tracking ID
|
||||
fps: Current FPS
|
||||
label: Classification label or None
|
||||
@@ -324,6 +327,9 @@ class OpenCVVisualizer:
|
||||
mask_gray = cast(ImageArray, cv2.cvtColor(mask_raw, cv2.COLOR_BGR2GRAY))
|
||||
else:
|
||||
mask_gray = mask_raw
|
||||
# Normalize to uint8 [0,255] for display (handles both float [0,1] and uint8 inputs)
|
||||
if mask_gray.dtype == np.float32 or mask_gray.dtype == np.float64:
|
||||
mask_gray = (mask_gray * 255).astype(np.uint8)
|
||||
raw_gray = cast(
|
||||
ImageArray,
|
||||
cv2.resize(
|
||||
@@ -333,6 +339,7 @@ class OpenCVVisualizer:
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
# Normalized view preparation (without indicator)
|
||||
if silhouette is None:
|
||||
norm_gray = np.zeros((DISPLAY_HEIGHT, DISPLAY_WIDTH), dtype=np.uint8)
|
||||
@@ -402,7 +409,7 @@ class OpenCVVisualizer:
|
||||
def update(
|
||||
self,
|
||||
frame: ImageArray,
|
||||
bbox: tuple[int, int, int, int] | None,
|
||||
bbox: BBoxXYXY | None,
|
||||
track_id: int,
|
||||
mask_raw: ImageArray | None,
|
||||
silhouette: NDArray[np.float32] | None,
|
||||
@@ -414,7 +421,7 @@ class OpenCVVisualizer:
|
||||
|
||||
Args:
|
||||
frame: Input frame (H, W, C) uint8
|
||||
bbox: Bounding box as (x1, y1, x2, y2) or None
|
||||
bbox: Bounding box in XYXY format (x1, y1, x2, y2) or None
|
||||
track_id: Tracking ID
|
||||
mask_raw: Raw binary mask (H, W) uint8 or None
|
||||
silhouette: Normalized silhouette (64, 44) float32 [0,1] or None
|
||||
|
||||
Reference in New Issue
Block a user