Mercurial Hosting > traffic-intelligence
changeset 203:e2f31813ade6
added code to display trajectories on videa
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Tue, 06 Mar 2012 18:10:19 -0500 |
parents | b0b964ba9489 |
children | 966c2cd2bd9f |
files | python/cvutils.py python/moving.py python/storage.py |
diffstat | 3 files changed, 60 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/python/cvutils.py Mon Mar 05 02:55:19 2012 -0500 +++ b/python/cvutils.py Tue Mar 06 18:10:19 2012 -0500 @@ -85,12 +85,19 @@ cvmat[i,j] = a[i,j] return cvmat + def draw(img, positions, color, lastCoordinate = None): + last = lastCoordinate+1 + if lastCoordinate != None and lastCoordinate >=0: + last = min(positions.length()-1, lastCoordinate) + for i in range(0, last-1): + cv2.line(img, positions[i].astuple(), positions[i+1].astuple(), color) + def playVideo(filename): '''Plays the video''' capture = cv2.VideoCapture(filename) if capture.isOpened(): key = -1 - while key!= 1048689: # 'q' + while key!= 113: # 'q' ret, img = capture.read() if ret: cv2.imshow('frame', img) @@ -110,6 +117,26 @@ images.append(img) return images + def displayTrajectories(videoFilename, objects, homography = None): + '''Displays the objects overlaid frame by frame over the video ''' + capture = cv2.VideoCapture(videoFilename) + if capture.isOpened(): + key = -1 + frameNum = 1 + while key!= 113: # 'q' + ret, img = capture.read() + if ret: + print(frameNum) + for obj in objects: + if obj.existsAtInstant(frameNum): + #obj.getTimeInterval() + if homography != None and obj.getFirstInstant() == frameNum: + obj.projectedPositions = obj.positions.project(homography) + draw(img, obj.projectedPositions, cvRed, frameNum-obj.getFirstInstant()) + cv2.imshow('frame', img) + key = cv2.waitKey(50) + frameNum += 1 + def printCvMat(cvmat, out = stdout): '''Prints the cvmat to out''' for i in xrange(cvmat.rows):
--- a/python/moving.py Mon Mar 05 02:55:19 2012 -0500 +++ b/python/moving.py Tue Mar 06 18:10:19 2012 -0500 @@ -153,6 +153,9 @@ def aslist(self): return [self.x, self.y] + def astuple(self): + return (self.x, self.y) + def project(self, homography): from numpy.core.multiarray import array projected = cvutils.projectArray(homography, array([[self.x], [self.y]])) @@ -257,7 +260,7 @@ the class is iterable.''' def __init__(self, positions=None): - if positions: + if positions != None: self.positions = positions else: self.positions = [[],[]] @@ -287,6 +290,9 @@ self.iterInstantNum += 1 return self[self.iterInstantNum-1] + def length(self): + return len(self.positions[0]) + def addPositionXY(self, x, y): self.positions[0].append(x) self.positions[1].append(y) @@ -295,24 +301,32 @@ self.addPositionXY(p.x, p.y) @staticmethod - def _draw(positions, options = '', withOrigin = False): + def _draw(positions, options = '', withOrigin = False, lastCoordinate = None): from matplotlib.pylab import plot - plot(positions[0], positions[1], options) + if lastCoordinate == None: + plot(positions[0], positions[1], options) + elif 0 <= lastCoordinate <= len(positions[0]): + plot(positions[0][:lastCoordinate], positions[1][:lastCoordinate], options) if withOrigin: plot([positions[0][0]], [positions[1][0]], 'ro') + def project(self, homography): + from numpy.core.multiarray import array + projected = cvutils.projectArray(homography, array(self.positions)) + return Trajectory(projected) + def draw(self, options = '', withOrigin = False): Trajectory._draw(self.positions, options, withOrigin) - def drawOnImage(self, nPixelsPerUnitDistance, imageHeight, options = '', withOrigin = False): + def drawAt(self, lastCoordinate, options = '', withOrigin = False): + Trajectory._draw(self.positions, options, withOrigin, lastCoordinate) + + def drawOnWorldImage(self, nPixelsPerUnitDistance, imageHeight, options = '', withOrigin = False): from matplotlib.pylab import plot imgPositions = [[x*nPixelsPerUnitDistance for x in self.positions[0]], [-x*nPixelsPerUnitDistance+imageHeight for x in self.positions[1]]] Trajectory._draw(imgPositions, options, withOrigin) - def length(self): - return len(self.positions[0]) - def getXCoordinates(self): return self.positions[0] @@ -478,8 +492,8 @@ def draw(self, options = '', withOrigin = False): self.positions.draw(options, withOrigin) - def drawOnImage(self, nPixelsPerUnitDistance, imageHeight, options = '', withOrigin = False): - self.positions.drawOnImage(nPixelsPerUnitDistance, imageHeight, options, withOrigin) + def drawWorldOnImage(self, nPixelsPerUnitDistance, imageHeight, options = '', withOrigin = False): + self.positions.drawWorldOnImage(nPixelsPerUnitDistance, imageHeight, options, withOrigin) def getInstantsCrossingLane(self, p1, p2): '''Returns the instant(s)
--- a/python/storage.py Mon Mar 05 02:55:19 2012 -0500 +++ b/python/storage.py Tue Mar 06 18:10:19 2012 -0500 @@ -48,6 +48,15 @@ connection.close() return objects +def loadObjectsFromSqlite(filename, objectNumbers = -1): + '''Loads objects as averages of feature trajectories + TODO: load features as well, other ways of averaging trajectories + need to provide table name(s) ?''' + # elect frame_number, avg(x_coordinate), avg(y_coordinate) from positions where trajectory_id in (select trajectory_id from objects_features where object_id=12) group by frame_number; + + + + def loadTrajectoriesFromNgsimFile(filename, nObjects = -1, sequenceNum = -1): '''Reads data from the trajectory data provided by NGSIM project and returns the list of Feature objects'''