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()
ビデオエンコードされたデータ(ブラウザーがデコードできる形式(ISO mp4コンテナーでh264エンコードなど)の場合)は、HTML _<video>
_タグとIPython.core.display.HTML()
を使用して表示できます。これにより、標準の再生が提供されますパフォーマンス。
_<video>
_はリンクにすることも、base64で処理されたデータを埋め込むこともできます(たとえば、後者は_matplotlib.animation
_が行うことです)。そのデータはもちろん、OpenCVを使用してノートブックで生成できます(たとえば。VideoWriter
)。
あなたはボケでそれを行うことができ、おそらくそれは少し速いです。
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)
はい。でもだいすき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を実行するだけで変更できます
ただし、キーボードの割り込みは正しく機能しません。