當前位置 主頁 > 服務器問題 > win服務器問題匯總 > 最大化 縮小

    Python3遠程監控程序的實現方法

    欄目:win服務器問題匯總 時間:2019-12-10 15:11

    簡述

    一開始覺得這個很有趣,然后就想來做一個來玩一下

    使用語言: Python3

    使用工具:opencv視頻監控 + socket數據傳輸技術

    程序檢驗: 這里我考慮了一下,發現還是沒有必要實現封裝成可執行文件。還是直接就放代碼吧。(先放代碼,以后再做解釋)

    本程序,經過本人修改,保證可以使用

    使用要求:

    Sender代碼必須要在一臺有攝像頭的電腦上運行起來。然后把數據編碼,壓縮之后,再傳給另外一個電腦

    Reciever作為接受端,沒什么特別的要求。

    兩個電腦都必須要按轉好numpy + opencv (安裝方法的話,在我的opencv文集中有一篇就是寫這個的)

    對了,我的接受端關閉操作是(輸入鍵盤中的 Esc)這樣就可以退出監控。

    發送端是關閉不了這個監控的

    至于這個IP地址的設置:我寫的都是接受端的地址。端口隨便設置的

    局限性:

    本程序目前只能在局域網內進行實時監控。

    改進思路:

    如果想擴展成一個廣域網上的。(就可以用一個廣域網上的服務器做中轉站)

    而且,上述的方法,如果能找到一臺肉雞,還可以避免探測到對應的監控對象的ip地址

    代碼

    Sender(發送端代碼)

    import socket
    import struct
    import time
    import cv2
    import numpy
    
    
    class Config(object):
      def __init__(self):
        self.TargetIP = ('192.168.199.121', 6666)
        self.resolution = (640, 480) # 分辨率
        self.img_fps = 15 # each second send pictures
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.connect(self.TargetIP)
        self.img = ''
        self.img_data = ''
    
      def RT_Image(self):
        camera = cv2.VideoCapture(0)
        img_param = [int(cv2.IMWRITE_JPEG_QUALITY), self.img_fps]
    
        while True:
          time.sleep(0.1) # sleep for 0.1 seconds
          _, self.img = camera.read()
    
          self.img = cv2.resize(self.img, self.resolution)
    
          _, img_encode = cv2.imencode('.jpg', self.img, img_param)
          img_code = numpy.array(img_encode)
          self.img_data = img_code.tostring() # bytes data
          try:
    
            packet = struct.pack(b'lhh', len(self.img_data), self.resolution[0],
                       self.resolution[1])
            self.server.send(packet)
            self.server.send(self.img_data)
    
          except Exception as e:
            print(e.args)
            camera.release()
            return
    
    
    if __name__ == '__main__':
      config = Config()
      config.RT_Image()
    

    Reciever 接受端代碼:

    import socket
    import cv2
    import struct
    import numpy
    import threading
    
    
    class Camera_Connect_Object(object):
      def __init__(self, TargetIP=('', 6666)):
        self.TargetIP = TargetIP
        self.resolution = (640, 480)
        self.src = 888 + 15
        self.interval = 0
        self.img_fps = 15
    
        self.Server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.Server.bind(self.TargetIP)
        self.Server.listen(5)
    
      def RT_Image(self):
        self.client, self.addr = self.Server.accept()
        self.name = self.addr[0] + " Camera"
        print(self.name)
        while True:
          # time.sleep(0.3) # sleep for 0.3 seconds
          tempdata = self.client.recv(8)
          if len(tempdata) == 0:
            print("+1")
            continue
          info = struct.unpack('lhh', tempdata)
          buf_size = int(info[0])
    
          if buf_size:
            try:
              self.buf = b""
              self.temp_buf = self.buf
              while buf_size:
                self.temp_buf = self.client.recv(buf_size)
                buf_size -= len(self.temp_buf)
                self.buf += self.temp_buf
              data = numpy.fromstring(self.buf, dtype='uint8')
    
              self.image = cv2.imdecode(data, 1)
              cv2.imshow(self.name, self.image)
            except Exception as e:
              print(e.args)
              pass
            finally:
              if cv2.waitKey(10) == 27:
                self.client.close()
                cv2.destroyAllWindows()
                break
    
      def Get_data(self):
        showThread = threading.Thread(target=self.RT_Image)
        showThread.start()
        showThread.join()
    
    
    if __name__ == '__main__':
      camera = Camera_Connect_Object()
      camera.Get_data()
    
    
在线观看中文字幕理论片