web-dev-qa-db-fra.com

Est-il possible de diffuser des vidéos depuis https: // (par exemple YouTube) vers python avec OpenCV?

Ce lien a un petit exemple bien rangé sur la façon d'utiliser la bibliothèque OpenCV de python, cv2 pour diffuser des données d'une caméra dans votre python Shell. Je cherche à faire quelques expériences et je voudrais utiliser le flux vidéo YouTube suivant: https://www.youtube.com/watch?v=oCUqsPLvYBQ.

J'ai essayé d'adapter l'exemple comme suit:

import numpy as np
import cv2

cap = cv2.VideoCapture('https://www.youtube.com/watch?v=oCUqsPLvYBQ')

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Display the resulting frame
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

Ce qui produit l'erreur:

WARNING: Couldn't read movie file https://www.youtube.com/watch?v=oCUqsPLvYBQ
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /tmp/opencv20160107-29960-t5glvv/opencv-2.4.12/modules/highgui/src/window.cpp, line 261

Existe-t-il un correctif simple qui me permettrait de diffuser ce flux vidéo dans mon python Shell via cv2? Pas absolument engagé envers cv2, soit, s'il existe d'autres bibliothèques qui accompliront le même objectif.

16
Aaron

vous devez avoir 2 choses installées

  1. pafy (pip install pafy)
  2. youtube_dl (Sudo pip install --upgrade youtube_dl)

après avoir installé ces deux packages, vous pouvez utiliser l'url youtube pour lire les vidéos en streaming à partir de youtube. Veuillez vous référer au code ci-dessous

url = 'https://youtu.be/W1yKqFZ34y4'
vPafy = pafy.new(url)
play = vPafy.getbest(preftype="webm")

#start the video
cap = cv2.VideoCapture(play.url)
while (True):
    ret,frame = cap.read()
    """
    your code here
    """
    cv2.imshow('frame',frame)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break    

cap.release()
cv2.destroyAllWindows()
17
Vaibhav K

c'est possible avec pafy ( https://pypi.python.org/pypi/pafy )

import cv2, pafy

url = "https://www.youtube.com/watch?v=aKX8uaoy9c8"
videoPafy = pafy.new(url)
best = videoPafy.getbest(preftype="webm")

video=cv2.VideoCapture(best.url)
3
Sylwek

La suggestion de @ incBrain de télécharger la vidéo youtube sur mp4 local était la voie à suivre ici. Voici les étapes que j'ai utilisées pour configurer un environnement de serveur distant sur EC2, avec une sortie dirigée vers mon ordinateur local via le transfert X11:

  • ssh -X -i "<ssh_key.pem>" ubuntu@<IP-address>.compute-1.amazonaws.com (Noter la -X L'option est un ajout important ici. C'est ce que nous utilisons pour transmettre la sortie du serveur EC-2 à un client X11 local)
  • Sudo pip install --upgrade youtube_dl (Je connais, Sudo pip est mauvais. Je blâme les instructions du site)
  • Téléchargez la vidéo youtube dans un fichier local: youtube-dl https://www.youtube.com/watch?v=VUjF1fRw9sA -o motocross.mp4
  • python demo_cv.py

Le transfert X11 peut être délicat. Si vous rencontrez des blocages là-bas ce message pourrait également vous être utile.

2
Aaron

Tout d'abord, veuillez mettre à jour les derniers binaires opencv-python ou opencv-contrib-python (v4.1.1.26) installés sur votre machine, ce qui a corrigé un bogue critique . Installez-le à partir de pypi comme suit:

Sudo pip install -U opencv-python       #or install opencv-contrib-python similarly

Ensuite, vous pouvez installer ma VidGear Python bibliothèque qui redirige automatiquement la vidéo YouTube vers OpenCV en fournissant uniquement son URL. Voici un exemple complet python:

# import libraries
from vidgear.gears import CamGear
import cv2

stream = CamGear(source='https://youtu.be/dQw4w9WgXcQ', y_tube =True).start() # YouTube Video URL as input

# infinite loop
while True:

    frame = stream.read()
    # read frames

    # check if frame is None
    if frame is None:
        #if True break the infinite loop
        break

    # do something with frame here

    cv2.imshow("Output Frame", frame)
    # Show output window

    key = cv2.waitKey(1) & 0xFF
    # check for 'q' key-press
    if key == ord("q"):
        #if 'q' key-pressed break out
        break

cv2.destroyAllWindows()
# close output window

stream.stop()
# safely close video stream.

Source du code

1
abhiTronix