Mercurial Hosting > traffic-intelligence
annotate scripts/display-synced-trajectories.py @ 834:119c4efe6398
added option to load subsampled trajectories
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Thu, 30 Jun 2016 14:19:59 -0400 |
parents | 02f2809c2f66 |
children | 7058a40a4bbc |
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 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
5 from numpy import array |
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 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
8 from metadata import createDatabase, Site, VideoSequence |
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 # TODO issue with framerate |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
32 if startTime > mergedSequence.startTime: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
33 mergedFirstFrameNum = (startTime-mergedSequence.startTime).seconds* |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
34 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
35 videoSequences = session.query(VideoSequence).filter(VideoSequence.site == mergedSequence.site).filter(VideoSequence.startTime <= startTime).all() |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
36 videoSequences.remove(mergedSequence) |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
37 videoSequences = [v for v in videoSequences if v.containsInstant(startTime)] |
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] |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
41 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
42 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
|
43 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
44 #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
|
45 if len(filenames) == 0: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
46 print('Empty filename list') |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
47 sys.exit() |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
48 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
49 if windowNames is None: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
50 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
|
51 #wait = 5 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
52 #if rescale == 1.: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
53 for windowName in windowNames: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
54 cv2.namedWindow(windowName, cv2.WINDOW_NORMAL) |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
55 #if frameRate > 0: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
56 # wait = int(round(1000./frameRate)) |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
57 #if interactive: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
58 wait = 0 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
59 step = 1 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
60 rescale = 1. |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
61 captures = [cv2.VideoCapture(fn) for fn in filenames] |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
62 if array([cap.isOpened() for cap in captures]).all(): |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
63 key = -1 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
64 ret = True |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
65 nFramesShown = 0 |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
66 if firstFrameNums is not None: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
67 for i in xrange(len(captures)): |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
68 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
|
69 while ret and not cvutils.quitKey(key): |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
70 rets = [] |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
71 images = [] |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
72 for cap in captures: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
73 ret, img = cap.read() |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
74 rets.append(ret) |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
75 images.append(img) |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
76 if array(rets).all(): |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
77 #if printFrames: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
78 print('frame shown {0}'.format(nFramesShown)) |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
79 for i in xrange(len(filenames)): |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
80 for obj in objects: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
81 if obj.existsAtInstant(): |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
82 #if text is not None: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
83 # cv2.putText(images[i], text, (10,50), cv2.FONT_HERSHEY_PLAIN, 1, cvRed) |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
84 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
|
85 key = cv2.waitKey(wait) |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
86 #if cvutils.saveKey(key): |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
87 # cv2.imwrite('image-{}.png'.format(frameNum), img) |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
88 nFramesShown += step |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
89 if step > 1: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
90 for i in xrange(len(captures)): |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
91 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
|
92 cv2.destroyAllWindows() |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
93 else: |
02f2809c2f66
work in progress on synced trajectory display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
94 print('Video captures for {} failed'.format(filenames)) |