imdecode OpenCV ничего не возвращает

Я пытаюсь прочитать изображение с URL-адреса.

Для этого я создал функцию ниже. Для некоторых URL-адресов, которые я ввожу, он работает именно так, как я хочу, но для других это не так. В этом случае функция cv2.imread(img, cv2.IMREAD_COLOR) возвращает нет.

Мой код:

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



def urlToImage(url):
    # download image,convert to a NumPy array,and read it into opencv
    req = Request(
        url,
        headers={'User-Agent': 'Mozilla5.0(Google spider)', 'Range': 'bytes=0-{}'.format(5000)})
    resp = urlopen(req)
    img = np.asarray(bytearray(resp.read()), dtype="uint8")
    img = cv2.imdecode(img, cv2.IMREAD_COLOR)
    # return the image
    return img

img = urlToImage('https://my_image.jpg')
print(img)

Пример URL, который работает:

"https://image.freepik.com/fotos-gratis/paisagem-ambiente-bonito-de-campo-verde_29332-1855.jpg"

Пример URL, который не работает:

"https://veja.abril.com.br/wp-content/uploads/2019/03/tecnologia-samsung-s10-01.jpg"

Что я здесь делаю неправильно?


person Lucas Ferreira de Oliveira    schedule 10.03.2021    source источник
comment
Попробуйте посмотреть на img, который возвращается из np.asarray. посмотрите на его форму. Это похоже на цветное изображение?   -  person Lior Cohen    schedule 10.03.2021
comment
эта строка возвращает код, который не представляет цвета. Честно говоря, я не знаю, что они имеют в виду, вот пример: [255, 216, 255, 219, 0, 67, 0, 1, 1, 1, 1....] cv2.imdecode должен взять каждое число и преобразовать в массив BGR   -  person Lucas Ferreira de Oliveira    schedule 10.03.2021


Ответы (1)


Кажется, есть проблема с чтением файла с помощью urllib, но я не вникал.

Я пробовал с import urllib.request as ur вместо from urllib.request import Request, urlopen.

Это работает для меня:

import cv2
import numpy as np
import urllib.request as ur
from matplotlib import pyplot as plt # for testing in Jupyter

def urlToImage(url):
    resp = ur.urlopen(url)
    image = np.asarray(bytearray(resp.read()), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
    return image

Тест на Юпитере:

url = "https://image.freepik.com/fotos-gratis/paisagem-ambiente-bonito-de-campo-verde_29332-1855.jpg"
im = urlToImage(url)
plt.imshow(im[:,:,::-1])
person iGian    schedule 10.03.2021
comment
теперь я тестирую ваше решение, и оно почти работает. Если я передам URL-адрес в ur.urlopen(url), он отлично работает. Но запрос необходим для прохождения блока защиты от скрапа, и если я использую ur.urlopen(req), проблема сохраняется. - person Lucas Ferreira de Oliveira; 11.03.2021
comment
Теперь это работает, я просто меняю функцию запроса, удаляя часть Range': 'bytes=0-{}'.format(5000)}. Я не знаю, что случилось, но теперь это работает - person Lucas Ferreira de Oliveira; 11.03.2021