数传搞得差不多了,接下来搞图传。之前试过了rtmp推送,延迟比较大,而且共享服务器带宽不行,自己搭建rtmp服务器又有些麻烦。打算自己用python搞一个。
本人以前做树莓派坦克也有图传,是根据下文改的:
https://blog.csdn.net/huhumama0/article/details/9164873
但是今天发现用不了,原因是客户端现在是16.04,apt装的opencv不带cv2.cv了,以前是14.04可以。
后来又找了下面的文章。
https://www.cnblogs.com/jellify/archive/2017/12/14/8032277.html
发现这个程序还是有问题,我又改了改,主要是pack unpack长度不对。
import socket import cv2 import threading import struct import numpy class Camera_Connect_Object: def __init__(self,D_addr_port=["",8880]): self.resolution=[640,480] self.addr_port=D_addr_port self.src=888+20 self.interval=0 self.img_fps=20 def Set_socket(self): self.client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.client.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) def Socket_Connect(self): self.Set_socket() self.client.connect(self.addr_port) print("IP is %s:%d" % (self.addr_port[0],self.addr_port[1])) def RT_Image(self): self.name=self.addr_port[0]+" Camera" print self.resolution[0],self.resolution[1] self.client.send(struct.pack("fff", float(self.src),float(self.resolution[0]),float(self.resolution[1]))) while(1): info = struct.unpack("f", self.client.recv(4)) print int(info[0]) buf_size=int(info[0]) if buf_size: try: self.buf=b"" temp_buf=self.buf while(buf_size): temp_buf=self.client.recv(buf_size) buf_size-=len(temp_buf) self.buf+=temp_buf data = numpy.fromstring(self.buf, dtype='uint8') self.image = cv2.imdecode(data, 1) cv2.imshow(self.name, self.image) except: pass; finally: if(cv2.waitKey(10)==27): self.client.close() cv2.destroyAllWindows() break def Get_Data(self,interval): showThread=threading.Thread(target=self.RT_Image) showThread.start() if __name__ == '__main__': camera=Camera_Connect_Object() camera.addr_port[0]=input("Please input IP:") camera.addr_port=tuple(camera.addr_port) camera.Socket_Connect() camera.Get_Data(camera.interval) import socket import threading import struct import time import cv2 import numpy class Camera_Accept_Object: def __init__(self,S_addr_port=("",8880)): self.addr_port=S_addr_port self.Set_Socket(self.addr_port) def Set_Socket(self,S_addr_port): self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) self.server.bind(S_addr_port) self.server.listen(5) #print("the process work in the port:%d" % S_addr_port[1]) def check_option(object,client): info = struct.unpack("fff",client.recv(12)) print int(info[0]),int(info[1]),int(info[2]) if info[0]>888: object.img_fps=int(info[0])-888 object.resolution = (int(info[1]),int(info[2])) return 1 else: return 0 def RT_Image(object,client,D_addr): if(check_option(object,client)==0): return camera=cv2.VideoCapture(0) img_param=[int(cv2.IMWRITE_JPEG_QUALITY),object.img_fps] while(1): #time.sleep(0.1) _,object.img=camera.read() object.img=cv2.resize(object.img,object.resolution) _,img_encode=cv2.imencode('.jpg',object.img,img_param) img_code=numpy.array(img_encode) object.img_data=img_code.tostring() try: print len(object.img_data) client.send(struct.pack("f",len(object.img_data))) client.send(object.img_data) except: camera.release() return if __name__ == '__main__': camera=Camera_Accept_Object() while(1): client,D_addr=camera.server.accept() clientThread=threading.Thread(None,target=RT_Image,args=(camera,client,D_addr,)) clientThread.start()
