簡述
一開始覺得這個(gè)很有趣,然后就想來做一個(gè)來玩一下
使用語言: Python3
使用工具:opencv視頻監(jiān)控 + socket數(shù)據(jù)傳輸技術(shù)
程序檢驗(yàn): 這里我考慮了一下,發(fā)現(xiàn)還是沒有必要實(shí)現(xiàn)封裝成可執(zhí)行文件。還是直接就放代碼吧。(先放代碼,以后再做解釋)
本程序,經(jīng)過本人修改,保證可以使用
使用要求:
Sender代碼必須要在一臺(tái)有攝像頭的電腦上運(yùn)行起來。然后把數(shù)據(jù)編碼,壓縮之后,再傳給另外一個(gè)電腦
Reciever作為接受端,沒什么特別的要求。
兩個(gè)電腦都必須要按轉(zhuǎn)好numpy + opencv (安裝方法的話,在我的opencv文集中有一篇就是寫這個(gè)的)
對(duì)了,我的接受端關(guān)閉操作是(輸入鍵盤中的 Esc)這樣就可以退出監(jiān)控。
發(fā)送端是關(guān)閉不了這個(gè)監(jiān)控的
至于這個(gè)IP地址的設(shè)置:我寫的都是接受端的地址。端口隨便設(shè)置的
局限性:
本程序目前只能在局域網(wǎng)內(nèi)進(jìn)行實(shí)時(shí)監(jiān)控。
改進(jìn)思路:
如果想擴(kuò)展成一個(gè)廣域網(wǎng)上的。(就可以用一個(gè)廣域網(wǎng)上的服務(wù)器做中轉(zhuǎn)站)
而且,上述的方法,如果能找到一臺(tái)肉雞,還可以避免探測到對(duì)應(yīng)的監(jiān)控對(duì)象的ip地址
代碼
Sender(發(fā)送端代碼)
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()
以上這篇Python3遠(yuǎn)程監(jiān)控程序的實(shí)現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
