Slide 1

Slide 1 text

Pythonを使った リアルタイム描画について すごい広島 with Python 第34回 2020_01_29 小栗 潤一

Slide 2

Slide 2 text

Pythonのリアルタイム描画の方法 ・jupyter notebookでIPython.displayを使う ・matplotlibのplt.pause(.01)で描画する ・OpenCVのcv2.imshowで描画する

Slide 3

Slide 3 text

Pythonのリアルタイム描画の方法 ・jupyter notebookでIPython.displayを使う ・matplotlibのplt.pause(.01)で描画する ・OpenCVのcv2.imshowで描画する 今日なぜこの話を? ・Pythonでお絵かきパズルを解いてみたのリファクタリング開始 ・ コード量が多すぎてjupyterではリファクタリングしにくい ・Git管理もしたい。 ・ コンソール上でpython3 oekaki.py で実行したい。 ・ リアルタイム描画の機能は維持したい。 (開発しやすい) ・ 調べたらいろいろな方法があったのでまとめて発表しよう。

Slide 4

Slide 4 text

方法① jupyter notebook

Slide 5

Slide 5 text

jupyter notebookでIPython.displayを使う from PIL import Image, ImageDraw, ImageFont from IPython.display import display, clear_output def byouga_syori(w_list, h_list, byouga ): img = Image.new('RGB', (10, 10), (128,128,128) ) ### <描画用のデータを作成する処理> ### clear_output(wait=True) display(img) ・jupyter上でmatplotlibの描画には %matplotlib inline が必要 ・IPython.displayを使うと %matplotlib inline がいらない Demo できる

Slide 6

Slide 6 text

方法② matplotlib

Slide 7

Slide 7 text

matplotlibのplt.pause(.01)で描画する import matplotlib.pyplot as plt def pause_plot(): fig, ax = plt.subplots(1, 1) x = np.arange(-np.pi, np.pi, 0.1) y = np.sin(x) lines, = ax.plot(x, y) while True: x += 0.1 y = np.sin(x) lines.set_data(x, y) ax.set_xlim((x.min(), x.max())) plt.pause(.01) ・jupyter上では %matplotlib inline が必要 https://qiita.com/hausen6/items/b1b54f7325745ae43e47 コード流用元 Demo できる

Slide 8

Slide 8 text

方法③ OpenCV

Slide 9

Slide 9 text

OpenCVのcv2.imshowで描画する from PIL import Image, ImageDraw, ImageFont import cv2 import numpy as np def byouga_syori(w_list, h_list, byouga ): img = Image.new('RGB', (10, 10), (128,128,128) ) ### <描画用のデータを作成する処理> ### OpenCV_data=np.asarray(img) cv2.imshow("Loaded image",OpenCV_data) cv2.waitKey(1) cv2.moveWindow('Loaded image', 30, 10) cv2.waitKey(1) ➡︎ cv2.waitKey(0) ↑この引数はミリ秒:100くらいにするとお絵かきロジックにはちょうどいい ・描画位置を変更したい場合は ・リアルタイム描画を止めたい (何かキーを押すまで停止) Demo できる

Slide 10

Slide 10 text

いろいろな方法が あるので試して みてください。 やっぱりPythonは楽しい