├── README.md ├── server.py └── client.py /README.md: -------------------------------------------------------------------------------- 1 | # Python3-Opencv-socket 2 | by-黑小马 3 | -------------------------------------------------------------------------------- /server.py: -------------------------------------------------------------------------------- 1 | import socket; 2 | import threading; 3 | import struct; 4 | import cv2 5 | import time 6 | import os 7 | import numpy 8 | 9 | class webCamera: 10 | def __init__(self, resolution = (640, 480), host = ("127.0.0.1", 7999)): 11 | self.resolution = resolution; 12 | self.host = host; 13 | self.setSocket(self.host); 14 | self.img_quality = 15 15 | def setImageResolution(self, resolution): 16 | self.resolution = resolution; 17 | def setHost(self, host): 18 | self.host = host; 19 | def setSocket(self, host): 20 | self.socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM); 21 | self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1); 22 | self.socket.bind(self.host); 23 | self.socket.listen(5); 24 | print("Server running on port:%d" % host[1]); 25 | def recv_config(self,client): 26 | info = struct.unpack("lhh",client.recv(8)); 27 | if info[0]>911: #print(info[0]) 28 | self.img_quality=int(info[0])-911 29 | self.resolution=list(self.resolution) 30 | self.resolution[0]=info[1] 31 | self.resolution[1]=info[2] 32 | self.resolution=tuple(self.resolution) 33 | return 1 34 | else : 35 | return 0 36 | def _processConnection(self, client,addr): 37 | if(self.recv_config(client)==0): 38 | return 39 | camera = cv2.VideoCapture(0) 40 | encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),self.img_quality] 41 | f = open("video_info.txt", 'a+') 42 | print("Got connection from %s:%d" % (addr[0], addr[1]),file=f); 43 | print("像素为:%d * %d"%(self.resolution[0],self.resolution[1]),file=f) 44 | print ("打开摄像头成功",file=f) 45 | print("连接开始时间:%s"%time.strftime("%Y-%m-%d %H:%M:%S", 46 | time.localtime(time.time())),file=f) 47 | f.close() 48 | while(1): 49 | time.sleep(0.13) 50 | (grabbed, self.img) = camera.read() 51 | self.img = cv2.resize(self.img,self.resolution) 52 | result, imgencode = cv2.imencode('.jpg',self.img,encode_param) 53 | img_code = numpy.array(imgencode) 54 | self.imgdata = img_code.tostring() 55 | try: 56 | client.send(struct.pack("lhh",len(self.imgdata),self.resolution[0],self.resolution[1])+self.imgdata); #发送图片信息(图片 长度,分辨率,图片内容) 57 | except: 58 | f = open("video_info.txt", 'a+') 59 | print("%s:%d disconnected!" % (addr[0], addr[1]),file=f); 60 | print("连接结束时间:%s"%time.strftime("%Y-%m-%d %H:%M:%S", 61 | time.localtime(time.time())),file=f) 62 | print("****************************************",file=f) 63 | camera.release() 64 | f.close() 65 | return; 66 | def run(self): 67 | while(1): 68 | client,addr = self.socket.accept(); 69 | clientThread = threading.Thread(target = self._processConnection, 70 | args = (client, addr, )); #有客户端连接时产生新的线程进行处理 71 | clientThread.start(); 72 | 73 | 74 | if __name__ == "__main__": 75 | cam = webCamera(); 76 | cam.run(); 77 | -------------------------------------------------------------------------------- /client.py: -------------------------------------------------------------------------------- 1 | import socket; 2 | import threading; 3 | import struct; import os; 4 | import time; import sys; 5 | import numpy 6 | import cv2 7 | import re 8 | class webCamConnect: 9 | def __init__(self, resolution = [640,480], remoteAddress = ("127.0.0.1",7999), windowName = "video"): 10 | self.remoteAddress = remoteAddress; 11 | self.resolution = resolution; 12 | self.name = windowName; 13 | self.mutex = threading.Lock(); 14 | self.src=911+15 15 | self.interval=0 16 | self.path=os.getcwd() 17 | self.img_quality = 15 18 | def _setSocket(self): 19 | self.socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM); 20 | self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1); 21 | def connect(self): 22 | self._setSocket(); 23 | self.socket.connect(self.remoteAddress); 24 | def _processImage(self): 25 | self.socket.send(struct.pack("lhh",self.src,self.resolution[0],self.resolution[1])); 26 | while(1): 27 | info = struct.unpack("lhh",self.socket.recv(8)); 28 | bufSize = info[0]; 29 | if bufSize: 30 | try: 31 | self.mutex.acquire(); 32 | self.buf=b'' 33 | tempBuf=self.buf; 34 | while(bufSize): #循环读取到一张图片的长度 35 | tempBuf = self.socket.recv(bufSize); 36 | bufSize -= len(tempBuf); 37 | self.buf += tempBuf; 38 | data = numpy.fromstring(self.buf,dtype='uint8') 39 | self.image=cv2.imdecode(data,1) 40 | cv2.imshow(self.name,self.image) 41 | except: 42 | print("接收失败") 43 | pass; 44 | finally: 45 | self.mutex.release(); 46 | if cv2.waitKey(10) == 27: 47 | self.socket.close() 48 | cv2.destroyAllWindows() 49 | print("放弃连接") 50 | break 51 | def getData(self, interval): 52 | showThread=threading.Thread(target=self._processImage); 53 | showThread.start(); 54 | if interval != 0: # 非0则启动保存截图到本地的功能 55 | saveThread=threading.Thread(target=self._savePicToLocal,args = (interval, 56 | )); 57 | saveThread.setDaemon(1); 58 | saveThread.start(); 59 | def setWindowName(self, name): 60 | self.name = name; 61 | def setRemoteAddress(remoteAddress): 62 | self.remoteAddress = remoteAddress; 63 | def _savePicToLocal(self, interval): 64 | while(1): 65 | try: 66 | self.mutex.acquire(); 67 | path=os.getcwd() + "\\" + "savePic"; 68 | if not os.path.exists(path): 69 | os.mkdir(path); 70 | cv2.imwrite(path + "\\" + time.strftime("%Y%m%d-%H%M%S", 71 | time.localtime(time.time())) + ".jpg",self.image) 72 | except: 73 | pass; 74 | finally: 75 | self.mutex.release(); 76 | time.sleep(interval); 77 | def check_config(self): 78 | path=os.getcwd() 79 | print(path) 80 | if os.path.isfile(r'%s\video_config.txt'%path) is False: 81 | f = open("video_config.txt", 'w+') 82 | print("w = %d,h = %d" %(self.resolution[0],self.resolution[1]),file=f) 83 | print("IP is %s:%d" %(self.remoteAddress[0],self.remoteAddress[1]),file=f) 84 | print("Save pic flag:%d" %(self.interval),file=f) 85 | print("image's quality is:%d,range(0~95)"%(self.img_quality),file=f) 86 | f.close() 87 | print("初始化配置"); 88 | else: 89 | f = open("video_config.txt", 'r+') 90 | tmp_data=f.readline(50)#1 resolution 91 | num_list=re.findall(r"\d+",tmp_data) 92 | self.resolution[0]=int(num_list[0]) 93 | self.resolution[1]=int(num_list[1]) 94 | tmp_data=f.readline(50)#2 ip,port 95 | num_list=re.findall(r"\d+",tmp_data) 96 | str_tmp="%d.%d.%d.%d"%(int(num_list[0]),int(num_list[1]),int(num_list[2]),int(num_list[3])) 97 | self.remoteAddress=(str_tmp,int(num_list[4])) 98 | tmp_data=f.readline(50)#3 savedata_flag 99 | self.interval=int(re.findall(r"\d",tmp_data)[0]) 100 | tmp_data=f.readline(50)#3 savedata_flag 101 | #print(tmp_data) 102 | self.img_quality=int(re.findall(r"\d+",tmp_data)[0]) 103 | #print(self.img_quality) 104 | self.src=911+self.img_quality 105 | f.close() 106 | print("读取配置") 107 | def main(): 108 | print("创建连接...") 109 | cam = webCamConnect(); 110 | cam.check_config() 111 | print("像素为:%d * %d"%(cam.resolution[0],cam.resolution[1])) 112 | print("目标ip为%s:%d"%(cam.remoteAddress[0],cam.remoteAddress[1])) 113 | cam.connect(); 114 | cam.getData(cam.interval); 115 | if __name__ == "__main__": 116 | main(); --------------------------------------------------------------------------------