1. 程式人生 > >使用nodejs和python構建一個遠端監控系統2.主控程式編寫

使用nodejs和python構建一個遠端監控系統2.主控程式編寫

視屏採集模組完成之後,開始編寫視屏分發程式和主控程式

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模組完成