繁体   English   中英

使用Raspberry Pi中的OpenCV和套接字通过TCP发送视频

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM