# -*- coding:utf-8 -*- import cv2 import time import redis import queue import sys import time import threading from System_I import Check_start_fordataselect,Density,Detection_Y5,Fine_grained from common import global_para as gp r_db = None import logging from logging.handlers import TimedRotatingFileHandler import os,torch class cusLogger: def __init__(self, loggerName): # 创建一个logger self.logger = logging.getLogger(loggerName) self.logger.setLevel(logging.DEBUG) # 创建一个handler,用于写入日志文件。如果当前目录下没有logs目录,需要手动创建 logPath = ".\\logs\\" # 日志文件名 print(logPath) logName = os.path.join(logPath + loggerName + '.log') print(logName) # 创建一个每日可更新的handler,用于将日志输出文件 fileHandler = TimedRotatingFileHandler(logName, when='D',encoding='utf-8') fileHandler.setLevel(logging.DEBUG) # 创建一个handler,用于将日志输出到控制台 consoleHandler = logging.StreamHandler() consoleHandler.setLevel(logging.DEBUG) # 定义handler的输出格式 formatter = logging.Formatter( '%(asctime)s-%(name)s-%(levelname)s:%(message)s') fileHandler.setFormatter(formatter) consoleHandler.setFormatter(formatter) self.logger.addHandler(fileHandler) #如果不需要控制台,可以注释掉 self.logger.addHandler(consoleHandler) def getLogger(self): return self.logger log = cusLogger("rtsp_process").getLogger() class rtspThread(threading.Thread): def __init__(self, thName, rtspUrl, prefix, filePath, fps, frameSize, queueSize, eventKey, eventValue,DensityClass,DetectionClass,Fine_grianedClass): threading.Thread.__init__(self) # name self.thName = thName # rtsp流地址 self.rtspUrl = rtspUrl # 帧率 self.fps = fps # 帧大小(width,height) self.frameSize = frameSize # 存储队列大小,fps * 10秒 self.queueSize = queueSize # redis的key self.eventKey = eventKey # key值 self.eventValue = eventValue # 存储文件前缀 self.prefix = prefix # 存储路径 self.filePath = filePath self.DensityClass = DensityClass self.DetectionClass = DetectionClass self.Fine_grianedClass = Fine_grianedClass def run(self): vidoeSaveQueue = [queue.Queue(self.queueSize), queue.Queue(self.queueSize)] jpgSaveQueue = [queue.Queue(self.queueSize), queue.Queue(self.queueSize)] curQueueIdx = 0 t1 = time.time() cap = cv2.VideoCapture(self.rtspUrl) t2 = time.time() print("capture is ",(t2-t1)*1000) closed = False failCnt = 0 winName = self.rtspUrl + "_" + str(time.time()) num_detection = 0 num_cuntupian=0 while True: if cap.isOpened(): #t3 = time.time() res, frame = cap.read() #t4 = time.time() #print("read is ",(t4-t3)*1000) if res: closed = False failCnt = 0 # frame = cv2.imread("/home/wanghc/output1/0001_20210413155842/RawImage/0174.jpg") # for i in range(100): # t1 = time.time() # print("initing.....") # self.DetectionClass.check_object(frame) # t2 = time.time() # print((t2 - t1) * 1000) if (num_detection >24) : data_today = time.strftime('%H', time.localtime(time.time())) # print(int(data_today)) if (int(data_today) > 7) & (int(data_today) < 18): Check_start1 = Check_start_fordataselect(1,"check_start",frame,self.DetectionClass,self.Fine_grianedClass) Check_start1.start() else: print("time is out") num_detection=0 # if is_ex_bird : # cv2.imwrite(self.filePath +"{}.jpg".format(time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))),frame) num_detection+=1 num_cuntupian+=1 # cv2.namedWindow(winName, flags=cv2.WINDOW_FREERATIO) # cv2.imshow(winName, frame) # cv2.waitKey(10) try: if vidoeSaveQueue[curQueueIdx].full(): vidoeSaveQueue[curQueueIdx].get_nowait() vidoeSaveQueue[curQueueIdx].put_nowait(frame) except: pass try: if jpgSaveQueue[curQueueIdx].full(): jpgSaveQueue[curQueueIdx].get_nowait() jpgSaveQueue[curQueueIdx].put_nowait(frame) except: pass # if (r_db.exists(self.eventKey) and int(r_db.get(self.eventKey)) == self.eventValue): # print(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # r_db.delete(self.eventKey) # # 存视频 # vidoeSaveProc = videoSaveThread(self.thName,self.prefix, self.filePath, self.fps, # self.frameSize, vidoeSaveQueue[curQueueIdx]) # vidoeSaveProc.start() # # 存图片 # # jpgSaveSaveProc = jpgSaveThread(self.thName, self.prefix, self.filePath, self.fps, # # self.frameSize, jpgSaveQueue[curQueueIdx]) # # jpgSaveSaveProc.start() # # 切换缓存队列 # curQueueIdx = (curQueueIdx + 1) % 2 else: failCnt += 1 if(failCnt >= 15): closed = True else: closed = True if closed: # 休眠10秒钟 重连 log.info("reconnect: " + self.rtspUrl) time.sleep(5) cap.open(self.rtspUrl) if __name__ == '__main__': root = "/home/wanghc/output_jiankong" #r_db = redis.StrictRedis(host='localhost', port=6379, db=0) log = cusLogger("rtsp_process").getLogger() Density1 = Density(gp.devices, root) Detection1 = Detection_Y5(gp.devices, root) Fine_grained1 = Fine_grained(gp.devices, root) # try: # # 如果有多个流要同时取存,可以创建多个线程 # t1 = time.time() # thread1 = rtspThread("thread_vs", # "rtsp://admin:glodon123@192.168.116.13:554/Streaming/Channels/101", # "ch1_", # "../data_MPKFNet/RTSP/", # 为空串时,默认保存在当前目录 # 25, # (3840, 2160), # # (3264,2448), # 1500, # "key", # 1, # Density1, # Detection1, # Fine_grained1 # ) # t2 = time.time() # print("multi is ", (t2 - t1) * 1000) # thread1.start() # # # # except Exception as e: # log.info(e) try: # 如果有多个流要同时取存,可以创建多个线程 t1 = time.time() thread1 = rtspThread("thread_vs", "rtsp://admin:glodon123@192.168.116.13:554/Streaming/Channels/101", "ch1_", "../data_MPKFNet/RTSP", # 为空串时,默认保存在当前目录 25, (3840, 2160), # (3264,2448), 1500, "key", 1, Density1, Detection1, Fine_grained1 ) t2 = time.time() print("multi is ", (t2 - t1) * 1000) thread1.start() except Exception as e: log.info(e)