webentwicklung-frage-antwort-db.com.de

Ist es möglich, ein OpenCV-Video in IPython/JuPyter Notebook anzuzeigen?

Wenn Sie die Beispiele aus den OpenCV-Videoverarbeitungs-Python-Tutorials ausführen, werden sie alle in einem speziellen Fenster angezeigt. Ich weiß, dass das IPython-Notebook Videos von Festplatte und YouTube anzeigen kann. Daher frage ich mich, ob es eine Möglichkeit gibt, die OpenCV-Videowiedergabe an den Notebook-Browser zu leiten und in der Ausgabezelle statt in einem separaten Fenster wiederzugeben (vorzugsweise ohne sie zu speichern) auf Platte und spielt es dann von dort ab).

Unten ist der Code aus dem OpenCV-Tutorial.

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()
24
joelostblom

Die Video-kodierten Daten (wenn der Browser in einem Format dekodieren kann, z. B. h264-kodiert in einem ISO-MP4-Container), können mithilfe eines HTML-Tags <video> und IPython.core.display.HTML() angezeigt werden. Dies bietet eine standardmäßige Wiedergabeleistung.

Der <video> kann ein Link sein oder über eingebettete base64-Daten verfügen (letzteres ist beispielsweise der von matplotlib.animation), und seine Daten können natürlich mit OpenCV (z. B. VideoWriter) in Ihrem Notebook generiert werden.

2
cJ Zougloub

Du kannst es mit Bokeh machen und es ist wahrscheinlich etwas schneller.

from bokeh.plotting import figure
from bokeh.io import output_notebook, show, Push_notebook
import cv2
import time
output_notebook()

cap = cv2.VideoCapture(0)
ret, frame = cap.read()
frame=cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) # because Bokeh expects a RGBA image
frame=cv2.flip(frame, -1) # because Bokeh flips vertically
width=frame.shape[1]
height=frame.shape[0]
p = figure(x_range=(0,width), y_range=(0,height), output_backend="webgl", width=width, height=height)
myImage = p.image_rgba(image=[frame], x=0, y=0, dw=width, dh=height)
show(p, notebook_handle=True)
while True:
    ret, frame = cap.read()
    frame=cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    frame=cv2.flip(frame, -1)
    myImage.data_source.data['image']=[frame]
    Push_notebook()
    time.sleep(0.3)
1
Enrico Pallazzo

Ja. Aber es wird langsam sein ....

Code mit Python 3 und OpenCV 3.3, der von der Webcam liest (von der Datei aus einfach cv2.VideoCapture ("Dateiname.mp4") ändern):

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

Möglicherweise müssen Sie das IOPub-Datenratenlimit ändern. Sie können dies in Ihrer .jupyter-Konfiguration ändern oder Jupyter notebook --NotebookApp.iopub_data_rate_limit = 1000000000 ausführen

Der Tastatur-Interrupt funktioniert jedoch nicht richtig.

0
Fred Guth