首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python opencv中从数组中读取原始png?

如何在python opencv中从数组中读取原始png?
EN

Stack Overflow用户
提问于 2012-07-19 09:59:57
回答 6查看 37.4K关注 0票数 15

我正在通过tcp将png图像从我的iPhone传输到我的MacBook。MacBook代码来自http://docs.python.org/library/socketserver.html#requesthandler-objects。如何将图像转换为OpenCV使用?选择png是因为它们是有效的,但也可以使用其他格式。

我写了一个测试程序,从文件中读取rawImage,但不确定如何转换它:

代码语言:javascript
复制
# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', "rb")
rawImage = f.read()
f.close()

# Not sure how to convert rawImage
npImage = np.array(rawImage)
matImage = cv2.imdecode(rawImage, 1)

#show it
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0)
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-07-22 23:17:56

我想通了:

代码语言:javascript
复制
# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', "rb")
rawImage = f.read()
f.close()

# Convert rawImage to Mat
pilImage = Image.open(StringIO(rawImage));
npImage = np.array(pilImage)
matImage = cv.fromarray(npImage)

#show it
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0) 
票数 2
EN

Stack Overflow用户

发布于 2015-12-27 05:09:41

@Andy Rosenblum的作品,如果使用过时的cv python API (vs. cv2),它可能是最好的解决方案。

但是,由于最新版本的用户对此问题同样感兴趣,因此我建议使用以下解决方案。下面的示例代码可能比接受的解决方案更好,因为:

  1. 它与较新的OpenCV python API (cv2 vs. cv)兼容。该解决方案在opencv 3.0和python 3.0下进行了测试。我相信OpenCV2.x和/或Python2.7x只需要很小的修改,
  2. 的导入更少。这一切都可以用numpy和opencv直接完成,不需要StringIO和PIL。

下面是如何创建直接从文件对象或从文件对象读取的字节缓冲区解码的opencv图像。

代码语言:javascript
复制
import cv2
import numpy as np

#read the data from the file
with open(somefile, 'rb') as infile:
     buf = infile.read()

#use numpy to construct an array from the bytes
x = np.fromstring(buf, dtype='uint8')

#decode the array into an image
img = cv2.imdecode(x, cv2.IMREAD_UNCHANGED)

#show it
cv2.imshow("some window", img)
cv2.waitKey(0)

请注意,在opencv 3.0中,各种常量/标志的命名约定已更改,因此如果使用opencv 2.x,则需要更改标志cv2.IMREAD_UNCHANGED。此代码示例还假设您正在加载一个标准的8位图像,但如果不是,您可以使用dtype='...‘np.fromstring中的标志。

票数 20
EN

Stack Overflow用户

发布于 2013-07-09 19:50:47

另一种方式,

此外,在读取实际文件的情况下,这将适用于unicode路径(在windows上测试)

代码语言:javascript
复制
with open(image_full_path, 'rb') as img_stream:
    file_bytes = numpy.asarray(bytearray(img_stream.read()), dtype=numpy.uint8)
    img_data_ndarray = cv2.imdecode(file_bytes, cv2.CV_LOAD_IMAGE_UNCHANGED)
    img_data_cvmat = cv.fromarray(img_data_ndarray) #  convert to old cvmat if needed
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11552926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档