【发布时间】:2018-06-02 10:54:23
【问题描述】:
我正在尝试使用 python 通过 tcp 套接字从 opencv 发送和接收帧。 我使用 sys.getsizeof() 函数计算出 connection.recv(bytes) 的大小,以查看发送结束字节的大小,然后在服务器代码中使用它。 运行此代码时,我收到一些帧 5 到 10,然后我在服务器端收到错误:
_pickle.UnpicklingError: could not find MARK
并且客户端代码冻结并且什么都不做。
服务器代码:-
#server
import threading
import cv2
import socket
import time
import pickle
import sys
import numpy as np
class Receive(threading.Thread):
def __init__(self,RX_PORT):
threading.Thread.__init__(self)
self.daemon = True
self.rx_port = RX_PORT
self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.s.bind(('',self.rx_port))
def run(self):
self.s.listen(1)
self.c, self.addr = self.s.accept()
print('[+] Incoming Connection From '+str(self.addr))
while True:
self.data = self.c.recv(921781)
self.frame = pickle.loads(self.data)
cv2.imshow('RECV',self.frame)
def __del__(self):
self.s.close()
cv2.destroyAllWindows()
self.is_alive = False
RX = Receive(5550)
RX.start()
time.sleep(60)
客户端代码:-
#client code
import numpy as np
import cv2
import socket
import pickle
import sys
cap = cv2.VideoCapture(0)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',5550))
while(True):
ret, frame = cap.read()
data = pickle.dumps(frame)
s.sendall(data)
print(sys.getsizeof(data))
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
【问题讨论】:
标签: python sockets opencv pickle