So etwas wie dieser Entwurf sollte die Arbeit machen:
import cv2
import numpy as np
import time
# ...
CAMERA_1 = 0
CAMERA_2 = 1
def load_timestamps(camera):
pass # Implement this
def get_next_frame(camera):
pass # Implement this
# ...
timestamps = [
load_timestamps(CAMERA_1)
, load_timestamps(CAMERA_2)
]
start_time = None
frame_index = [0, 0]
video_done = [False, False]
# Make those default blank images the size of your video...
# Adjust number of channels if you're using grayscale
image = [np.zeros((100,100,3),np.uint8)] * 2
while True:
real_time = time.time()
if start_time is None: # First iteration only
start_time = real_time
current_ts = real_time - start_time
print("ts=%0.3f s" % current_ts)
# Advance both cameras up to current_ts
for i in [CAMERA_1, CAMERA_2]:
while True:
# Get timestamp of the frame at current position
current_index = frame_index[i]
if current_index >= len(timestamps[i]):
video_done[i] = True
break # End of the video
video_ts = timestamps[i][current_index]
if current_ts < video_ts:
break # The frame is in future, stop
# The frame is in the past or present
print(" camera %d: frame %d" % (i+1, frame_index[i]))
image[i] = get_next_frame(i)
frame_index[i] += 1
cv2.imshow("Output", np.hstack([image[0], image[1]]))
cv2.waitKey(20) # Max 50 FPS, but probably slower
if video_done[CAMERA_1] and video_done[CAMERA_2]:
break
Wir haben eine Schleife, die regelmäßig läuft (alle 20 ms etwa, in cv2.waitKey(...)
den Schlaf verwenden).
Bei jeder Iteration messen wir den Zeitversatz von der ersten Iteration, was uns einen 0-basierten Zeitstempel gibt.
Dann "suchen" wir jedes Video, indem wir die Frames lesen und den Index auf unsere Timestamp-Liste setzen, bis beide Videos aufgehört haben.
Schließlich zeigen wir die neuesten Bilder von jedem Video nebeneinander an.
Beispiel
wir uns vor, wir haben 3 Frames für Kamera 1 bei Zeitstempel
[ 1.0, 3.0, 5.0 ]
und 3 Frames für Kamera 2 bei Zeitstempel
[ 2.0, 3.0, 4.0 ]
Wir setzen die Wartezeit 0,5 Sekunden, um diese kurz zu halten.
das Programm Tracing wir folgende Ausgabe:
ts=0.000 s
ts=0.500 s
ts=1.000 s
camera 1: frame 0
ts=1.500 s
ts=2.000 s
camera 2: frame 0
ts=2.500 s
ts=3.000 s
camera 1: frame 1
camera 2: frame 1
ts=3.500 s
ts=4.000 s
camera 2: frame 2
ts=4.500 s
ts=5.000 s
camera 1: frame 2
und das Video, mit jedem Schritt Schnappschüsse sieht aus wie
Hinweis: Erster Rahmen bei t = 0,0 s und letztes Bild bei t = 5.0s.
Mögliche Verbesserungen
- Wenn es eine längere Lücke zwischen Frames, warten länger
- Nur Anzeige aktualisieren, wenn mindestens eines der Bilder/Rahmen Indizes ändert
- Warten auf Timer-Ereignis statt zu schlafen (würde höchstwahrscheinlich benutzerdefinierte GUI benötigen)
Ich verstehe Sie richtig, dass Sie sie wieder spielen möchten in Echtzeit"? Wie in, ~ 33,32 s Echtzeit sollte vergehen, bevor das zweite Bild der Kamera 1 angezeigt wird. –
ja, Bild 1 sollte für 33.32s bleiben, bevor das nächste Bild kommt –
sortiere die Zeitstempel und aktualisiere nur das nächste Bild (das der anderen Kamera wird nicht aktualisiert) wenn dein Rendering schnell genug ist. Verwenden Sie keine festen Rendering-Timestamps und wählen Sie die letzten Frames (oder die nächsten in der Zukunft) der beiden Kameras. – Micka