首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用opencv python库从内存缓冲区(StringIO)或url中读取图像

如何使用opencv python库从内存缓冲区(StringIO)或url中读取图像
EN

Stack Overflow用户
提问于 2012-11-11 07:42:46
回答 2查看 34K关注 0票数 28

只需共享一种从内存缓冲区或url创建opencv图像对象的方法,以提高性能。

有时我们从url中获取图像二进制文件,为了避免额外的文件IO,我们希望从内存缓冲区或url中读取该图像,但是imread只支持从文件系统读取带有路径的图像。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-11 07:42:46

要使用内存缓冲区( OpenCV StringIO)创建一个OpenCV图像对象,我们可以使用OpenCV API imdecode,参见下面的代码:

代码语言:javascript
运行
复制
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)
票数 43
EN

Stack Overflow用户

发布于 2019-03-26 15:14:04

正如对已接受的答复的评论中所指出的那样,它已经过时,不再起作用。

幸运的是,最近我不得不使用Python3.7和OpenCV 4.0来解决这个问题。

为了处理来自URL或内存中缓冲区的图像加载,我定义了以下两个函数:

代码语言:javascript
运行
复制
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中预定义的以下常量:

  • cv2.IMREAD_ANYCOLOR -如果设置,图像将以任何可能的颜色格式读取。
  • cv2.IMREAD_ANYDEPTH -如果设置,则在输入有相应深度时返回16位/32位图像,否则将其转换为8位。
  • cv2.IMREAD_COLOR -如果设置,始终将图像转换为3通道BGR彩色图像。
  • cv2.IMREAD_GRAYSCALE -如果设置,始终将图像转换为单通道灰度图像(编解码器内部转换)。
  • cv2.IMREAD_IGNORE_ORIENTATION -如果设置,不要根据EXIF的方向标志旋转图像。
  • cv2.IMREAD_LOAD_GDAL -如果设置,请使用gdal驱动程序加载图像。
  • cv2.IMREAD_REDUCED_COLOR_2 -如果设置,始终将图像转换为3通道BGR彩色图像,图像大小减小1/2。
  • cv2.IMREAD_REDUCED_COLOR_4 -如果设置,始终将图像转换为3通道BGR彩色图像,图像大小减少1/4。
  • cv2.IMREAD_REDUCED_COLOR_8 -如果设置,始终将图像转换为3通道BGR彩色图像,图像大小减少1/8。
  • cv2.IMREAD_REDUCED_GRAYSCALE_2 -如果设置,始终将图像转换为单通道灰度图像,图像大小减少1/2。
  • cv2.IMREAD_REDUCED_GRAYSCALE_4 -如果设置,始终将图像转换为单通道灰度图像,图像大小减少1/4。
  • cv2.IMREAD_REDUCED_GRAYSCALE_8 -如果设置,始终将图像转换为单通道灰度图像,图像大小减少1/8。
  • cv2.IMREAD_UNCHANGED --如果设置好了,则按原样返回加载的图像(使用alpha通道,否则将被裁剪)。
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13329445

复制
相关文章

相似问题

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