【问题标题】:How to open an image from an url with opencv using requests from python如何使用来自 python 的请求使用 opencv 从 url 打开图像
【发布时间】:2019-12-23 15:21:36
【问题描述】:

我正在尝试在 python 上使用 OpenCV 打开大量图像,因为我需要稍后使用它们。

其实我可以用这样的枕头实现这个目标:

url = r'https://i.imgur.com/DrjBucJ.png'
response = requests.get(url, stream=True).raw
guess = Image.open(response).resize(size)

我正在使用来自 python 的库 requests

response 看起来像这样:b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01\xdb\...

如果我没记错的话,这些是 url 图像中的像素值,对吗?

我的问题是:如何使用 OpenCV 做同样的事情?

我试过这样:

resp = requests.get(url)
image = np.asarray(bytearray(resp.read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)

我得到这个错误:

image = np.asarray(bytearray(resp.read()), dtype="uint8")
AttributeError: 'Response' object has no attribute 'read'

我从这个网站获得了代码:https://www.pyimagesearch.com/2015/03/02/convert-url-to-image-with-python-and-opencv/

【问题讨论】:

  • urllibrequests 不同,请尝试 resp.raw
  • 错误:(-215:Assertion failed) !buf.empty() && buf.isContinuous() in function 'cv::imdecode_'

标签: python opencv python-requests


【解决方案1】:

您只是在requests.get 中忘记了stream=True.raw

resp = requests.get(url, stream=True).raw

import cv2
import numpy as np
import requests

url = r'https://i.imgur.com/DrjBucJ.png'
resp = requests.get(url, stream=True).raw
image = np.asarray(bytearray(resp.read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)

# for testing
cv2.imshow('image',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

回答你的问题

.raw 表示您希望将响应检索为字节流,并且不会通过任何措施评估或转换响应(因此它不会解码 gzip 和 deflate 传输编码)但使用 .content gzip 和 deflate 传输编码会自动为您解码强>。

在您的情况下,使用.content 比使用.raw 会更好

Requests 包文档中的以下注释

注意 关于使用 Response.iter_content 与 Response.raw 的重要说明。 Response.iter_content 将自动解码 gzip 和 deflate 传输编码。 Response.raw 是一个原始的字节流——它不会转换响应内容。如果您确实需要访问返回的字节,请使用 Response.raw。

参考资料:

https://2.python-requests.org/en/master/user/quickstart/#raw-response-content

https://2.python-requests.org/en/master/user/quickstart/#binary-response-content

【讨论】:

  • 谢谢。你能解释一下 content 和 raw 有什么区别,stream=True 有什么作用?
【解决方案2】:

@Mohamed Saeed的回答解决了你的问题。以下是从 url 获取图像的替代解决方案:

import cv2
import numpy as np
from urllib.request import urlopen

req = urlopen('https://i.imgur.com/DrjBucJ.png')
image = np.asarray(bytearray(req.read()), dtype=np.uint8)
image = cv2.imdecode(image, -1) 

cv2.imshow('image',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多