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'''