changeset 832:02f2809c2f66

work in progress on synced trajectory display
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 29 Jun 2016 17:57:21 -0400
parents a8ff35e6fb43
children 8d1dd771aeb3
files scripts/display-synced-trajectories.py
diffstat 1 files changed, 94 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/display-synced-trajectories.py	Wed Jun 29 17:57:21 2016 -0400
@@ -0,0 +1,94 @@
+#! /usr/bin/env python
+
+import sys, argparse, os.path
+from datetime import datetime, timedelta
+from numpy import array
+import cv2
+import cvutils, utils, storage
+from metadata import createDatabase, Site, VideoSequence
+
+parser = argparse.ArgumentParser(description='The program displays several views of the same site synchronously.')
+parser.add_argument('-i', dest = 'metadataFilename', help = 'name of the metadata file', required = True)
+#parser.add_argument('-n', dest = 'siteId', help = 'site id or site name', required = True)
+parser.add_argument('-d', dest = 'databaseFilename', help = 'name of the Sqlite database file', required = True)
+parser.add_argument('-f', dest = 'startTime', help = 'time to start playing (format %Y-%m-%d %H:%M:%S, eg 2011-06-22 10:00:39)', required = True)
+parser.add_argument('-t', dest = 'trajectoryType', help = 'type of trajectories to display', choices = ['feature', 'object'], default = 'object')
+parser.add_argument('-r', dest = 'rescale', help = 'rescaling factor for the displayed image', default = 1., type = float)
+parser.add_argument('-s', dest = 'step', help = 'display every s image', default = 1, type = int)
+
+args = parser.parse_args()
+
+session = createDatabase(args.metadataFilename)
+
+mergedSequence = session.query(VideoSequence).filter(VideoSequence.databaseFilename == args.databaseFilename).first()
+if mergedSequence is None:
+    print('Video sequence {} was not found in {}. Exiting'.format(args.databaseFilename, args.metadataFilename))
+    sys.exit()
+
+dirname = os.path.split(args.metadataFilename)[0]
+
+startTime = datetime.strptime(args.startTime, utils.datetimeFormat)
+# TODO issue with framerate
+if startTime > mergedSequence.startTime:
+    mergedFirstFrameNum = (startTime-mergedSequence.startTime).seconds*
+
+videoSequences = session.query(VideoSequence).filter(VideoSequence.site == mergedSequence.site).filter(VideoSequence.startTime <= startTime).all()
+videoSequences.remove(mergedSequence)
+videoSequences = [v for v in videoSequences if v.containsInstant(startTime)]
+filenames = [dirname+os.path.sep+v.getVideoSequenceFilename() for v in videoSequences]
+firstFrameNums = [v.getFrameNum(startTime) for v in videoSequences]
+windowNames = [v.cameraView.description for v in videoSequences]
+
+objects = storage.loadTrajectoriesFromSqlite(dirname+os.path.sep+mergedSequence.getDatabaseFilename(), args.trajectoryType)
+
+#def playVideo(filenames, windowNames = None, firstFrameNums = None, frameRate = -1, interactive = False, printFrames = True, text = None, rescale = 1., step = 1):
+if len(filenames) == 0:
+    print('Empty filename list')
+    sys.exit()
+
+if windowNames is None:
+    windowNames = ['frame{}'.format(i) for i in xrange(len(filenames))]
+#wait = 5
+#if rescale == 1.:
+for windowName in windowNames:
+    cv2.namedWindow(windowName, cv2.WINDOW_NORMAL)
+#if frameRate > 0:
+#    wait = int(round(1000./frameRate))
+#if interactive:
+wait = 0
+step = 1
+rescale = 1.
+captures = [cv2.VideoCapture(fn) for fn in filenames]
+if array([cap.isOpened() for cap in captures]).all():
+    key = -1
+    ret = True
+    nFramesShown = 0
+    if firstFrameNums is not None:
+        for i in xrange(len(captures)):
+            captures[i].set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNums[i])
+    while ret and not cvutils.quitKey(key):
+        rets = []
+        images = []
+        for cap in captures:
+            ret, img = cap.read()
+            rets.append(ret)
+            images.append(img)
+        if array(rets).all():
+            #if printFrames:
+            print('frame shown {0}'.format(nFramesShown))
+            for i in xrange(len(filenames)):
+                for obj in objects:
+                    if obj.existsAtInstant():
+                #if text is not None:
+                #    cv2.putText(images[i], text, (10,50), cv2.FONT_HERSHEY_PLAIN, 1, cvRed)
+                cvutils.cvImshow(windowNames[i], images[i], rescale) # cv2.imshow('frame', img)
+            key = cv2.waitKey(wait)
+            #if cvutils.saveKey(key):
+            #    cv2.imwrite('image-{}.png'.format(frameNum), img)
+            nFramesShown += step
+            if step > 1:
+                for i in xrange(len(captures)):
+                    captures.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNums[i]+nFramesShown)
+    cv2.destroyAllWindows()
+else:
+    print('Video captures for {} failed'.format(filenames))