Piカメラ
Raspberry PiのカメラはV1とV2(こちらが新しい)の2種類があります。オモチャのようですが、解像度は、
V1 2592x1944
V2 3280x2464
解像度は十分です。2Lの用紙にプリントしても全く問題ありません。A4でもOKです。 このカメラを使ったAIの応用がRaspberryPiではじめる機械学習で紹介されています。 今回はこのカメラを使った応用を紹介します。アプリの画面です。

一定時間ごとに撮影して画像ファイルに保存します。直近に撮影された画像が表示されます。どんな応用があるか。 定点観測に十分役に立つと思います。例えば夏休みの自由研究。朝顔がつぼみから花が咲くまでをきれいない画像で研究できます。 最初にCanvasを使たコードです。ファイル名は固定のmy_picture.jpgにしています。用途に応じてyyyymmddss.jpgのように対応してください。

# -*- coding: utf-8 -*-
import tkinter  as tk
import time
import picamera
from PIL import Image, ImageTk

def onTimer():
    global item, canvas,image_data
    #パイカメラで撮影する
    camera.capture('my_picture.jpg')

    #JPGなら以下の2行が必要
    image_data = Image.open('my_picture.jpg')
    image_data = ImageTk.PhotoImage(image_data)
    #PNGなら以下の1行だけ 上の行でjpgをpngにしてもOK
#    image_data = tk.PhotoImage(file = 'my_picture.jpg')
    if item == None:
        item = canvas.create_image(320, 240, image = image_data)
    else:
        #画像を取り替える
        canvas.itemconfigure(item, image=image_data)
        # print("タイマーが動いていることの確認!")
    root.after(500, onTimer) 

if __name__ == "__main__":
    root = tk.Tk()
    root.title('Pi Camera')
    root.geometry("640x480")

    canvas = tk.Canvas(root, bg="lime green",width=640, height=490)
    canvas.pack()
    
    camera = picamera.PiCamera()
    camera.resolution = (640, 480)
    # image_data = tk.PhotoImage(file = 'my_picture.png')
    item  = None
    image_data= None

    root.after(1000, onTimer)     

    root.mainloop()

Piカメラの使い方は簡単です。
 camera = picamera.PiCamera()
オブジェクトを構築。
camera.resolution = (640, 480)
撮影する画像の解像度をセット。
 camera.capture('my_picture.jpg')
Piカメラで撮影する。
この3つでアプリが作れます。
しかし、多くのページではこの3つを使ってプログラム終了です。 撮影した画像をリアルタイムに確認でないとカメラと被写体の距離や角度を調整できません。本サンプルはこの問題を解決しています。以下解説です。

canvas.create_image()でjpgファイルは使えません。 pngファイルは使えます。
 #JPGなら以下の2行が必要
    image_data = Image.open('my_picture.jpg')
    image_data = ImageTk.PhotoImage(image_data)
このやり方でjpg,pngに対応できます。これを画像ファイルの処理では使うことにします。

②画像などのオブジェとは外部変数にする。
最初image_dataを内部変数にしていました。 画像が表示されません。カメラで撮影していないのか確認するとファイルは作成されています。
onTimer()を終了するとimage_dataは解放されてしまいます。いざ表示をしようとしたときにデータがなくなっているためです。消えないようglobalにしました。

③画像の切替はcanvas.itemconfigure(item, image=image_data)でやる。

次にLabelを使ったコードです。

# -*- coding: utf-8 -*-
import tkinter  as tk
import time
import picamera

def onTimer():
    global img

    camera.capture('my_picture.png')
    img = tk.PhotoImage(file='my_picture.png')
    labelPicture.configure(image=img)
    root.after(500, onTimer) 

if __name__ == "__main__":
    root = tk.Tk()
    root.title('Pi Camera')
    root.geometry("640x480")

    img = None
    labelPicture = tk.Label(
        root,
        text='',
        image=img,
        compound=tk.TOP
        )

    labelPicture.place(x=0, y=0)
    
    camera = picamera.PiCamera()
    camera.resolution = (640, 480)
    # #camera.start_preview()
    # time.sleep(2)
 
    root.after(1000, onTimer)     

    root.mainloop()
画像の入れ替えは、
labelPicture.configure(image=img)
でやっています。