如何在Python中使用OpenCV对Webp格式进行内存编码/解码?

4
我正在尝试将90,000张webp格式的图片加载到内存中,并根据需要进行解码以提高速度。然而,我无法使以下测试代码对编码格式进行解码。希望能得到任何指针。
img = cv2.imread(file)
retval, buf = cv2.imencode(".webp", img, [cv2.IMWRITE_WEBP_QUALITY, 100])
img = cv2.imdecode(buf, 1)

imdecode_(''): 无法读取数据:OpenCV(4.1.0) /io/opencv/modules/imgcodecs/src/grfmt_webp.cpp:164: 错误:(-215: 断言失败) data.rows == 1 在函数 'readData' 中
3个回答

2
根据文档,您应该执行以下操作:
Original Answer翻译成“最初的回答”。
retval, buf = cv2.imencode(".webp", 
                           img, 
                           [cv2.IMWRITE_WEBP_QUALITY, 100])

img = cv2.imdecode(buf, 1)

谢谢,但是我得到了一个不同的错误。retval, buf = cv2.imencode(".webp", img, [cv2.IMWRITE_WEBP_QUALITY, 100]) img = cv2.imdecode(buf, 1) 现在出现了imdecode_(''):无法读取数据的错误:OpenCV(4.1.0) /io/opencv/modules/imgcodecs/src/grfmt_webp.cpp:164: error: (-215:Assertion failed) data.rows == 1 in function 'readData' - jl303
我想当使用 imdecode 时,一定有一个标志指示图像大小和格式。但是我无法在任何地方找到参考资料。 - Quang Hoang
1
类型和维度都包含在WEBP编码的缓冲区中。只需将第二行更改为“numpyarray = cv2.imdecode(np.frombuffer(buf,dtype=np.uint8),1)”即可。 - Mark Setchell
@MarkSetchell cv2.imdecode(np.frombuffer(buf,dtype=np.uint8),1)会出现imdecode_('')错误: 无法读取数据: OpenCV(4.1.0) /io/opencv/modules/imgcodecs/src/grfmt_webp.cpp:164: 错误: (-215:断言失败) data.rows == 1 in function 'readData'。同时,retval, buf = cv2.imencode(".webp", img, [cv2.IMWRITE_WEBP_QUALITY, 100])已经返回了numpy数组。type(buf) <class 'numpy.ndarray'>,buf.shape [28208, 1]。 - jl303
看起来像是v4.1.0。不确定出了什么问题,我在v3.4上肯定可以工作,但我会再做些实验。 - Mark Setchell
显示剩余3条评论

0

0

我将opencv-python升级到4.5.1.48版本并解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接