Skip to content

Instantly share code, notes, and snippets.

@sudo-ben
Created July 1, 2018 03:45
Show Gist options
  • Save sudo-ben/21716a670209adb4f04eb6a8b6c1c574 to your computer and use it in GitHub Desktop.
Save sudo-ben/21716a670209adb4f04eb6a8b6c1c574 to your computer and use it in GitHub Desktop.
from time import time
_MAX_AREA_FLUCTUATION = 0.6 #percent
_STONG_FRAME_COUNT = 20
_OBJECT_TIMEOUT = 3 #seconds
class TrackedObject(object):
"""
A class to track objects detected in a frame. The class logs frame
locations an object is detected and calculates an area the object is
likely to be in.
>>> trackedObject = TrackedObject("Bob")
>>> trackedObject.addTrackPoint(None)
>>> trackedObject.addTrackPoint(None)
>>> trackedObject.numTrackPoints()
2
>>> trackedObject.noMatchFound()
>>> trackedObject.addTrackPoint(None)
>>> trackedObject.numTrackPoints()
3
"""
def __init__(self, name):
self._name = name
self._consecFailedMatchs = 0
self._trackPoints = []
self._lastSeen = time()
self._firstSeen = None
def getScanSpace(self):
"return estimated area object is located"
scanArea = self._trackPoints[-1].copy()
scanArea *= self.timeElapsedSinceLastSeen() * 20
scanArea.center = self._trackPoints[-1].center
return scanArea
def numTrackPoints(self): return len(self._trackPoints)
def timeElapsedSinceLastSeen(self):
return time() - self._lastSeen
def hasLeftFrame(self):
"""
>>> from time import sleep
>>> trackedObject = TrackedObject("Bob")
>>> trackedObject.addTrackPoint(None)
>>> trackedObject.noMatchFound()
>>> sleep(4)
>>> trackedObject.hasLeftFrame()
True
"""
return self._consecFailedMatchs > 0 and self.timeElapsedSinceLastSeen() > _OBJECT_TIMEOUT
def strongFrameCount(self):
return len(self._trackPoints) > _STONG_FRAME_COUNT
def addTrackPoint(self, rect):
self._lastSeen = time()
if not self._firstSeen:
self._firstSeen = time()
self._consecFailedMatchs = 0
self._trackPoints.append(rect)
def isMatchToRect(self, rect):
intersectingRect = rect.intersectingRect(self.rect)
if not intersectingRect:
return False
percentAreaChange = abs(intersectingRect.area() / float(self.rect.area()))
# if the new found object covers _MAX_AREA_FLUCTUATION of the area of the last found object then we have a match
return percentAreaChange > _MAX_AREA_FLUCTUATION
def noMatchFound(self):
self._consecFailedMatchs += 1
if __name__ == "__main__":
import doctest
doctest.testmod(verbose=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment