Pregunta ¿Es posible mostrar un video de OpenCV dentro del Portátil IPython / JuPyter?


Al ejecutar los ejemplos de los tutoriales de python de procesamiento de video de OpenCV, todos aparecen en una ventana dedicada. Sé que el portátil IPython puede mostrar videos del disco y YouTube, así que me pregunto si hay una manera de dirigir la reproducción de video OpenCV al navegador Notebook y hacer que se reproduzca en la celda de salida en lugar de una ventana separada (preferiblemente sin guardarlo) en el disco y luego jugar desde allí).

A continuación se muestra el código del tutorial de OpenCV.

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
2018-01-10 23:23


origen


Respuestas:


Los datos codificados por video (si están en un formato que el navegador puede decodificar, por ej., H264-codificado en un contenedor ISO mp4) se pueden mostrar usando un HTML <video> etiqueta y IPython.core.display.HTML(), esto proporcionará un rendimiento de reproducción estándar.

los <video> puede ser un enlace o tener datos incrustados de base64 (esto último es matplotlib.animation lo hace, por ejemplo), y sus datos pueden, por supuesto, ser generados en su computadora portátil, usando OpenCV (ej. VideoWriter)


2
2017-07-05 16:18



Sí. Pero será slooowwww ....

Código con Python 3 y OpenCV 3.3 que se lee desde la cámara web (desde el archivo, simplemente cambie 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()

Es posible que necesite cambiar el límite de velocidad de datos de IOPub. Puede cambiar esto en su configuración .jupyter o simplemente ejecutar Libreta jupyter --NotebookApp.iopub_data_rate_limit = 1000000000

Sin embargo, la interrupción del teclado no funciona correctamente.


0
2018-03-28 04:45