Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用OpenCV和Raspberry Pi中的套接字通过TCP发送视频_Python_Sockets_Opencv_Raspberry Pi_Client Server - Fatal编程技术网

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

Python 使用OpenCV和Raspberry Pi中的套接字通过TCP发送视频,python,sockets,opencv,raspberry-pi,client-server,Python,Sockets,Opencv,Raspberry Pi,Client Server,我一直在尝试从我的客户端(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 'Soc

我一直在尝试从我的客户端(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)
我的笔记本电脑服务器未接收任何数据。但当我在相同的设备上运行这个客户机和服务器(例如,笔记本电脑上的服务器和客户机)时,它工作正常

我能够将数据从树莓发送到笔记本电脑(针对echo应用程序进行了测试)


有人能帮我吗?

根据我的理解,客户端和服务器应该使用相同的端口,但使用的是两个不同的端口,8083和8081


您是否已检查所用端口的防火墙是否已打开?

经过数小时的分析,为什么server.py和client.py无法工作(即使在禁用防火墙之后),server.py代码中出现错误:“word不应是字符串”。因此,word=“”(这是一个字符串)应更改为word=b“”(这两个单引号表示一个字节)

使用下面的代码创建一个文件,例如,在Windows上的Powershell中运行服务器代码
python“C:\path\toFile\streamTestServer.py”

代码是:

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)

现在您正在从localhost客户端流式传输到localhost服务器。

使用相同的程序,我在接收raspberry pi上的数据时遇到问题。我发现这是因为不同机器上使用“L”表示无符号long的方式不同。至少对我来说,它们在不同机器上的本机表示是不同的。我通过在格式字符串中添加一个“=”来修复这个问题,以强制struct使用标准大小的“L”(4)解包


等等

我不明白为什么你要用TCP来进行视频流,而不是UDP,因为UDP是专门用于这种用途的。即使我把端口号放在同一个位置上,问题仍然是一样的。所有防火墙规则都允许在该端口上进行连接。您是否检查过主机的实际IP(由ipconfig获得)是否与您在程序中使用的IP相同?ping在两个方向都有效吗?我遇到的问题是服务器中的“有效负载大小”得到了一个非常大的值(789874543132138489797974964),因此程序处于无限循环中。您能分享完整的代码吗?我在你的server.py代码中看不到“word=”你说得对,在这个小改动生效后,谢谢!
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)
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)
payload_size = struct.calcsize("=L")
clientsocket.sendall(struct.pack("=L", len(data)) + data)