TOP 【ラズベリーパイ】カメラモジュールの映像をTkinterに表示する方法

【ラズベリーパイ】カメラモジュールの映像をTkinterに表示する方法

Python プログラミング ラズベリーパイ Tkinter
作成日時:2019年11月4日(月) 7時02分
更新日時:2019年11月6日(水) 7時06分
この記事ではラズベリーパイのカメラモジュールが撮影した動画をTkinterを使ってGUI画面にリアルタイム表示する方法を紹介します。
下の動画のようにラグもかなり少なく実現することができました。
まずはコード全文を載せます。
import tkinter
import cv2
import PIL.Image, PIL.ImageTk


class App:
    def __init__(self, window, window_title):
        self.window = window
        self.window.title(window_title)

        self.vcap = cv2.VideoCapture(0)
        self.width = self.vcap.get(cv2.CAP_PROP_FRAME_WIDTH)
        self.height = self.vcap.get(cv2.CAP_PROP_FRAME_HEIGHT)

        # カメラモジュールの映像を表示するキャンバスを用意する
        self.canvas = tkinter.Canvas(window, width=self.width, height=self.height)
        self.canvas.pack()

        # Closeボタン
        self.close_btn = tkinter.Button(window, text="Close")
        self.close_btn.pack()
        self.close_btn.configure(command=self.destructor)

        # update()関数を15ミリ秒ごとに呼び出し、
        # キャンバスの映像を更新する
        self.delay = 15
        self.update()

        self.window.mainloop()

    # キャンバスに表示されているカメラモジュールの映像を
    # 15ミリ秒ごとに更新する
    def update(self):
        _, frame = self.vcap.read()

        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))
        self.canvas.create_image(0, 0, image = self.photo, anchor = tkinter.NW)

        self.window.after(self.delay, self.update)

    # Closeボタンの処理
    def destructor(self):
        self.window.destroy()
        self.vcap.release()

App(tkinter.Tk(), "Tkinter & Camera module")
ポイントはupdate関数を15ミリ秒ごとに呼び出してキャンバスの画像を更新することです。
after関数を使うことで一定時間後に関数を実行させることができます。

しかし、これだけでは画面に映像が出てきません!
なぜなら上のコードはウェブカメラ用のコードだからです。
ウェブカメラの場合は上記コードでうまく動きますが、カメラモジュールの場合失敗します。

僕自身かなりの時間調べてやっと解決策を見つけました。

カメラモジュールの映像が表示されない解決策

sudo modprobe bcm2835-v4l2
このコマンドを実行することでカメラモジュールの映像が表示されるようになります。

参考にしたサイト

Python OpenCV - show a video in a Tkinter window
PiCamera streaming on Tkinter label -Help

最新記事


残り少ない今年にやっておきたいこと
勉強心得(自分用)
今後の勉強方針と勉強すること