2016-04-11 10 views
1

Ich habe Videos von 2 Kameras aufgezeichnet, so dass ich Zeitstempel für jeden Frame in einer Textdatei für beide Videos Feed aufgenommen.Anzeigen von Frames aus 2 separaten Videos nach Zeitstempel in einer Textdatei gespeichert

Jetzt möchte ich die Bilder von beiden Kameras nebeneinander in einem einzigen Rahmen anzeigen, aber entsprechend der Zeit in der Textdatei gespeichert. Wie soll ich das machen?

Hier ist ein Beispielzeitmarkendaten für Videos von Kamera 1 und Kamera 2

aufgezeichnet
Camera1    Camera2 
0.200000047   0.000000000 
33.515000047  33.315000000 

nun den Zeitstempel-Datei entsprechend, Frame 1 von Kamera 1 bei 0,2 sec sichtbar sein soll, und Bild 1 von Kamera 2 sollte bei 0,0 Sekunden sichtbar sein (Beginn des Videos). Bild 2 von Kamera 2 dann kommt bei 33,315 sek und Bild 2 von Kamera 1 kommt um 33,315000047 sek.

Ich bleibe stecken auf "wie Frames zu bestimmten Zeitpunkt anzeigen?"

+0

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. –

+0

ja, Bild 1 sollte für 33.32s bleiben, bevor das nächste Bild kommt –

+1

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

Antwort

0

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 ] 

camera_1

und 3 Frames für Kamera 2 bei Zeitstempel

[ 2.0, 3.0, 4.0 ] 

enter image description here

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

enter image description here

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)
+0

was genau macht der get_frame (i)? Ich habe versucht, nach meinem Grundverständnis des Codes zu implementieren 'cap = cv2.VideoCapture ('cam1.mp4')' 'cap.set (cv.CV_CAP_PROP_POS_FRAMES, frame_index)' 'ret, frame = cap.read() ' ' Rückkehrrahmen' –