Switch to LIVE_STREAM mode for real-time async inference

This commit is contained in:
2026-06-02 09:40:22 +08:00
parent be4a691fb5
commit a4b62d930b
+19 -2
View File
@@ -1,5 +1,6 @@
from __future__ import annotations
import threading
from dataclasses import dataclass
from enum import Enum
from pathlib import Path
@@ -106,9 +107,19 @@ class DeadBugDetector:
self.extension_confirm_frames = extension_confirm_frames
self.reset_confirm_frames = reset_confirm_frames
self._latest_result = None
self._result_lock = threading.Lock()
self._result_event = threading.Event()
def on_result(pose_result, _image, _timestamp_ms):
with self._result_lock:
self._latest_result = pose_result
self._result_event.set()
options = PoseLandmarkerOptions(
base_options=BaseOptions(model_asset_path=self.model_path),
running_mode=VisionRunningMode.VIDEO,
running_mode=VisionRunningMode.LIVE_STREAM,
result_callback=on_result,
num_poses=1,
min_pose_detection_confidence=0.5,
min_pose_presence_confidence=0.5,
@@ -131,7 +142,13 @@ class DeadBugDetector:
timestamp_ms = self._normalize_timestamp(timestamp_ms)
rgb_frame = cv2.cvtColor(bgr_frame, cv2.COLOR_BGR2RGB)
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=rgb_frame)
pose_result = self._landmarker.detect_for_video(mp_image, timestamp_ms)
self._result_event.clear()
self._landmarker.detect_async(mp_image, timestamp_ms)
self._result_event.wait(timeout=0.1)
with self._result_lock:
pose_result = self._latest_result
annotated = bgr_frame.copy()
if not pose_result.pose_landmarks: