只需共享一种从内存缓冲区或url创建opencv图像对象的方法,以提高性能。
有时我们从url中获取图像二进制文件,为了避免额外的文件IO,我们希望从内存缓冲区或url中读取该图像,但是imread只支持从文件系统读取带有路径的图像。
发布于 2012-11-11 07:42:46
要使用内存缓冲区( OpenCV StringIO)创建一个OpenCV图像对象,我们可以使用OpenCV API imdecode,参见下面的代码:
import cv2
import numpy as np
from urllib2 import urlopen
from cStringIO import StringIO
def create_opencv_image_from_stringio(img_stream, cv2_img_flag=0):
img_stream.seek(0)
img_array = np.asarray(bytearray(img_stream.read()), dtype=np.uint8)
return cv2.imdecode(img_array, cv2_img_flag)
def create_opencv_image_from_url(url, cv2_img_flag=0):
request = urlopen(url)
img_array = np.asarray(bytearray(request.read()), dtype=np.uint8)
return cv2.imdecode(img_array, cv2_img_flag)
发布于 2019-03-26 15:14:04
正如对已接受的答复的评论中所指出的那样,它已经过时,不再起作用。
幸运的是,最近我不得不使用Python3.7和OpenCV 4.0来解决这个问题。
为了处理来自URL或内存中缓冲区的图像加载,我定义了以下两个函数:
import urllib.request
import cv2
import numpy as np
def get_opencv_img_from_buffer(buffer, flags):
bytes_as_np_array = np.frombuffer(buffer.read(), dtype=np.uint8)
return cv2.imdecode(bytes_as_np_array, flags)
def get_opencv_img_from_url(url, flags):
req = urllib.request.Request(url)
return get_opencv_img_from_buffer(urllib.request.urlopen(req), flags)
正如你所看到的,其中一个依赖于另一个。
第一个名为get_opencv_img_from_buffer,可用于从内存缓冲区中获取图像对象.它假定缓冲区有一个读方法,并且它返回实现缓冲协议的对象的实例。
第二个名为get_opencv_img_from_url,直接从URL生成图像。
标志参数被传递给cv2.imdecode,它具有在cv2中预定义的以下常量:
https://stackoverflow.com/questions/13329445
复制相似问题