$30 off During Our Annual Pro Sale. View Details »

すごい広島 With Python 発表資料_2020_0129

J-Ogu
January 29, 2020
290

すごい広島 With Python 発表資料_2020_0129

J-Ogu

January 29, 2020
Tweet

Transcript

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

    View Slide

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

    View Slide

  3. Pythonのリアルタイム描画の方法
    ・jupyter notebookでIPython.displayを使う
    ・matplotlibのplt.pause(.01)で描画する
    ・OpenCVのcv2.imshowで描画する
    今日なぜこの話を?
    ・Pythonでお絵かきパズルを解いてみたのリファクタリング開始

    コード量が多すぎてjupyterではリファクタリングしにくい
    ・Git管理もしたい。

    コンソール上でpython3 oekaki.py で実行したい。

    リアルタイム描画の機能は維持したい。
    (開発しやすい)

    調べたらいろいろな方法があったのでまとめて発表しよう。

    View Slide

  4. 方法①
    jupyter notebook

    View Slide

  5. 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
    できる

    View Slide

  6. 方法②
    matplotlib

    View Slide

  7. 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
    できる

    View Slide

  8. 方法③
    OpenCV

    View Slide

  9. 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
    できる

    View Slide

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

    View Slide