读取 RGB 原始输入,转换为 openCV 对象,然后转换为 .JPEG 字节 - 无 PIL

Reading RGB raw input, converting to openCV object, then converting to .JPEG bytes - without PIL

我正在努力从缓冲区读取原始 RGB 图像流,转换为 openCV (numpy) 数组并在不使用 PIL 的情况下编码回 .jpg 字节。我可以使用 PIL 实现此目的,但无法弄清楚如何使用 numpy/opencv:

实现相同的目的

使用 PIL 读取 RBG 原始流(有效):

PILFr = Image.frombuffer('RGB',(768,576),buf,"raw",'RGB',0,1)
opencvPILFr = np.array(PILFr)

尝试使用 openCV 进行类似读取,我有:

FlatNp=np.frombuffer(buf,dtype=np.uint8, count=-1)
opencvPILFr=np.resize(FlatNp,(576,768))

使用 PIL(有效)将缓冲区 (self.frame) 重新编码为 JPEG 字节流:

PILFr=Image.fromarray(cv2.cvtColor(opencvPILFr, cv2.COLOR_BGR2RGB))
tmp = io.BytesIO()
PILFr.save(tmp,format='jpeg', quality=100)
self.frame = tmp.getvalue()

正在尝试使用 openCV 重新编码(无效!):

tmp = io.BytesIO()
tmp=cv2.imencode(".jpg",opencvPILFr) #this returns a tuple? not numpy array?
self.frame=tmp.tobytes()

感谢您的帮助 - 我可以看出上述内容不起作用的一些原因...但看不出如何解决它。

我想通了。欢迎进一步改进。仍然不完全确定我理解 imencode 返回的元组的形状和内容。

请参阅下面我对上述 PIL 方法的 numpy/opencv 替代方法:

从缓冲区读取 RBG 24 位图像并转换为 openCV 的 numpy 数组 (opencvFr):

FlatNp=np.frombuffer(buf,dtype=np.uint8, count=-1)
opencvFr=np.resize(FlatNp,(576,768,3))

将编辑后的 ​​numpy 图像数组 (opencvFr) 编码为 JPEG 字节:

tmp=cv2.imencode('.jpg',opencvFr) #this returns a tuple.
self.frame=tmp[1].tobytes() #bytes containing compressed JPEG image

(我正在为流媒体相机应用程序进行试验)