1
votes

Comment cv2.imread depuis une URL avec une authentification de base

J'essaie d'utiliser cv2 et pyzbar pour lire en temps réel les codes QR d'une caméra IP.

Cela fonctionne:

os.system("wget --quiet http://user:password@url -O file.jpg")
image = cv2.imread("file.jpg")
barcodes = pyzbar.decode(image)

Mais c'est clairement inefficace - beaucoup mieux vaut lire directement l'url. Mais je ne peux pas comprendre comment faire cela avec l'authentification de base. J'apprécierais vraiment de l'aide.

(Il y a eu un certain nombre de questions similaires, mais je ne trouve pas de réponse!)

merci

Dan


2 commentaires

peut-être que cela pourrait être un indice: codereview .stackexchange.com / questions / 169398 /…


merci, et je peux voir que la solution est là-dedans, mais c'est trop compliqué / non commenté pour que mes compétences de base en python comprennent tout à fait ce qu'il fait.


3 Réponses :


1
votes

cela peut vous aider

import numpy as np
import urllib.request as rq
import cv2
from matplotlib import pyplot as plt

# load image from url
def urlToImage(url):
    # download image,convert to a NumPy array,and read it into opencv
    resp = rq.urlopen(url)
    img = np.asarray(bytearray(resp.read()),dtype="uint8")
    img = cv2.imdecode(img,cv2.IMREAD_COLOR)

    #return the image
    return img
img = urlToImage("https://www.pyimagesearch.com/wp-content/uploads/2015/01/google_logo.png")
plt.imshow(img)


1 commentaires

merci, mais cette approche ne fonctionne pas avec l'authentification de base - j'obtiens une erreur "http.client.InvalidURL: port non numérique:"



1
votes

Merci à tous, mais il s'avère qu'il existe une bonne réponse simple:

cap=cv2.VideoCapture("http://user:password@url")
_, image=cap.read()
barcodes = pyzbar.decode(image)


0 commentaires

1
votes

ou il existe une autre solution simple qui n'implique pas de diffuser la vidéo:

from requests.auth import HTTPBasicAuth
import numpy as np

resp = requests.get(url, auth=(user, password))

image = np.asarray(bytearray(resp.content), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)

J'espère que cela aidera d'autres personnes!


0 commentaires