提交 f37e5603 authored 作者: blu's avatar blu

init

上级 b377683a
...@@ -3,7 +3,7 @@ __author__ = 'Bruce.Lu' ...@@ -3,7 +3,7 @@ __author__ = 'Bruce.Lu'
__date__ = '2019/07/30' __date__ = '2019/07/30'
__enhencements__ = {"1": "state machine based algorithm", "2": "using avg frame instead of previous frame to calc delta", __enhencements__ = {"1": "state machine based algorithm", "2": "using avg frame instead of previous frame to calc delta",
"3": "does not depend on accurate process step time", "4": "event notification machanism"} "3": "does not depend on accurate process step time", "4": "event notification machanism"}
__credits__ = 'Zhao LiPeng for the frame-delta algorithm' __credits__ = ['Zhao LiPeng for the basic frame-delta algorithm', 'Ge.Xu for advices']
import os, sys, datetime, time, cv2, imutils, json, atexit, traceback import os, sys, datetime, time, cv2, imutils, json, atexit, traceback
...@@ -12,7 +12,7 @@ from collections import deque ...@@ -12,7 +12,7 @@ from collections import deque
class FrameFetcher(Thread): class FrameFetcher(Thread):
def init(self): def init(self):
self.cap = cv2.VideoCapture(env['STREAM_ADDR']) self.cap = cv2.VideoCapture(self.env['STREAM_ADDR'])
self.videoProto = 'RTSP' if 'rtsp' in self.env['STREAM_ADDR'] else 'FILE' self.videoProto = 'RTSP' if 'rtsp' in self.env['STREAM_ADDR'] else 'FILE'
self.height = self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT) self.height = self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
self.width = self.cap.get(cv2.CAP_PROP_FRAME_WIDTH) self.width = self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)
...@@ -34,11 +34,12 @@ class FrameFetcher(Thread): ...@@ -34,11 +34,12 @@ class FrameFetcher(Thread):
def run(self): def run(self):
while True: while True:
while self.cap.isOpened(): while self.cap.isOpened():
start = datetime.datetime.now().timestamp()
ret, frame = self.cap.read() ret, frame = self.cap.read()
if ret: if ret:
try: try:
self.frameHolder.append(frame) self.frameHolder.append(frame)
if self.frameCnt % (self.fps * 2) == 0: if self.frameCnt % (self.fps * 60) == 0:
print("frameCnt: ", self.frameCnt) print("frameCnt: ", self.frameCnt)
except: except:
self.failedPutCnt += 1 self.failedPutCnt += 1
...@@ -48,9 +49,12 @@ class FrameFetcher(Thread): ...@@ -48,9 +49,12 @@ class FrameFetcher(Thread):
self.frameCnt+=1 self.frameCnt+=1
else: else:
print("error read frame") print("error read frame")
time.sleep(1.0 / self.fps) break
delta = datetime.datetime.now().timestamp() - start
print("error: cap is not opened, reconnecting...") delta = 1.0 / self.fps - delta
if delta > 0:
time.sleep(delta)
print("error: connecting to camera {}, reconnecting...".format(self.env['STREAM_ADDR']))
self.init() self.init()
class MotionDetector(Thread): class MotionDetector(Thread):
...@@ -70,8 +74,12 @@ class MotionDetector(Thread): ...@@ -70,8 +74,12 @@ class MotionDetector(Thread):
lastEventEnterTs = None lastEventEnterTs = None
eventState = None # pre, in, post, none eventState = None # pre, in, post, none
evtQue = self.evtQue evtQue = self.evtQue
# statistic variables
cntContNoEvent = 0 cntContNoEvent = 0
cntContNoEventPrev = 0
cntContEvent = 0 cntContEvent = 0
cntContEventPrev = 0
while True: while True:
start = datetime.datetime.now().timestamp() start = datetime.datetime.now().timestamp()
try: try:
...@@ -97,19 +105,21 @@ class MotionDetector(Thread): ...@@ -97,19 +105,21 @@ class MotionDetector(Thread):
hasEvent = True hasEvent = True
break break
# live logging # live sampling log
if hasEvent: if hasEvent:
cntContEvent += 1 cntContEvent += 1
cntContNoEvent = 0 cntContNoEvent = 0
if cntContEvent %(self.env['PROC_FPS'] * 2) == 0: if cntContEvent %(self.env['PROC_FPS'] * 10) == 0 and cntContEvent != cntContEventPrev:
print('continous event cnt: {}, current state: {}'.format(cntContEvent, eventState)) print('continous event cnt: {}, current state: {}'.format(cntContEvent, eventState))
cntContEventPrev = cntContEvent
else: else:
cntContNoEvent += 1 cntContNoEvent += 1
cntContEvent = 0 cntContEvent = 0
if cntContNoEvent %(self.env['PROC_FPS'] * 2) == 0: if cntContNoEvent %(self.env['PROC_FPS'] * 10) == 0 and cntContNoEventPrev != cntContNoEvent:
print('continous no event cnt: {}, current state: {}'.format(cntContNoEvent, eventState)) print('continous no event cnt: {}, current state: {}'.format(cntContNoEvent, eventState))
cntContNoEventPrev = cntContNoEvent
# statemachine for event # statemachine for event states transaction
if eventState == None: if eventState == None:
if hasEvent: if hasEvent:
eventState = 'PRE' eventState = 'PRE'
...@@ -150,7 +160,7 @@ class MotionDetector(Thread): ...@@ -150,7 +160,7 @@ class MotionDetector(Thread):
else: else:
eventState = 'IN' eventState = 'IN'
lastEventEnterTs = start lastEventEnterTs = start
except IndexError: except IndexError:
pass pass
except Exception as e: except Exception as e:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论