【发布时间】:2017-04-11 12:23:27
【问题描述】:
我目前正在使用 OpenCV 读取视频帧。
在服务器端,我使用 cPickle.dumps() 序列化帧:
flag, frame = cap.read()
frame = cPickle.dumps(frame)
client_socket.sendall(frame)
在客户端,我使用 cPickle.loads() 序列化帧:
data = sock.recv(4000)
frame = cPickle.loads(data) # ValueError: insecure string pickle
self.ImageLabel.configure(image=frame) # Want to show the frame in Tkinter
self.ImageLabel.image = frame
self.ImageLabel.grid(row=4, columnspan=40)
cPickle.loads(data) 导致 ValueError: insecure string pickle。我究竟做错了什么?我想在客户端读取框架并将其显示在 tkinter 窗口中。我到处查找了 9 个多小时,但找不到解决方案。
编辑 1:
我也试过这个:
服务器端
flag, frame = cap.read()
if flag:
size = sys.getsizeof(frame)
client_socket.send(str(size))
client_socket.sendall(cPickle.dumps(frame.tolist()))
客户端
size = sock.recv(4000)
data = sock.recv(int(size))
frame = cPickle.loads(data) # Causes EOFError
编辑 2: 服务器端
flag, frame = cap.read()
if flag:
frame = cPickle.dumps(frame)
size = len(frame)
p = struct.pack("I", size)
client_socket.send(p)
client_socket.sendall(frame)
客户端
sizep = sock.recv(struct.calcsize("I"))
data_size = struct.unpack("I",sizep)
print type (data_size) # tuple - has (11026730, )
data = sock.recv(int(data_size[0]))
frame = cPickle.loads(data) # ValueError: insecure string pickle
【问题讨论】:
-
@Jean-FrançoisFabre cap.read() 是 OpenCV 的一个函数。它给出了一个
对象 -
@Jean-FrançoisFabre cPickle.dumps(frame.tolist()) 在尝试 cPickle.load(data) 时会导致 EOFError。我不确定 self.ImageLabel.configure(image=frame) 是否接受 ndarray。
-
发送前可以打印
frame吗?似乎有些东西在这里损坏了...... -
@Jean-FrançoisFabre 打印帧结果:pasted.co/a6dce83c where frame = cPickle.dumps(frame.tolist())
-
你没有添加`...,`你自己吗?
标签: python sockets opencv tkinter