Mercurial > hg > nsaunier > traffic-intelligence
comparison python/moving.py @ 345:fa64b2e3a64f
added simple classification based on speed
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Tue, 25 Jun 2013 23:43:32 -0400 |
| parents | 74e437ab5f11 |
| children | e5fe0e6d48a1 |
comparison
equal
deleted
inserted
replaced
| 344:14a2405f54f8 | 345:fa64b2e3a64f |
|---|---|
| 3 | 3 |
| 4 import utils | 4 import utils |
| 5 import cvutils | 5 import cvutils |
| 6 | 6 |
| 7 from math import sqrt | 7 from math import sqrt |
| 8 from numpy import median | |
| 8 | 9 |
| 9 #from shapely.geometry import Polygon | 10 #from shapely.geometry import Polygon |
| 10 | 11 |
| 11 __metaclass__ = type | 12 __metaclass__ = type |
| 12 | 13 |
| 580 class MovingObject(STObject): | 581 class MovingObject(STObject): |
| 581 '''Class for moving objects: a spatio-temporal object | 582 '''Class for moving objects: a spatio-temporal object |
| 582 with a trajectory and a geometry (constant volume over time) and a usertype (e.g. road user) coded as a number (see | 583 with a trajectory and a geometry (constant volume over time) and a usertype (e.g. road user) coded as a number (see |
| 583 ''' | 584 ''' |
| 584 | 585 |
| 585 def __init__(self, num = None, timeInterval = None, positions = None, geometry = None, userType = None): | 586 def __init__(self, num = None, timeInterval = None, positions = None, velocities = None, geometry = None, userType = None): |
| 586 super(MovingObject, self).__init__(num, timeInterval) | 587 super(MovingObject, self).__init__(num, timeInterval) |
| 587 self.positions = positions | 588 self.positions = positions |
| 589 self.velocities = velocities | |
| 588 self.geometry = geometry | 590 self.geometry = geometry |
| 589 self.userType = userType | 591 self.userType = userType |
| 590 self.features = None | 592 self.features = None |
| 591 # compute bounding polygon from trajectory | 593 # compute bounding polygon from trajectory |
| 592 | 594 |
| 668 def predictPosition(self, instant, nTimeSteps, externalAcceleration = Point(0,0)): | 670 def predictPosition(self, instant, nTimeSteps, externalAcceleration = Point(0,0)): |
| 669 '''Predicts the position of object at instant+deltaT, | 671 '''Predicts the position of object at instant+deltaT, |
| 670 at constant speed''' | 672 at constant speed''' |
| 671 return predictPositionNoLimit(nTimeSteps, self.getPositionAtInstant(instant), self.getVelocityAtInstant(instant), externalAcceleration) | 673 return predictPositionNoLimit(nTimeSteps, self.getPositionAtInstant(instant), self.getVelocityAtInstant(instant), externalAcceleration) |
| 672 | 674 |
| 675 def classifyUserTypeSpeed(self, threshold, statisticsFunc = median): | |
| 676 '''Classifies slow and fast road users | |
| 677 slow: non-motorized -> pedestrians | |
| 678 fast: motorized -> cars''' | |
| 679 if statisticsFunc(self.velocities.norm()) >= threshold: | |
| 680 self.setUserType(userType2Num['car']) | |
| 681 else: | |
| 682 self.setUserType(userType2Num['pedestrian']) | |
| 683 | |
| 673 @staticmethod | 684 @staticmethod |
| 674 def collisionCourseDotProduct(movingObject1, movingObject2, instant): | 685 def collisionCourseDotProduct(movingObject1, movingObject2, instant): |
| 675 'A positive result indicates that the road users are getting closer' | 686 'A positive result indicates that the road users are getting closer' |
| 676 deltap = movingObject1.getPositionAtInstant(instant)-movingObject2.getPositionAtInstant(instant) | 687 deltap = movingObject1.getPositionAtInstant(instant)-movingObject2.getPositionAtInstant(instant) |
| 677 deltav = movingObject2.getVelocityAtInstant(instant)-movingObject1.getVelocityAtInstant(instant) | 688 deltav = movingObject2.getVelocityAtInstant(instant)-movingObject1.getVelocityAtInstant(instant) |
