读取 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
(我正在为流媒体相机应用程序进行试验)
我正在努力从缓冲区读取原始 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
(我正在为流媒体相机应用程序进行试验)