Est-il possible d'afficher une vidéo OpenCV dans le carnet IPython /JuPyter?
lorsque vous exécutez les exemples des tutoriels de traitement vidéo Python D'OpenCV, ils apparaissent tous dans une fenêtre dédiée. Je sais que le bloc-notes IPython peut afficher des vidéos à partir du disque et de YouTube, donc je me demande s'il y a un moyen de diriger la lecture vidéo OpenCV vers le navigateur de Bloc-Notes et de le faire lire dans la cellule de sortie au lieu d'une fenêtre séparée (de préférence sans l'enregistrer sur le disque, puis de le lire à partir de là).
ci-dessous est le code de L'OpenCV tutoriel.
import cv2
cap = cv2.VideoCapture('/path/to/video')
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
2 réponses
les données codées par vidéo (si dans un format le navigateur peut les décoder, par exemple: h264-encoded in ISO mp4 container) peut être affiché en utilisant un HTML <video>
et la balise de IPython.core.display.HTML()
, cela fournira des performances de lecture standard.
<video>
peut être un lien, ou avoir intégré des données base64'ed (ce dernier est ce que matplotlib.animation
does, par exemple), et ses données peuvent bien sûr être générées dans votre ordinateur portable, en utilisant OpenCV (par ex. VideoWriter
).
Oui. Mais ce sera slooowwww....
Code avec Python 3 et OpenCV 3.3 qui lit depuis webcam (à partir du fichier, changez simplement cv2.VideoCapture ("filename.mp4")):
from IPython.display import clear_output, Image, display, HTML
import numpy as np
import cv2
import base64
def arrayShow (imageArray):
ret, png = cv2.imencode('.png', imageArray)
encoded = base64.b64encode(png)
return Image(data=encoded.decode('ascii'))
video = cv2.VideoCapture(0)
while(True):
try:
clear_output(wait=True)
_, frame = video.read()
lines, columns, _ = frame.shape
frame = cv2.resize(frame, (int(columns/4), int(lines/4)))
img = arrayShow(frame)
display(img)
except KeyboardInterrupt:
video.release()
vous devrez peut-être modifier la limite de débit des données IOPub. Vous pouvez changer cela dans votre .config jupyter ou tout simplement courir Jupyter notebook -- NotebookApp.iopub_data_rate_limit=1000000000
L'interruption du clavier ne fonctionne pas correctement, si.