changeset 1215:1b472cddf9b1

updated reading by interpolating missing frames
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 05 May 2023 22:52:25 -0400
parents 01c24c1cdb70
children 8356e15fd691
files trafficintelligence/prediction.py trafficintelligence/storage.py
diffstat 2 files changed, 27 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/trafficintelligence/prediction.py	Thu May 04 22:30:32 2023 -0400
+++ b/trafficintelligence/prediction.py	Fri May 05 22:52:25 2023 -0400
@@ -558,9 +558,9 @@
                     
                     if collisionTimeInterval.empty():
                         if computeCZ:
-                            crossingZones = [SafetyPoint(intersection, 1., timeInterval1.distance(timeInterval2))]
+                            crossingZones.append(SafetyPoint(intersection, 1., timeInterval1.distance(timeInterval2)))
                     else:
-                        collisionPoints = [SafetyPoint(intersection, 1., collisionTimeInterval.center())]
+                        collisionPoints.append(SafetyPoint(intersection, 1., collisionTimeInterval.center()))
     
         if debug and intersection is not None:
             from matplotlib.pyplot import plot, figure, axis, title
@@ -586,7 +586,10 @@
     def computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, *kwargs):
         'TODO compute pPET'
         collisionPoints = []
-        crossingZones = []
+        if computeCZ:
+            crossingZones = []
+        else:
+            crossingZones = None
 
         if self.useCurvilinear:
             pass # Lionel
@@ -600,7 +603,7 @@
             if not moving.Point.parallel(v1, v2):
                 ttc = moving.Point.timeToCollision(p1, p2, v1, v2, collisionDistanceThreshold)
                 if ttc is not None:
-                    collisionPoints = [SafetyPoint((p1+(v1*ttc)+p2+(v2*ttc))*0.5, 1., ttc)]
+                    collisionPoints.append(SafetyPoint((p1+(v1*ttc)+p2+(v2*ttc))*0.5, 1., ttc))
                 else:
                     pass # compute pPET
         return collisionPoints, crossingZones
@@ -616,7 +619,10 @@
     def computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, *kwargs):
         'TODO compute pPET'
         collisionPoints = []
-        crossingZones = []
+        if computeCZ:
+            crossingZones = []
+        else:
+            crossingZones = None
 
         if self.useCurvilinear:
             pass # Lionel
@@ -629,7 +635,7 @@
             if not moving.Point.parallel(v1, v2):
                 ttc = moving.Point.timeToCollisionPoly(poly1, v1, poly2, v2)
                 if ttc is not None:
-                    collisionPoints = [SafetyPoint((obj1.getPositionAtInstant(currentInstant)+(v1*ttc)+obj2.getPositionAtInstant(currentInstant)+(v2*ttc))*0.5, 1., ttc)]
+                    collisionPoints.append(SafetyPoint((obj1.getPositionAtInstant(currentInstant)+(v1*ttc)+obj2.getPositionAtInstant(currentInstant)+(v2*ttc))*0.5, 1., ttc))
                 else:
                     pass # compute pPET
         return collisionPoints, crossingZones
--- a/trafficintelligence/storage.py	Thu May 04 22:30:32 2023 -0400
+++ b/trafficintelligence/storage.py	Fri May 05 22:52:25 2023 -0400
@@ -7,8 +7,8 @@
 from copy import copy
 import sqlite3, logging
 
-from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt, floor as npfloor, ceil as npceil, linalg, int32, int64, reshape, dot, vstack, transpose, ones, zeros_like, pi
-from pandas import read_csv, merge
+from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt, floor as npfloor, ceil as npceil, linalg, int32, int64, reshape, dot, vstack, transpose, ones, zeros_like, pi, NaN
+from pandas import read_csv, merge, concat, DataFrame
 
 from trafficintelligence import utils, moving, events, indicators, cvutils
 from trafficintelligence.base import VideoFilenameAddable
@@ -1336,6 +1336,13 @@
     for objNum in data.trackingid.unique():
         tmp = data[data.trackingid == objNum].sort_values('frame')
         t = moving.Trajectory()#([[float(numbers[6])],[float(numbers[7])]])
+        interval = moving.TimeInterval(int(tmp.frame.min()), int(tmp.frame.max()))
+        userType = tmp.iloc[0].usertype
+        if len(tmp) != interval.length(): #interpolate
+            print(objNum, len(tmp), interval.length())
+            instants = set(interval).difference(tmp.frame)
+            tmp = concat([tmp, DataFrame([[t, objNum, userType]+[NaN]*(len(header)-3) for t in instants], columns = header)], ignore_index=True).sort_values('frame')
+            tmp.interpolate(inplace=True)
         featureTrajectories = [moving.Trajectory() for i in range(4)]
         for i, r in tmp.iterrows():
             _, Tr_imu_to_world = oxts[r.frame]
@@ -1381,10 +1388,10 @@
             for i in range(4):
                 featureTrajectories[i].addPositionXY(xCoords[i], yCoords[i])                
             # check https://docs.opencv.org/3.4/d9/d0c/group__calib3d.html#ga1019495a2c8d1743ed5cc23fa0daff8c
-        
-        newObj = moving.MovingObject(num = objNum, timeInterval = moving.TimeInterval(int(tmp.frame.min()), int(tmp.frame.max())), positions = t, velocities = t.differentiate(True), userType = tmp.iloc[0].usertype, features = [moving.MovingObject(num = featureNum+i, timeInterval = moving.TimeInterval(int(tmp.frame.min()), int(tmp.frame.max())), positions = featureTrajectories[i], velocities = featureTrajectories[i].differentiate(True)) for i in range(4)])
-        objects.append(newObj)
-        featureNum += 4
+        if interval.length()>1:
+            newObj = moving.MovingObject(num = objNum, timeInterval = interval, positions = t, velocities = t.differentiate(True), userType = userType, features = [moving.MovingObject(num = featureNum+i, timeInterval = copy(interval), positions = featureTrajectories[i], velocities = featureTrajectories[i].differentiate(True)) for i in range(4)])
+            objects.append(newObj)
+            featureNum += 4
     
     # ego vehicle
     t = moving.Trajectory()
@@ -1420,9 +1427,8 @@
         t.addPositionXY(xCoords.mean(), yCoords.mean())
         for i in range(4):
             featureTrajectories[i].addPositionXY(xCoords[i], yCoords[i])                
-            # check https://docs.opencv.org/3.4/d9/d0c/group__calib3d.html#ga1019495a2c8d1743ed5cc23fa0daff8c
-        
-    newObj = moving.MovingObject(num = objNum+1, timeInterval = interval, positions = t, velocities = t.differentiate(True), userType = 'Car', features = [moving.MovingObject(num = featureNum+i, timeInterval = interval, positions = featureTrajectories[i], velocities = featureTrajectories[i].differentiate(True)) for i in range(4)])
+            # check https://docs.opencv.org/3.4/d9/d0c/group__calib3d.html#ga1019495a2c8d1743ed5cc23fa0daff8c        
+    newObj = moving.MovingObject(num = objNum+1, timeInterval = interval, positions = t, velocities = t.differentiate(True), userType = 'Car', features = [moving.MovingObject(num = featureNum+i, timeInterval = copy(interval), positions = featureTrajectories[i], velocities = featureTrajectories[i].differentiate(True)) for i in range(4)])
     objects.append(newObj)
 
     return objects