Fix camera capture reliability and rewrite tracking for available mediapipe/hardware
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
"""
|
||||
Multi-camera concurrent streaming stress test - threaded version.
|
||||
|
||||
Same as Multi_Camera_Stream_Test.py, but reads each camera on its own thread
|
||||
instead of round-robining on a single thread, so cameras aren't serialized
|
||||
against each other. This is closer to what real-time hand tracking (reading
|
||||
every camera every frame, then sending over UDP) will actually look like.
|
||||
|
||||
Run standalone, no Qt/app required:
|
||||
python Multi_Camera_Stream_Test_Threaded.py
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
import threading
|
||||
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
|
||||
|
||||
from Tbd.helper import CameraObject
|
||||
|
||||
CAM_INDICES = [1, 2, 3, 4, 5, 6]
|
||||
TEST_DURATION_SECONDS = 15
|
||||
WIDTH = 1920
|
||||
HEIGHT = 1080
|
||||
|
||||
|
||||
def stream_camera(cam: CameraObject, stop_event: threading.Event, results: dict):
|
||||
successes = 0
|
||||
failures = 0
|
||||
|
||||
while not stop_event.is_set():
|
||||
ok, frame = cam.capture.read()
|
||||
if ok and frame is not None:
|
||||
successes += 1
|
||||
else:
|
||||
failures += 1
|
||||
|
||||
results[cam.index] = (successes, failures)
|
||||
|
||||
|
||||
def main():
|
||||
cameras = []
|
||||
|
||||
print("Opening cameras...")
|
||||
for index in CAM_INDICES:
|
||||
cam = CameraObject(capture=None, index=index)
|
||||
ok = cam.open(width=WIDTH, height=HEIGHT)
|
||||
print(f"cam{index}: {'opened' if ok else 'FAILED TO OPEN'}")
|
||||
if ok:
|
||||
cameras.append(cam)
|
||||
|
||||
if not cameras:
|
||||
print("No cameras opened, aborting.")
|
||||
return
|
||||
|
||||
print(f"\n{len(cameras)}/{len(CAM_INDICES)} cameras opened. Streaming (threaded) for {TEST_DURATION_SECONDS}s...\n")
|
||||
|
||||
stop_event = threading.Event()
|
||||
results = {}
|
||||
threads = [
|
||||
threading.Thread(target=stream_camera, args=(cam, stop_event, results), daemon=True)
|
||||
for cam in cameras
|
||||
]
|
||||
|
||||
start = time.time()
|
||||
for t in threads:
|
||||
t.start()
|
||||
|
||||
time.sleep(TEST_DURATION_SECONDS)
|
||||
stop_event.set()
|
||||
for t in threads:
|
||||
t.join()
|
||||
elapsed = time.time() - start
|
||||
|
||||
print("=" * 50)
|
||||
print(f"Results after {elapsed:.1f}s:")
|
||||
for cam in cameras:
|
||||
successes, failures = results.get(cam.index, (0, 0))
|
||||
total = successes + failures
|
||||
rate = successes / total * 100 if total else 0
|
||||
fps = successes / elapsed
|
||||
print(f"cam{cam.index}: {successes} ok / {failures} failed "
|
||||
f"({rate:.1f}% success, ~{fps:.1f} fps)")
|
||||
print("=" * 50)
|
||||
|
||||
for cam in cameras:
|
||||
cam.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user