示例#1
0
 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("视频采集器初始化完毕!")
示例#2
0
 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
示例#3
0
 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)
示例#4
0
 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()
示例#5
0
 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)
示例#6
0
 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)
示例#7
0
 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)
示例#8
0
 def getBinaryFrame(self):
     return IOUtil.array_to_bytes(self._frame[..., ::-1])
示例#9
0
 def getBase64Frame(self):
     #返回base64格式的图片,将BGR图像转化为RGB图像
     jepg = IOUtil.array_to_bytes(self._frame[..., ::-1])
     return IOUtil.bytes_to_base64(jepg)
示例#10
0
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")
示例#11
0
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("预警结束")