使用nodejs和python構建一個遠端監控系統2.主控程式編寫
阿新 • • 發佈:2019-01-26
視屏採集模組完成之後,開始編寫視屏分發程式和主控程式
1.分發器(目前採用UDP協議,以後可以擴充套件一個支援TCP協議的分發器支援高清視屏傳輸)
#encoding=utf-8 import socket import cv2 import numpy from io import BytesIO from utils import IOUtil,logger from PIL import Image from settings import * import time ''' 傳遞者模組,用於分發需要散佈的資訊 ''' class Dispatcher(object): #資訊分發器,用於將資訊分發到指定的ip和埠上 def __init__(self): #初始化udp socket self._sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) self.fileName = 0 logger.info("分發器初始化完畢") def dispenseImage(self,frame,address): #分發圖片到指定的地址 if frame is None: return try: #將brg影象轉化為rgb影象,工具類中有封裝 self._sock.sendto(IOUtil.array_to_bytes(frame[...,::-1]),address) except Exception as e: logger.error("分發器錯誤:"+str(e)) def dispenseCommand(self,command,address): if command is None: return try: self._sock.sendto(bytes(command),address) except Exception as e: raise Exception(e) def close(self): self._sock.close()
2.主控程式編寫,python的多執行緒模組無法優化CPU密集型任務,但在後期會用多程序對程式進行優化,所以目前使用類似的多執行緒模式
#encoding=utf-8 import cv2 from managers import CameraManager from transmitters import Dispatcher from threading import Thread from settings import * import time import copy import multiprocessing from utils import IOUtil,logger ''' 主控程式 ''' class Camera(object): #主控程式 def __init__(self,captureManager = None,dispatcher = None,isShow=True): ''' :param captureManager: 視屏採集器 :param dispatcher:資訊分發器 ''' logger.info("主控程式初始化...") self.captureManager = captureManager if captureManager is not None else CameraManager(cv2.VideoCapture(0)) self.dispatcher = dispatcher if dispatcher is not None else Dispatcher() #是否開啟影象分發 self.isDispense = True #是否在本地顯示 self.isShow = isShow #是否開啟預警 self.isWarning = True #item為預警器處理後的影象以及座標資訊 #原始影象 self.frame = None logger.info("主控程式初始化完畢...") def _dispatch(self): #資訊分發執行緒 logger.info("是否開啟圖片分發:"+str(self.isDispense)) while self.isDispense: try: self.dispatcher.dispenseImage(self.frame,(IMAGE_IP,IMAGE_PORT)) except EOFError as e: print(e) def run(self): logger.info("\n################################################################") self.startDispatch() self.captureManager.start() time.sleep(1) while self.captureManager.isWorking(): self.frame = self.captureManager.getFrame() if self.frame is None: continue if self.isShow and self.frame is not None: cv2.imshow("show",self.frame) keycode = cv2.waitKey(1) self.onKeypress(keycode) def startDispatch(self): #開啟分發 logger.info("開啟分發") Thread(target=self._dispatch,args=()).start() def onKeypress(self,keycode): #按鈕回撥函式 if keycode == 32: #空格鍵截圖 self.captureManager.writeImage() elif keycode == 9: #tab鍵開啟錄影 if not self.captureManager.isWritingVideo(): self.captureManager.startWritingVideo() else: self.captureManager.stopWritingVideo() elif keycode == 27: #esc鍵結束應用 self.isDispense = False self.captureManager.stop() self.dispatcher.close() self.isWarning= False if __name__=="__main__": Camera().run()
視屏採集模組結束,至此python模組完成