<p>我用websockets在两台机器之间传输数据。您在机器1中获取图像并将其流式传输到机器2,后者正在侦听某个端口上的连接。</p>
<p>机器1(客户端):</p>
<pre><code>cap=cv2.VideoCapture(0)
clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect(('localhost',8089))
while(cap.isOpened()):
ret,frame=cap.read()
memfile = StringIO.StringIO()
np.save(memfile, frame)
memfile.seek(0)
data = json.dumps(memfile.read().decode('latin-1'))
clientsocket.sendall(struct.pack("L", len(data))+data)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
</code></pre>
<p>机器2(服务器线程):</p>
<pre><code>self.isRunning = True
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
s.bind((self.hostname, self.port))
print 'Socket bind complete'
data = ""
payload_size = struct.calcsize("L")
s.listen(10)
print 'Socket now listening'
while self.isRunning:
conn, addr = s.accept()
while True:
data = conn.recv(4096)
if data:
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0]
while len(data) < msg_size:
data += conn.recv(10000)
frame_data = data[:msg_size]
memfile = StringIO.StringIO()
memfile.write(json.loads(frame_data).encode('latin-1'))
memfile.seek(0)
frame = numpy.load(memfile)
ret, jpeg = cv2.imencode('.jpg', frame)
self.jpeg = jpeg
self.connected = True
else:
conn.close()
self.connected = False
break
self.connected = False
</code></pre>
<p>注意,json序列化程序大大提高了序列化过程的性能,特别是与pickle相比,正如本书中所解释的那样。</p>
<p>可以找到源代码<a href="https://github.com/rena2damas/remote-opencv-streaming-live-video" rel="nofollow noreferrer">here</a>。</p>