gpt4 book ai didi

python - 如何使用外部 USB 摄像头数据正确格式化 PIL.Image.frombytes

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:28 25 4
gpt4 key购买 nike

我很难读取从 USB 摄像头收到的数据并正确显示它。我成功了,但我担心我做错了什么,因为我的解决方案很糟糕。

我正在使用的 USB 摄像头 ( ui-1640le ) 返回一个我想要显示的字节数组。我用过PIL.Image.frombytes("RGB", (imageWidth, imageHeight), image_bytes)但我得到的图像是黑白的并且重复出现: Image result

我尝试使用"L"格式。 PIL.Image.frombytes("L", (imageWidth, imageHeight), image_bytes)看看会发生什么,我得到:this B&W image 。除了黑白之外,图像看起来是正确的,并且该函数只读取了三分之一的数据。

所以我用以下代码对数据进行逆向工程:

# Reorder the bytes structure
x=[]
for i in range(width*height):
x += [img[i],img[i+width*height],img[i+2*width*height]]
image_bytes = bytes(x)


# Create a PIL Image
im = PIL.Image.frombytes("RGB", (imageWidth, imageHeight), image_bytes)

# Not sure why the image is flipped, but this fixes it
im.rotate(-90).transpose(PIL.Image.FLIP_LEFT_RIGHT).show()

之后我终于得到了它应该是的图片:final image

这个解决方案对于读取相机输入有意义吗?我做错了什么吗?我缺少更直接的方法吗?

最佳答案

虽然您将平面交错数据打包为像素交错数据的方法可行,但您几乎肯定会发现 Numpy 方法要快数十倍。

首先,我将综合您的输入数据:

import numpy as np

# Height, width and bytes per image channel
h,w = 100,256
bpc = h * w

# Now make the first (red) plane = 255, the second (green) plane = 127 and the final (blue) plane = 0
img = bytes(b"\xff"*bpc) + bytes(b"\x7f"*bpc) + bytes(b"\x00"*bpc)

因此,img 现在应该是您可能获得的具有代表性的 100x256 橙色图像。然后我将交错数据并使用 Numpy 制作像这样的 PIL 图像:

from PIL import Image

# Make a Numpy array for each channel's pixels
R = np.frombuffer(img, dtype=np.uint8, count=bpc).reshape((h,w))
G = np.frombuffer(img, dtype=np.uint8, count=bpc, offset=bpc).reshape((h,w))
B = np.frombuffer(img, dtype=np.uint8, count=bpc, offset=2*bpc).reshape((h,w))

# Interleave the pixels from RRRRRRGGGGGGBBBBBB to RGBRGBRGBRGBRGB
RGB = np.dstack((R,G,B))

# Make PIL Image from Numpy array
pImage = Image.fromarray(RGB)

在我的机器上这需要 30 微秒,而使用 for 循环需要 7 毫秒,所以速度快了 230 倍。

enter image description here

关键字:Python、Numpy、PIL、图像处理、交错、交错、去交错、平面、按像素、按平面、打包、解包。

关于python - 如何使用外部 USB 摄像头数据正确格式化 PIL.Image.frombytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59745279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com