comparison scripts/display-synced-trajectories.py @ 838:2918de3d40fc

first working version of display of merged tracking
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 06 Jul 2016 12:30:08 -0400
parents e01cabca4c55
children 2c7b4e6a32dd
comparison
equal deleted inserted replaced
837:e01cabca4c55 838:2918de3d40fc
13 parser.add_argument('-d', dest = 'databaseFilename', help = 'name of the Sqlite database file', required = True) 13 parser.add_argument('-d', dest = 'databaseFilename', help = 'name of the Sqlite database file', required = True)
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) 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)
15 parser.add_argument('-t', dest = 'trajectoryType', help = 'type of trajectories to display', choices = ['feature', 'object'], default = 'object') 15 parser.add_argument('-t', dest = 'trajectoryType', help = 'type of trajectories to display', choices = ['feature', 'object'], default = 'object')
16 parser.add_argument('-r', dest = 'rescale', help = 'rescaling factor for the displayed image', default = 1., type = float) 16 parser.add_argument('-r', dest = 'rescale', help = 'rescaling factor for the displayed image', default = 1., type = float)
17 parser.add_argument('-s', dest = 'step', help = 'display every s image', default = 1, type = int) 17 parser.add_argument('-s', dest = 'step', help = 'display every s image', default = 1, type = int)
18 parser.add_argument('-u', dest = 'undistort', help = 'undistort the video (because features have been extracted that way)', action = 'store_true')
18 19
19 args = parser.parse_args() 20 args = parser.parse_args()
20 21
21 session = createDatabase(args.metadataFilename) 22 session = createDatabase(args.metadataFilename)
22 23
25 print('Video sequence {} was not found in {}. Exiting'.format(args.databaseFilename, args.metadataFilename)) 26 print('Video sequence {} was not found in {}. Exiting'.format(args.databaseFilename, args.metadataFilename))
26 sys.exit() 27 sys.exit()
27 28
28 dirname = os.path.split(args.metadataFilename)[0] 29 dirname = os.path.split(args.metadataFilename)[0]
29 30
31 frameRate = mergedSequence.cameraView.cameraType.frameRate
30 startTime = datetime.strptime(args.startTime, utils.datetimeFormat) 32 startTime = datetime.strptime(args.startTime, utils.datetimeFormat)
31 if startTime > mergedSequence.startTime: 33 mergedFirstFrameNum = utils.deltaFrames(mergedSequence.startTime, startTime, frameRate)
32 mergedFirstFrameNum = (startTime-mergedSequence.startTime).seconds*mergedSequence.cameraView.cameraType.frameRate
33 34
34 cameraViews = session.query(CameraView).filter(CameraView.site == mergedSequence.cameraView.site).filter(CameraView.virtual == False).all() 35 cameraViews = session.query(CameraView).filter(CameraView.site == mergedSequence.cameraView.site).filter(CameraView.virtual == False).all()
35 videoSequences = session.query(VideoSequence).filter(VideoSequence.virtual == False).filter(VideoSequence.startTime <= startTime).all() 36 videoSequences = session.query(VideoSequence).filter(VideoSequence.virtual == False).all()
36 #videoSequences.remove(mergedSequence) 37 #videoSequences.remove(mergedSequence)
37 videoSequences = [v for v in videoSequences if v.cameraView in cameraViews and v.containsInstant(startTime)] 38 videoSequences = [v for v in videoSequences if v.cameraView in cameraViews and (v.containsInstant(startTime) or v.startTime > startTime)]
38 filenames = [dirname+os.path.sep+v.getVideoSequenceFilename() for v in videoSequences] 39 filenames = [dirname+os.path.sep+v.getVideoSequenceFilename() for v in videoSequences]
39 firstFrameNums = [v.getFrameNum(startTime) for v in videoSequences] 40 firstFrameNums = [utils.deltaFrames(v.startTime, startTime, frameRate) for v in videoSequences] # use pos/neg first frame nums
40 windowNames = [v.cameraView.description for v in videoSequences] 41 windowNames = [v.cameraView.description for v in videoSequences]
41 homographies = [np.inv(np.loadtxt(dirname+os.path.sep+v.cameraView.getHomographyFilename())) for v in videoSequences] 42
43 # homography and undistort
44 homographies = [np.linalg.inv(np.loadtxt(dirname+os.path.sep+v.cameraView.getHomographyFilename())) for v in videoSequences]
45 if args.undistort:
46 cameraTypes = set([cv.cameraType for cv in cameraViews])
47 for cameraType in cameraTypes:
48 cameraType.computeUndistortMaps()
42 49
43 objects = storage.loadTrajectoriesFromSqlite(dirname+os.path.sep+mergedSequence.getDatabaseFilename(), args.trajectoryType) 50 objects = storage.loadTrajectoriesFromSqlite(dirname+os.path.sep+mergedSequence.getDatabaseFilename(), args.trajectoryType)
51 for obj in objects:
52 obj.projectedPositions = {}
44 53
45 #def playVideo(filenames, windowNames = None, firstFrameNums = None, frameRate = -1, interactive = False, printFrames = True, text = None, rescale = 1., step = 1): 54 #def playVideo(filenames, windowNames = None, firstFrameNums = None, frameRate = -1, interactive = False, printFrames = True, text = None, rescale = 1., step = 1):
46 if len(filenames) == 0: 55 if len(filenames) == 0:
47 print('Empty filename list') 56 print('Empty filename list')
48 sys.exit() 57 sys.exit()
62 captures = [cv2.VideoCapture(fn) for fn in filenames] 71 captures = [cv2.VideoCapture(fn) for fn in filenames]
63 if np.array([cap.isOpened() for cap in captures]).all(): 72 if np.array([cap.isOpened() for cap in captures]).all():
64 key = -1 73 key = -1
65 ret = True 74 ret = True
66 nFramesShown = 0 75 nFramesShown = 0
67 if firstFrameNums is not None: 76 for i in xrange(len(captures)):
68 for i in xrange(len(captures)): 77 if firstFrameNums[i] > 0:
69 captures[i].set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNums[i]) 78 captures[i].set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNums[i])
70 while ret and not cvutils.quitKey(key): 79 while ret and not cvutils.quitKey(key):
71 rets = [] 80 rets = []
72 images = [] 81 images = []
73 for cap in captures: 82 for i in xrange(len(captures)):
74 ret, img = cap.read() 83 if firstFrameNums[i]+nFramesShown>=0:
75 rets.append(ret) 84 ret, img = captures[i].read()
76 images.append(img) 85 if ret and args.undistort:
77 if np.array(rets).all(): 86 img = cv2.remap(img, videoSequences[i].cameraView.cameraType.map1, videoSequences[i].cameraView.cameraType.map2, interpolation=cv2.INTER_LINEAR)
87 rets.append(ret)
88 images.append(img)
89 else:
90 rets.append(False)
91 images.append(None)
92 if np.array(rets).any():
78 #if printFrames: 93 #if printFrames:
79 print('frame shown {0}'.format(nFramesShown)) 94 print('frame shown {0}'.format(nFramesShown))
80 for i in xrange(len(filenames)): 95 for i in xrange(len(filenames)):
81 for obj in objects: 96 if rets[i]:#firstFrameNums[i]+nFramesShown>=0:
82 97 for obj in objects:
83 if obj.existsAtInstant(): 98 if obj.existsAtInstant(mergedFirstFrameNum+nFramesShown):
84 99 #print obj.num, obj.timeInterval, mergedFirstFrameNum, nFramesShown
100 if i not in obj.projectedPositions:
101 if homographies[i] is not None:
102 obj.projectedPositions[i] = obj.positions.project(homographies[i])
103 else:
104 obj.projectedPositions[i] = obj.positions
105 cvutils.cvPlot(images[i], obj.projectedPositions[i], cvutils.cvColors[obj.getNum()], int(mergedFirstFrameNum+nFramesShown)-obj.getFirstInstant())
106
85 #if text is not None: 107 #if text is not None:
86 # cv2.putText(images[i], text, (10,50), cv2.FONT_HERSHEY_PLAIN, 1, cvRed) 108 # cv2.putText(images[i], text, (10,50), cv2.FONT_HERSHEY_PLAIN, 1, cvRed)
87 cvutils.cvImshow(windowNames[i], images[i], rescale) # cv2.imshow('frame', img) 109 cvutils.cvImshow(windowNames[i], images[i], rescale) # cv2.imshow('frame', img)
88 key = cv2.waitKey(wait) 110 key = cv2.waitKey(wait)
89 #if cvutils.saveKey(key): 111 #if cvutils.saveKey(key):
90 # cv2.imwrite('image-{}.png'.format(frameNum), img) 112 # cv2.imwrite('image-{}.png'.format(frameNum), img)
91 nFramesShown += step 113 nFramesShown += step
92 if step > 1: 114 if step > 1: