解释cv2.imencode结果

时间:2017-06-02 12:11:04

标签: python opencv jpeg

cv2.imencode表示的缓冲区是什么?

以下是1x1像素图像的示例。

import cv2
impor numpy as np

img= np.zeros((1,1,3),np.uint8)
en= cv2.imencode('.jpg',img)
print type(en)
<type 'tuple'>
print en[1].shape
(631, 1)

由于某种原因,当图像尺寸发生变化时,缓冲区的大小没有改变:

img= np.zeros((10,10,3),np.uint8)
en= cv2.imencode('.jpg',img)
en[1].shape
(631, 1)

更新:对于更大的图片,它的大小不同。

img= np.zeros((1000,1000,3),np.uint8)
en= cv2.imencode('.jpg',img)
en[1].shape
(16503, 1)

随机数据:

img= (np.random.rand(1,1,3)*255).astype(np.uint8)
en= cv2.imencode('.jpg',img)
en[1].shape
(634, 1)

img= (np.random.rand(10,10,3)*255).astype(np.uint8)
en= cv2.imencode('.jpg',img)
en[1].shape
(899, 1)

img= (np.random.rand(1000,1000,3)*255).astype(np.uint8)
en= cv2.imencode('.jpg',img)
en[1].shape
(1175962, 1)

2 个答案:

答案 0 :(得分:1)

根据cv2.imencode文档

  

注意:cvEncodeImage返回CV_8UC1类型的单行矩阵   包含编码图像作为字节数组。

所以基本上输出取决于你定义的图像格式.png.jpg等,每种格式都有自己的血清化约定,cv2.imencode就是这样做的。它还包含一些与该图像格式相关的元数据,例如:压缩级别等,以及像素数据。

答案 1 :(得分:0)

内存操作比入门教程中记录的要少,大多数在线建议会指导您写入磁盘,然后从磁盘读取。

或者,您可能想做的是创建一个内存中表示形式,以发送到视频或发送到数据库,或者...磁盘是它们唯一的去处。

您的原始代码创建了CV2尚未解释的内存缓冲区。这等效于imwrite

img= (np.random.rand(1000,1000,3)*255).astype(np.uint8)
en = cv2.imencode('.jpg',img)

写入磁盘时,将产生1像素宽的JPEG。要使CV2正确解释数据,您需要对其进行解码(相当于imread

de = cv2.imdecode(en,cv2.IMREAD_GRAYSCALE)

这会导致CV2正确解释数据,使其适合写入图像文件,帧或视频。

cv2.imwrite('test.jpg',de)
video.write(de)