77 lines
2.2 KiB
Python
77 lines
2.2 KiB
Python
"""
|
|
Multi-camera concurrent streaming stress test.
|
|
|
|
What it does:
|
|
- Opens all cameras in CAM_INDICES simultaneously via CameraObject.open() (MSMF)
|
|
- Continuously reads frames from all of them in a round-robin loop for TEST_DURATION_SECONDS
|
|
- Tallies successful vs failed grabs per camera
|
|
- Prints a summary so we know whether this hardware/USB topology can sustain
|
|
continuous simultaneous streaming from all cameras, which is what real-time
|
|
hand tracking (sending data to Unreal over UDP every frame) will need.
|
|
|
|
Run standalone, no Qt/app required:
|
|
python Multi_Camera_Stream_Test.py
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import time
|
|
|
|
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 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 for {TEST_DURATION_SECONDS}s...\n")
|
|
|
|
successes = {cam.index: 0 for cam in cameras}
|
|
failures = {cam.index: 0 for cam in cameras}
|
|
|
|
start = time.time()
|
|
while time.time() - start < TEST_DURATION_SECONDS:
|
|
for cam in cameras:
|
|
ok, frame = cam.capture.read()
|
|
if ok and frame is not None:
|
|
successes[cam.index] += 1
|
|
else:
|
|
failures[cam.index] += 1
|
|
|
|
elapsed = time.time() - start
|
|
|
|
print("=" * 50)
|
|
print(f"Results after {elapsed:.1f}s:")
|
|
for cam in cameras:
|
|
total = successes[cam.index] + failures[cam.index]
|
|
rate = successes[cam.index] / total * 100 if total else 0
|
|
fps = successes[cam.index] / elapsed
|
|
print(f"cam{cam.index}: {successes[cam.index]} ok / {failures[cam.index]} failed "
|
|
f"({rate:.1f}% success, ~{fps:.1f} fps)")
|
|
print("=" * 50)
|
|
|
|
for cam in cameras:
|
|
cam.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|