web-dev-qa-db-ja.com

IPython / JuPyter Notebook内にOpenCVビデオを表示することは可能ですか?

OpenCVビデオ処理の例を実行すると、pythonチュートリアルの場合、すべて専用ウィンドウにポップアップ表示されます。IPythonノートブックがディスクとYouTubeのビデオを表示できることを知っているので、 OpenCVビデオの再生をノートブックブラウザーに送信し、別のウィンドウではなく出力セルで再生させる方法(ディスクに保存してそこから再生しないことが望ましい)。

以下は、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()
29
joelostblom

ビデオエンコードされたデータ(ブラウザーがデコードできる形式(ISO mp4コンテナーでh264エンコードなど)の場合)は、HTML _<video>_タグとIPython.core.display.HTML()を使用して表示できます。これにより、標準の再生が提供されますパフォーマンス。

_<video>_はリンクにすることも、base64で処理されたデータを埋め込むこともできます(たとえば、後者は_matplotlib.animation_が行うことです)。そのデータはもちろん、OpenCVを使用してノートブックで生成できます(たとえば。VideoWriter)。

2
cJ Zougloub

あなたはボケでそれを行うことができ、おそらくそれは少し速いです。

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)
2
Enrico Pallazzo

はい。でもだいすきwww ...

Python 3およびOpenCV 3.3を使用したコードで、ウェブカメラから読み取ります(ファイルから、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()

IOPubのデータレート制限を変更する必要がある場合があります。これは.jupyter設定で変更するか、jupyter notebook --NotebookApp.iopub_data_rate_limit = 1000000000を実行するだけで変更できます

ただし、キーボードの割り込みは正しく機能しません。

0
Fred Guth