【ラズベリーパイ】カメラモジュールの映像をTkinterに表示する方法
作成日時: | 2019年11月4日 |
更新日時: | 2020年7月30日 |
この記事ではラズベリーパイのカメラモジュールが撮影した動画をTkinterを使ってGUI画面にリアルタイム表示する方法を紹介します。
下の動画のようにラグもかなり少なく実現することができました。
まずはコード全文を載せます。
after関数を使うことで一定時間後に関数を実行させることができます。
しかし、これだけでは画面に映像が出てきません!
なぜなら上のコードはウェブカメラ用のコードだからです。
ウェブカメラの場合は上記コードでうまく動きますが、カメラモジュールの場合失敗します。
僕自身かなりの時間調べてやっと解決策を見つけました。
PiCamera streaming on Tkinter label -Help
下の動画のようにラグもかなり少なく実現することができました。
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 windowPiCamera streaming on Tkinter label -Help