cv2 如何从图片文件流获取image对象

我最近需要对图像做一些处理,当我经过一系列协议解析和解码获取到图片流的时候,下一步需要用cv2对图片进行处理,首先就需要拿到cv2的图片对象。
一般情况是
import cv2
img = cv2.imread("test.jpg")
这样就能直接拿到img对象。
可是我想在内存中直接转换,不想写入文件,再用cv2读入,这样就能少一个图片缓存的步骤。
各位大神帮下忙,我鼓捣半天了,该怎么实现呢?
比如
fc= open("test.jpg","rb").read()
这时候fc就是图片的文件流,这与我处理得到的文件流是一样的。
那么现在我该如何用cv2读入呢?
cv2.imread(fc)是肯定不对的。

阅读 8.6k
2 个回答

一楼讲的很认真,逻辑也没毛病,但是很遗憾答非所问。


fc= open("test.jpg","rb").read() 

#将fc文件字符流,转化为numpy数组
#其实就是将fc中的字符流中的每个字符转换为对应的ascii码值
#然后保存在np数组中,fc中字符的ascii码对应数组中的一个元素)
#假如fc文件字符流由100个字符构成,那么fileNPArry数组的宽度就等于100)
fileNPArray = np.fromstring(fc, np.uint8)


#cv2.IMREAD_COLOR 以彩色模式读入
#cv2.IMREAD_GRAYSCALE 以灰色模式读入
img = cv2.imdecode(fileNPArray ,cv2.IMREAD_COLOR)

#此时的img 就是你曾经通过cv2.imread()方法导入的图片对象了 

python3 cv2

>>> import cv # cv2
>>> url='http://i5.qhimg.com/t019c3e49c9c9319c33.jpg'
>>> def get_net_img(url):
    img = None
    cap=cv.VideoCapture(url)
    if cap.isOpened():
        ret,img=cap.read()
    return img

>>> img = get_net_img(url)
>>> cv.imshow('photo', img)
>>> 

方法2

# 方法2
import cv
import requests as req
import numpy as np

url2 = r'https://avatar-static.segmentfault.com/253/210/2532103026-593f867b9c17e'
rsp = req.get(url2)
cont = rsp.content
buf = np.asarray(bytearray(cont), dtype="uint8") # 转换为numpy数组
img = cv.imdecode(buf, cv.IMREAD_COLOR) # 解码成图片
cv.imshow('pic', img) # 头像
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题