Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解释cv2.imencode结果_Python_Opencv_Jpeg - Fatal编程技术网

Python 解释cv2.imencode结果

Python 解释cv2.imencode结果,python,opencv,jpeg,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((1000,1000,3),np.uint8) en= cv2

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((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)
根据文件

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

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

如文档所示

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


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

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

或者,您可能会尝试创建一个内存中的表示,用于发送到视频,或发送到数据库,或。。。磁盘不是它们唯一要去的地方

您的原始代码创建了一个未被CV2解释的内存缓冲区。这相当于imwrite

写入磁盘时会产生1像素宽的JPEG。为了让CV2正确解释数据,您需要将其解码为等同于imread

这使得CV2能够正确解释数据,使其适合写入图像文件、帧或视频

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

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

或者,您可能会尝试创建一个内存中的表示,用于发送到视频,或发送到数据库,或。。。磁盘不是它们唯一要去的地方

您的原始代码创建了一个未被CV2解释的内存缓冲区。这相当于imwrite

写入磁盘时会产生1像素宽的JPEG。为了让CV2正确解释数据,您需要将其解码为等同于imread

这使得CV2能够正确解释数据,使其适合写入图像文件、帧或视频

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

这并不能让事情变得更清楚。结果是二维的,这很奇怪。我只想得到一个字节对象,它包含在一个更大的消息中,通过网络写入,然后由非python程序转换为图像。我试图将从cv2.imencode返回的缓冲区保存到一个二进制文件中,但该文件是通过cv2.imsave直接保存的文件的两倍。在将缓冲区保存到二进制文件之前,是否有任何函数可用于压缩缓冲区?您始终可以使用:with openname.bin,wb as f:f.writebuffer\u from\u imwriteth将cv2.imwrite的输出写入二进制文件,但这并不能使其更清晰。结果是二维的,这很奇怪。我只想得到一个字节对象,它包含在一个更大的消息中,通过网络写入,然后由非python程序转换为图像。我试图将从cv2.imencode返回的缓冲区保存到一个二进制文件中,但该文件是通过cv2.imsave直接保存的文件的两倍。在将缓冲区保存到二进制文件之前,是否有任何函数可用于压缩缓冲区?您始终可以使用以下命令将cv2.imwrite的输出写入二进制文件:with openname.bin,wb as f:f.writebuffer\u from\u imwrite返回两个值,第一个是操作是否成功,第二个是编码图像。在您的第一个代码段中,en应该是tuple。要使cv2.imdecode工作,您需要使用en[1]而不是en。返回两个值,第一个是操作是否成功,第二个是编码图像。在您的第一个代码段中,en应该是tuple。要使cv2.imdecode工作,您需要使用en[1]而不是en。
de = cv2.imdecode(en,cv2.IMREAD_GRAYSCALE)
cv2.imwrite('test.jpg',de)
video.write(de)