annotate scripts/display-synced-trajectories.py @ 837:e01cabca4c55

minor modifications to merge-features
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 06 Jul 2016 10:58:18 -0400
parents 7058a40a4bbc
children 2918de3d40fc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
832
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
1 #! /usr/bin/env python
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
2
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
3 import sys, argparse, os.path
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
4 from datetime import datetime, timedelta
837
e01cabca4c55 minor modifications to merge-features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
5 import numpy as np
832
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
6 import cv2
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
7 import cvutils, utils, storage
837
e01cabca4c55 minor modifications to merge-features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
8 from metadata import createDatabase, Site, CameraView, VideoSequence
832
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
9
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
10 parser = argparse.ArgumentParser(description='The program displays several views of the same site synchronously.')
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
11 parser.add_argument('-i', dest = 'metadataFilename', help = 'name of the metadata file', required = True)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
12 #parser.add_argument('-n', dest = 'siteId', help = 'site id or site name', required = True)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
13 parser.add_argument('-d', dest = 'databaseFilename', help = 'name of the Sqlite database file', required = True)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
14 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)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
15 parser.add_argument('-t', dest = 'trajectoryType', help = 'type of trajectories to display', choices = ['feature', 'object'], default = 'object')
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
16 parser.add_argument('-r', dest = 'rescale', help = 'rescaling factor for the displayed image', default = 1., type = float)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
17 parser.add_argument('-s', dest = 'step', help = 'display every s image', default = 1, type = int)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
18
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
19 args = parser.parse_args()
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
20
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
21 session = createDatabase(args.metadataFilename)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
22
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
23 mergedSequence = session.query(VideoSequence).filter(VideoSequence.databaseFilename == args.databaseFilename).first()
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
24 if mergedSequence is None:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
25 print('Video sequence {} was not found in {}. Exiting'.format(args.databaseFilename, args.metadataFilename))
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
26 sys.exit()
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
27
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
28 dirname = os.path.split(args.metadataFilename)[0]
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
29
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
30 startTime = datetime.strptime(args.startTime, utils.datetimeFormat)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
31 if startTime > mergedSequence.startTime:
836
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 832
diff changeset
32 mergedFirstFrameNum = (startTime-mergedSequence.startTime).seconds*mergedSequence.cameraView.cameraType.frameRate
832
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
33
837
e01cabca4c55 minor modifications to merge-features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
34 cameraViews = session.query(CameraView).filter(CameraView.site == mergedSequence.cameraView.site).filter(CameraView.virtual == False).all()
836
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 832
diff changeset
35 videoSequences = session.query(VideoSequence).filter(VideoSequence.virtual == False).filter(VideoSequence.startTime <= startTime).all()
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 832
diff changeset
36 #videoSequences.remove(mergedSequence)
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 832
diff changeset
37 videoSequences = [v for v in videoSequences if v.cameraView in cameraViews and v.containsInstant(startTime)]
832
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
38 filenames = [dirname+os.path.sep+v.getVideoSequenceFilename() for v in videoSequences]
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
39 firstFrameNums = [v.getFrameNum(startTime) for v in videoSequences]
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
40 windowNames = [v.cameraView.description for v in videoSequences]
837
e01cabca4c55 minor modifications to merge-features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
41 homographies = [np.inv(np.loadtxt(dirname+os.path.sep+v.cameraView.getHomographyFilename())) for v in videoSequences]
832
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
42
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
43 objects = storage.loadTrajectoriesFromSqlite(dirname+os.path.sep+mergedSequence.getDatabaseFilename(), args.trajectoryType)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
44
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
45 #def playVideo(filenames, windowNames = None, firstFrameNums = None, frameRate = -1, interactive = False, printFrames = True, text = None, rescale = 1., step = 1):
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
46 if len(filenames) == 0:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
47 print('Empty filename list')
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
48 sys.exit()
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
49
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
50 if windowNames is None:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
51 windowNames = ['frame{}'.format(i) for i in xrange(len(filenames))]
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
52 #wait = 5
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
53 #if rescale == 1.:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
54 for windowName in windowNames:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
55 cv2.namedWindow(windowName, cv2.WINDOW_NORMAL)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
56 #if frameRate > 0:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
57 # wait = int(round(1000./frameRate))
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
58 #if interactive:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
59 wait = 0
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
60 step = 1
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
61 rescale = 1.
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
62 captures = [cv2.VideoCapture(fn) for fn in filenames]
837
e01cabca4c55 minor modifications to merge-features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
63 if np.array([cap.isOpened() for cap in captures]).all():
832
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
64 key = -1
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
65 ret = True
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
66 nFramesShown = 0
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
67 if firstFrameNums is not None:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
68 for i in xrange(len(captures)):
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
69 captures[i].set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNums[i])
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
70 while ret and not cvutils.quitKey(key):
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
71 rets = []
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
72 images = []
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
73 for cap in captures:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
74 ret, img = cap.read()
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
75 rets.append(ret)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
76 images.append(img)
837
e01cabca4c55 minor modifications to merge-features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
77 if np.array(rets).all():
832
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
78 #if printFrames:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
79 print('frame shown {0}'.format(nFramesShown))
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
80 for i in xrange(len(filenames)):
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
81 for obj in objects:
837
e01cabca4c55 minor modifications to merge-features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
82
832
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
83 if obj.existsAtInstant():
837
e01cabca4c55 minor modifications to merge-features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
84
e01cabca4c55 minor modifications to merge-features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
85 #if text is not None:
e01cabca4c55 minor modifications to merge-features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
86 # cv2.putText(images[i], text, (10,50), cv2.FONT_HERSHEY_PLAIN, 1, cvRed)
832
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
87 cvutils.cvImshow(windowNames[i], images[i], rescale) # cv2.imshow('frame', img)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
88 key = cv2.waitKey(wait)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
89 #if cvutils.saveKey(key):
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
90 # cv2.imwrite('image-{}.png'.format(frameNum), img)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
91 nFramesShown += step
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
92 if step > 1:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
93 for i in xrange(len(captures)):
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
94 captures.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNums[i]+nFramesShown)
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
95 cv2.destroyAllWindows()
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
96 else:
02f2809c2f66 work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
97 print('Video captures for {} failed'.format(filenames))