Created
July 1, 2018 03:45
-
-
Save sudo-ben/21716a670209adb4f04eb6a8b6c1c574 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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