【发布时间】:2020-04-22 12:35:54
【问题描述】:
我正在尝试使用 Python 套接字将网络摄像头流从 server.py 文件发送到 client.py 文件。我让它在另一个方向工作,但想要翻转它(当客户端连接到服务器时,服务器会将网络摄像头数据从服务器提供给客户端)。但是,尝试运行此类会导致错误,并且只会显示流的第一帧,然后崩溃......我该怎么做才能解决这个问题?
server.py
import cv2
import io
import socket
import struct
import time
import pickle
import zlib
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1234))
s.listen(5)
cam = cv2.VideoCapture(0)
cam.set(3, 320);
cam.set(4, 240);
img_counter = 0
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 100]
while True:
client_socket, address = s.accept()
print(f"Connection from {address} has been established!")
ret, frame = cam.read()
result, frame = cv2.imencode('.jpg', frame, encode_param)
data = pickle.dumps(frame, 0)
size = len(data)
print("{}: {}".format(img_counter, size))
client_socket.send(struct.pack(">L", size) + data)
print("ooga")
img_counter += 1
cam.release()
client.py
import socket
import sys
import cv2
import pickle
import numpy as np
import struct ## new
import zlib
HOST=''
PORT=8485
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(),1234))
data = b""
payload_size = struct.calcsize(">L")
print("payload_size: {}".format(payload_size))
while True:
while len(data) < payload_size:
print("Recv: {}".format(len(data)))
data += s.recv(4096)
print("Done Recv: {}".format(len(data)))
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack(">L", packed_msg_size)[0]
print("msg_size: {}".format(msg_size))
while len(data) < msg_size:
data += s.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
frame=pickle.loads(frame_data, fix_imports=True, encoding="bytes")
frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
cv2.imshow('ImageWindow',frame)
cv2.waitKey(1)
【问题讨论】:
标签: python image sockets opencv raspberry-pi