![](/img/trans.png)
[英]Send Sensor Data & Stream Video Over Bluetooth (Raspberry Pi to PC)
[英]Send Video over TCP using OpenCV and sockets in Raspberry Pi
我一直在尝试将我的客户端(Raspberry Pi)的实时视频帧发送到笔记本电脑上托管的服务器。 这两个设备都连接到同一网络。
Server.py
import socket
import sys
import cv2
import pickle
import numpy as np
import struct
HOST = '192.168.1.3'
PORT = 8083
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
s.bind((HOST, PORT))
print 'Socket bind complete'
s.listen(10)
print 'Socket now listening'
conn, addr = s.accept()
data = ""
payload_size = struct.calcsize("L")
while True:
while len(data) < payload_size:
data += conn.recv(4096)
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(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
frame=pickle.loads(frame_data)
print frame.size
# cv2.imshow('frame', frame)
# cv2.waitKey(10)
Client.py
import cv2
import numpy as np
import socket
import sys
import pickle
import struct
cap = cv2.VideoCapture(0)
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('192.168.1.3', 8081))
while True:
ret,frame = cap.read()
data = pickle.dumps(frame)
clientsocket.sendall(struct.pack("L", len(data)) + data)
笔记本电脑上的服务器没有收到任何数据 。 但是当我在相同设备(例如笔记本电脑上的服务器和客户端)上运行此客户端和服务器时,它正常工作。
我能够从覆盆子发送数据到笔记本电脑(测试回声应用程序)。
谁能帮我这个 ?
根据我的理解,您应该为客户端和服务器使用相同的端口,但您使用的是两个不同的端口,8083和8081。
您是否检查过防火墙是否为所使用的端口打开?
经过数小时的分析后,为什么server.py和client.py无法正常工作(即使在防火墙被禁用后),server.py代码中也出现错误:“word不应该是字符串”。 因此,word =“”(这是一个字符串)应该更改为word = b''(这些是两个单引号来表示一个字节)。
使用下面的代码创建一个文件,通过运行例如python "C:\\path\\toFile\\streamTestServer.py"
在Windows上的Powershell中运行服务器代码
代码是:
import socket
import sys
import cv2
import pickle
import numpy as np
import struct
HOST = '127.0.0.1'
PORT = 8083
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
s.bind((HOST, PORT))
print('Socket bind complete')
s.listen(10)
print('Socket now listening')
conn, addr = s.accept()
data = b''
payload_size = struct.calcsize("L")
while True:
while len(data) < payload_size:
data += conn.recv(4096)
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(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
frame=pickle.loads(frame_data)
print(frame.size)
cv2.imshow('frame', frame)
cv2.waitKey(10)
然后在Python IDLE或Powershell的另一个窗口中运行客户端。 客户代码是:
import cv2
import numpy as np
import socket
import sys
import pickle
import struct
cap = cv2.VideoCapture(0)
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('127.0.0.1', 8083))
while True:
ret,frame = cap.read()
data = pickle.dumps(frame)
clientsocket.sendall(struct.pack("L", len(data)) + data)
现在您从localhost客户端流向localhost服务器。
使用这个相同的程序,我在覆盆子pi上接收数据时遇到了问题。 我发现这是因为在不同的机器上使用无符号长度的“L”之间的区别。 至少对我来说,他们在不同机器上的原生代表是不同的。 我通过在格式字符串中添加“=”来修复此问题,以强制struct使用标准大小“L”(4)解压缩。
payload_size = struct.calcsize("=L")
和
clientsocket.sendall(struct.pack("=L", len(data)) + data)
等等
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.