def __init__(self, capture): ''' :param capture: 摄像头对象 :param windowManager: 钩子类,窗口管理,按键 ''' #从配置文件中读取截图目录和录像目录创建文件夹 self.screenshot_dir = SCREENSHOT_DIR self.video_dir = VIDEO_DIR self._capture = capture #当前画面 self._frame = None #录像编码 self._videoEncoding = None #视频写入工具 self._videoWriter = None #是否开启显示 self._isShow = False #是否工作 self._isWorking = True #fps self._fps = 0 #是否正在写入视频 self._videoFilename = None IOUtil.mkdir(self.screenshot_dir) IOUtil.mkdir(self.video_dir) logger.info("视频采集器初始化完毕!")
def update(self,frame): #运动检测 if frame is None: return if not self.isWorking(): logger.error("运动检测器未初始化") raise Exception("运动检测器未初始化") item = None sample_frame = cv2.GaussianBlur(cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY),(21,21),0) diff = cv2.absdiff(self._background,sample_frame) diff = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1] diff = cv2.dilate(diff, self.es, iterations=2) image, cnts, hierarchy = cv2.findContours(diff.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) bigC = None bigMulti = 0 for c in cnts: if cv2.contourArea(c) < bigMulti: continue bigMulti = cv2.contourArea(c) (x,y,w,h) = cv2.boundingRect(c) bigC = ((x,y),(x+w,y+h)) message = {} if bigC is not None: center = IOUtil.countCenter(bigC) cv2.circle(frame,center,5,(55,255,155),1) cv2.rectangle(frame, bigC[0],bigC[1], (255,0,0), 2, 1) message['isGet'] = True message['center'] = center message["rect"] = bigC message['time'] = time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()) item = MessageItem(frame,message) else: message['isGet'] = False item = MessageItem(frame,message) return item
def update(self,frame): if frame is None: return if not self.isWorking(): logger.error('追踪器未初始化') raise Exception("跟踪器未初始化") item = None hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) dst = cv2.calcBackProject([hsv], [0], self.roi_hist, [0,180], 1) ret, self.track_window = cv2.meanShift(dst, self.track_window, self.term_crit) #ret, self.track_window = cv2.CamShift(dst, self.track_window, self.term_crit) x,y,w,h = self.track_window center = IOUtil.countCenter(((x,y),(x+w,y+h))) cv2.circle(frame,center,5,(55,255,155),1) cv2.rectangle(frame, (x,y), (x+w,y+h), 255, 2) cv2.putText(frame, 'Tracked', (x-25,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2, cv2.LINE_AA) screenSize = frame.shape #print(center[0],":",center[1],":",abs(center[0] - screenSize[1]),":",abs(center[1] - screenSize[0])) message = {} if(center[0] > self.loseDistance and center[1] > self.loseDistance and abs(center[0] - screenSize[1]) > self.loseDistance and abs(center[1] - screenSize[0]) > self.loseDistance): message['isGet'] = True message['center'] = center message["rect"] = ((x,y),(x+w,y+h)) message['time'] = time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()) else: message['isGet'] = False return MessageItem(frame,message)
def _warning(self): #预警线程 count = 0 #当前运动目标 box = None #运动目标位置 logger.info("是否开启预警模式:" + str(self.isWarning)) while self.isWarning: #若为运动检测模式,进入运动检测 if self.isWatching: #若未初始化运动检测器,初始化运动检测器 if not self.watchDog.isWorking(): self.watchDog.startWorking(self.frame) else: self.item = self.watchDog.update(self.frame) if self.item is not None and self.item.getMessage()['isGet']: #若发现动态物体,延时1秒,拍摄10张照片 count += 1 time.sleep(self.imageDelay) box = IOUtil.countBox(self.item.getMessage()["rect"]) logger.info("发现一个运动物体位于" + str(box)) else: count = 0 if count >= self.warnCount: #一秒后退出动态监控状态,进入运动追踪模式 logger.info("累计侦测到目标十次运动,锁定目标,开启目标追踪模式") count = 0 self.stopWatching() self.startTracking(box) if self.isTracking: #若为运动追踪模式,开启运动追踪 if not self.tracker.isWorking(): print('开始目标追踪,追踪范围为' + str(box)) self.tracker.startWorking(self.frame, box) else: self.item = self.tracker.update(self.frame) if self.item is not None and self.item.getMessage()['isGet']: pass else: print("目标丢失,退出目标追踪模式,进入运动监控状态") self.stopTracking() self.startWatching()
def update(self,frame): if frame is None: return if not self.isWorking(): logger.error("追踪器未初始化") raise Exception("追踪器未初始化") message = {} item = None self.tracker.update(frame) box_predict = self.tracker.get_position() screenSize = frame.shape rect = ((int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom()))) center = IOUtil.countCenter(rect) cv2.rectangle(frame,rect[0],rect[1],(0,255,255),1) # 用矩形框标注出来 if(center[0] > self.loseDistance and center[1] > self.loseDistance and abs(center[0] - screenSize[1]) > self.loseDistance and abs(center[1] - screenSize[0]) > self.loseDistance): message['isGet'] = True message['center'] = center message["rect"] = rect message['time'] = time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()) else: message['isGet'] = False return MessageItem(frame,message)
def update(self,frame): if frame is None: return if not self.isWorking(): logger.error('追踪器未初始化') raise Exception("跟踪器未初始化") item = None message = {} result = cv2.matchTemplate(frame,self.objectFrame,self.method) minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result) if maxVal > self.updateRet: self.objectFrame = frame[maxLoc[1]:maxLoc[1]+self.h,maxLoc[0]:maxLoc[0]+self.w] if maxVal > self.valThre: center = IOUtil.countCenter((maxLoc,(maxLoc[0] + self.w,maxLoc[1] + self.h))) cv2.rectangle(frame, maxLoc,(maxLoc[0] + self.w,maxLoc[1] + self.h), 255, 2) message['isGet'] = True message['center'] = center message["rect"] = (maxLoc,(maxLoc[0] + self.w,maxLoc[1] + self.h)) message['time'] = time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()) else: message['isGet'] = False return MessageItem(frame,message)
def update(self,frame): if frame is None: return if not self.isWorking(): logger.error('追踪器未初始化') raise Exception("追踪器未初始化") item = None message = {} status,coord = self.tracker.update(frame) if status: rect = ( (int(coord[0]),int(coord[1])), (int(coord[0] + coord[2]),int(coord[1]+coord[3]))) center = IOUtil.countCenter(rect) cv2.rectangle(frame, rect[0], rect[1], (255,0,0), 2, 1) message['isGet'] = True message['center'] = center message["rect"] = rect message['time'] = time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()) else: message['isGet'] = False return MessageItem(frame,message)
def getBinaryFrame(self): return IOUtil.array_to_bytes(self._frame[..., ::-1])
def getBase64Frame(self): #返回base64格式的图片,将BGR图像转化为RGB图像 jepg = IOUtil.array_to_bytes(self._frame[..., ::-1]) return IOUtil.bytes_to_base64(jepg)
cols = [3, 4] df = pd.read_csv(gg, usecols=cols, header=None, index_col=False) dataset_original = np.array(df.values) num_rows = len(dataset_original) min1, min2 = np.where(dataset_original[:, 0:1] == 0), np.where( dataset_original[:, 1:2] == 0) ### Replace value -1 = Mean for i in range(1, len(cols)): count = np.count_nonzero(dataset_original[:, i:i + 1] == 0) value_change = (np.sum(dataset_original[:, i:i + 1], axis=0) + count) / num_rows dataset_original[:, i:i + 1] = np.where(dataset_original[:, i:i + 1] == -1, value_change, dataset_original[:, i:i + 1]) ### Calculate StartTime and EndTime for row in dataset_original: row[1] = row[0] + row[1] row[2] = row[1] + row[2] dataset_original = dataset_original[:, 1:] # Remove initial values (zeros) ### Sort by Time dataset_original = np.array(sorted(dataset_original, key=lambda x: x[0])) IOUtil.save_preprocessing_data(dataset_original, pathfile=gg_format) print("Preprocessing Data Done")
def warning(mydict, screenCenter): ''' 开启预警 ''' box = None warnImages = [] watchDog = WatchDog() tracker = None if TRACKER_TYPE is 1: tracker = CamShiftTracker() elif TRACKER_TYPE is 2: tracker = DlibTracker() else: tracker = TemplateTracker() sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) IOUtil.mkdir(WARN_DIR) lastTrackTime = None isWatching = True isTracking = False direction = { "right": '{"module":2,"command":0}', "left": '{"module":2,"command":1}', "up": '{"module":2,"command":3}', "down": '{"module":2,"command":2}' } logger.info("是否开启预警模式:" + str(mydict['isWarning'])) while mydict['isWarning']: item = None #若为运动检测模式,进入运动检测 if isWatching: #若未初始化运动检测器,初始化运动检测器 if not watchDog.isWorking(): watchDog.startWorking(mydict['frame']) else: item = watchDog.update(mydict['frame']) mydict['item'] = item if item is not None and item.getMessage()['isGet']: #若发现动态物体,延时,拍摄10张照片 imageFileName = WARN_DIR + IOUtil.getImageFileName() warnImages.append(imageFileName) time.sleep(MOVEMENT_TRACK_DELAY) box = IOUtil.countBox(item.getMessage()["rect"]) logger.info("发现一个运动物体位于" + str(box)) cv2.imwrite(imageFileName, item.getFrame()) logger.info("写入一张预警图片:" + imageFileName) else: warnImages = [] if len(warnImages) >= MOVE_TRACK_COUNT: #一秒后退出动态监控状态,进入运动追踪模式 logger.info("累计侦测到目标十次运动,锁定目标,开启目标追踪模式,关闭运动检测") if IS_SEND_EMAIL and ( lastTrackTime is None or time.time() - lastTrackTime > EMAIL_DELAY): startSendEmail(warnImages) isWatching = False if watchDog.isWorking(): watchDog.stopWorking() logger.info("开启目标追踪...") isTracking = True if isTracking: #若为运动追踪模式,开启运动追踪 if not tracker.isWorking(): logger.info('开始目标追踪,初始化追踪范围为' + str(box)) tracker.startWorking(item.getFrame(), box) else: item = tracker.update(mydict['frame']) if item is not None and item.getMessage()['isGet']: mydict['item'] = copy.copy(item) center = item.getMessage()['center'] distance = center[0] - screenCenter[0] levelDirect = "mid" if distance < 0: levelDirect = "right" elif distance > 0: levelDirect = "left" levelDiss = abs(distance) if levelDirect is not "mid" and levelDiss > MOVEMENT_THRESHOLD: sock.sendto(direction[levelDirect].encode(), (CAMERA_COMMAND_IP, CAMERA_COMMAND_PORT)) distance = center[1] - screenCenter[1] virtDirect = "mid" if distance < 0: virtDirect = "up" elif distance > 0: virtDirect = "down" virtDiss = abs(distance) if virtDirect is not "mid" and virtDiss > MOVEMENT_THRESHOLD: sock.sendto(direction[virtDirect].encode(), (CAMERA_COMMAND_IP, CAMERA_COMMAND_PORT)) else: logger.info("目标丢失,退出目标追踪模式,进入运动监控状态") isTracking = False if tracker.isWorking(): tracker.stopWorking() logger.info("开启运动检测...") isWatching = True lastTrackTime = time.time() sock.close() logger.info("预警结束")