我在弄清楚如何通过linux上的UDP套接字或命名管道(fifo)发送和接收图像(并显示图像,而不是保存图像)时遇到了困难。
使用UDP套接字,我遇到的问题是文件大小超过了最大缓冲区大小。从概念上讲,我可以按缓冲区大小的块对图像的字节数组进行迭代,但是我不确定如何实现此方法,或者如何在另一侧重建图像。
使用命名管道,下面是我的代码。
p1.py :
fifo_name = "fifoTest"
def Test():
img = cv2.imread("Lenna.png")
data = bytearray(img)
try:
os.mkfifo(fifo_name)
print("made fifo")
except FileExistsError:
print("fifo exists!")
with open(fifo_name, "wb", os.O_NONBLOCK) as f:
f.write(data)
f.close()
print("done!")
p1的一些问题是,我似乎无法弄清楚何时完成对管道的写入,而且无论其他管道发生什么情况,这通常会给BrokenPipeError
p2.py :
import os
import io
from PIL import Image
import cv2
pipe = os.open("fifoTest", os.O_RDONLY, os.O_NONBLOCK)
# img is 117966bytes as given by shell command wc -c < Lenna.png
imgBytes = os.read(pipe, 117966)
#img = Image.open(io.BytesIO(imgBytes))
print(imgBytes)
print(len(imgBytes))
#cv2.imshow("img", img)
input("there?")
有了p2和注释行,我没有问题。 input
捕获按键后,我没有收到任何错误,但是如前所述,关于管道破裂的p1错误。当img = Image.open(io.BytesIO(imgBytes))
取消注释时,我得到
img = Image.open(io.BytesIO(imgBytes))
File "/usr/local/lib/python3.5/dist-packages/PIL/Image.py", line 2585, in open
% (filename if filename else fp))
OSError: cannot identify image file <_io.BytesIO object at 0x7f21b84b0a98>
我觉得这不应该是一个难题,这是一个非常基本的操作。我需要以大约10fps的速度发生这种情况(这就是为什么我不考虑其他选项的原因)。我也几次遇到resource temporarily unavailable
错误,但是我认为os.O_NONBLOCK
标志解决了该问题。
我已经看过的东西(有些很有帮助,但是一旦收到图像我就需要显示它):
Sending image over sockets (ONLY) in Python, image can not be open
Send image using socket programming Python