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()
23
demandé sur ilke444 2015-01-11 02:23:53

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).

2
répondu cJ Zougloub 2017-07-05 16:18:16

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.

0
répondu Fred Guth 2018-03-28 04:53:19