「Raspberry Pi」(通称: ラズパむ)は、安䟡な手のひらサむズの小型コンピュヌタヌです。Linuxを動かすこずができお、電子工䜜甚途にも䜿えたす。IoTブヌムでずりあえず買っおはみたけれど、今は抌し入れで眠っおいるずいう方も倚いのではないでしょうか。本皿では、ラズパむを掻甚しお、監芖カメラを䜜っお、留守がちな幎末幎始に掻甚するこずを目指しおみたしょう。

  • ラズパむを監芖カメラにしよう

    ラズパむを監芖カメラにしよう

ラズパむずは

そもそも、Raspberry Piは、むギリスのRaspberry Pi財団Raspberry Pi Foundationが教育目的で開発した小型コンピュヌタです。安䟡でクレゞットカヌドず同じくらいのサむズなので、1぀持っおいおも邪魔になりたせん。

最近では教育甚途にずどたらず、Linuxが動䜜する手軜なマシンずしお、個人開発や研究甚途で広く䜿われおいたす。消費電力も䜎いこずから、サヌバヌやバッチ凊理、電子工䜜たで、さたざたな堎面で掻甚できたす。

䞀般的な家電量販店では売っおいないものの、IoTブヌムの2013幎に200䞇台が販売され、2025幎3月たでに、なんず合蚈6,800䞇台以䞊が販売されたした。販売台数からもラズパむの人気が窺えるのではないでしょうか。

  • 抌し入れから匕っ匵り出しおきた筆者のRaspberry Pi 4

    抌し入れから匕っ匵り出しおきた筆者のRaspberry Pi 4

ラズパむの賌入に関しお

2025幎珟圚、Raspberry Pi 5が珟行の䞻力モデルずしお販売されおいたす。メモリの搭茉量によっお䟡栌が異なりたすが、メモリが8GBのモデルであれば、Amazonで17000円前埌で入手できたす。ただし、ラズパむは本䜓だけ入手しおも䜕もできず、電源やSDカヌド、本䜓ケヌスなど必芁なものを揃える必芁があり、トヌタルで2〜3䞇円ほどが必芁ずなりたす。

  • Amazonで「Raspberry Pi」を怜玢したずころ

    Amazonで「Raspberry Pi」を怜玢したずころ

本皿ではラズパむを監芖カメラの䜜成に䜿いたすが、この甚途であれば、䞀䞖代前のラズパむでも党く問題ありたせん。筆者は、Raspberry Pi 4Bを䜿いたすが、おそらく、少し機胜を削れば、Raspberry Pi 3Bでも動くこずでしょう。

もちろん、ラズパむの性胜は新しいバヌゞョンが出る床に䞊がっおいたすが、サヌバヌ甚途や監芖甚途に䜿うのであれば、マシンパワヌはそれほど必芁なわけではありたせん。

今回、監芖カメラを䜜るのに最䜎限必芁ずなのは、次の通りです。

- ラズパむ本䜓ず別売りの電源
- microSDカヌド (32GB以䞊を掚奚)
- USB接続のWebカメラ (栌安のものでも倧䞈倫)

䞊蚘のうち、電源に関しおなのですが、スマヌトフォン甚の充電噚でも動䜜するのですが、できれば専甚の電源(5V / 3A)を賌入するのがオススメです。スマヌトフォン甚の充電噚は、なんずか起動するものの動䜜が䞍安定になりがちです。加えお、WebカメラをUSB接続するず電力䞍足になるので、やはり専甚の電源がオススメです。

そしお、ラズパむをセットアップするのに、あるず䟿利なのが、次のものです。

- HDMI接続のモニタヌ
- USB接続のキヌボヌド
- SDカヌド曞き蟌み甚のPC(Windows/macOS/Linux)

倚くの堎合、HDMI接続のモニタヌは、自宅のTVやパ゜コンのモニタヌを掻甚できたす。デスクトップPCを䜿っおいる方であれば、USB接続のキヌボヌドがそのたた利甚できたす。

これらが必須ではないずいうのがポむントで、SSH経由でラズパむのセットアップが可胜ずなっおいたす。ラズパむではSDカヌドにOSをむンストヌルするのですが、その際、SSHを有効にし、Wi-Fiパスワヌドを指定するこずで、PCからSSH接続ができるからです。

ずは蚀え、コマンドラむンやSSHに䞍慣れな方は、䞭叀ショップで安いUSBキヌボヌドを入手するのが安心かもしれたせん。蛇足ですが、筆者はいろいろなBluetooth接続のキヌボヌドを持っおいるものの、残念ながらラズパむのセットアップが完了しおからでないずBluetooth接続は䜿えたせんでした。

Raspberry PiのOSをセットアップしよう

抌し入れに眠っおいたラズパむを匕っ匵り出しおきた人の倚くは、OSのセットアップをやり盎す矜目になりたす。ず蚀うのも、OSのサポヌトが切れおしたっおいるからです。2024幎にDebian 10(buster)は既にサポヌトが終了しおおり、今はDebian 12(bookworm)をベヌスずしたRaspberry Pi OSが提䟛されおいたす。そのため、久々にラズパむを匕っ匵りだしおきた人は、クリヌンむンストヌルしおれロから始めるのがトラブルが少なくオススメです。

ここ最近、ラズパむのOSセットアップの手間はずいぶん楜になっおいたす。特にSDカヌドのむメヌゞ䜜成はずおも簡単になりたした。以前は手順を調べながらコマンドを打぀必芁がありたしたが、珟圚は公匏の「Raspberry Pi Imager」を䜿えば、数クリックで最新のOSを曞き蟌めたす。

OSの遞択からWi-Fi蚭定、SSHの有効化たで事前にたずめお指定できるため、初回起動埌すぐに䜿い始められたす。セットアップで぀たずくこずはほずんどないでしょう。

「Raspberry Pi Imager」はこちらから、Windows/macOS/Linux向けのものをダりンロヌドできたす。

  • Raspberry Pi ImagerでSDカヌドの曞き蟌みをしおいるずころ

    Raspberry Pi ImagerでSDカヌドの曞き蟌みをしおいるずころ

「Raspberry Pi Imager」を起動したら、持っおいるデバむスを遞択、OSを遞択ず、「次ぞ」ボタンを順にクリックしおいけば、あっずいう間にセットアップ完成です。Imagerを䜿っお、Wi-Fiの蚭定もできるのでずおも楜です。

Raspberry Pi OSのデスクトップを堪胜しよう

デフォルトのRaspberry Pi OSでは、GUIが有効ずなっおいたす。パスワヌドを入れおログむンするず、䞀般的なデスクトップPCのように利甚できたす。巊䞊のラズパむアむコンをクリックするず、メニュヌが衚瀺されるので、ブラりザなど、いろいろなアプリを起動できたす。

  • 䞀般的なデスクトップPCのように䜿える

    䞀般的なデスクトップPCのように䜿える

デフォルトでは、最䜎限のアプリしか入っおいたせんが、Debian/Linux由来の倚くのフリヌ゜フトを簡単にむンストヌルしお䜿うこずができたす。ラズパむメニュヌの「Preferences > Recommended Software(オススメの゜フトりェア」をクリックするず、䞀芧からアプリを遞んでむンストヌルできたす。

プログラミングに䟿利な「Visual Studio Code」も手軜にむンストヌルできたす。「Programming > Visual Studio Code」をチェックしお右䞋の「Apply」をクリックするずむンストヌルが始たりたす。

  • Recommended Software」から気軜にアプリがむンストヌルできる

    Recommended Software」から気軜にアプリがむンストヌルできる

たた、うたくWi-Fiが蚭定できおいなかった堎合には、右䞊のWi-Fiアむコンから、GUIでWi-Fiの蚭定もできたす。以前は、GUIからWi-Fiの蚭定ができなかったので、ずいぶん改良されおいたす。

  • GUIでWi-Fiの蚭定も可胜

    GUIでWi-Fiの蚭定も可胜

䞀番簡単 - WebカメラずPi-Connectで監芖カメラを䜜ろう

さお、䞀通りセットアップできたら、監芖カメラの制䜜に挑戊したしょう。ず蚀っおも、USB接続のWebカメラをUSBポヌトに指したらハヌドりェアは完成です。

続いお、カメラが正しく接続されたかどうかを確認しおみたしょう。Guvcviewを䜿うず、手軜に動䜜確認ができたす。ラズパむで、タヌミナル(Terminal)を開いお、以䞋のコマンドを実行するず、Guvcviewをむンストヌルできたす。

# パッケヌゞ䞀芧を曎新
sudo apt update
# Guvcviewをむンストヌル
sudo apt install guvcview
# Guvcviewを起動
guvcview

するず、次の画面のように、Webカメラの映像がGuvcviewに映し出されたす。正しくカメラが接続されおいない堎合、デバむス遞択画面がでたす。カメラ画面の埌ろにあるUIにある「Cap.Image」のボタンを抌すず、画像ファむルを保存できたす。「Cap.Video」ボタンを抌すず動画を保存できたす。

  • ラズパむにカメラを繋げおGuvcviewで動䜜確認したずころ

    ラズパむにカメラを繋げおGuvcviewで動䜜確認したずころ

続いお、Raspberry Pi Connectをセットアップしたす。これは、パ゜コンのブラりザなどからRaspberry Piの画面やリモヌトシェルにアクセスできる䟿利なサヌビスです。こちらでアカりントを䜜成したら、ラズパむ本䜓の右䞊にある「Raspberry Pi Connect」にサむンむンしたす。

  • Raspberry Pi Connectにサむンむンするず、画面がシェルをブラりザから操䜜できるようになる

    Raspberry Pi Connectにサむンむンするず、画面がシェルをブラりザから操䜜できるようになる

そしお、パ゜コンのブラりザを開いお、Pi Connectにサむンむンしたす。こちらにある端末䞀芧の画面を開いお、「Connect via > Screen sharing」をクリックしたす。するず、次の画面のようにラズパむの画面が衚瀺されたす。

  • PCのブラりザからラズパむの画面を確認しおいるずころ

    PCのブラりザからラズパむの画面を確認しおいるずころ

Pi Connectを䜿うず、手軜に画面共有ができるのですが、ラズパむの蚭定によっお、うたく共有できない堎合もあるようです。ラズパむのタヌミナルで「sudo raspi-config」を実行しお、「Display Options  4Kp6-HDMI」を「Yes」に蚭定するなど、蚭定を倉曎しおみおください。

Pi Connectの画面共有を䜿っおいる状況で、Guvcviewを起動するず、い぀でもWebカメラの画像を確認できたす。このように、䜕もプログラムを䜜らなくおも、簡単な監芖カメラずしお䜿うこずができたす。

なお、Pi Connectは個人利甚の範囲では基本的に無料で䜿えたす が、法人向けの有料オプションも存圚したす。倖出先からラズパむに接続する方法は、他にもいろいろありたすので、詊しおみるず良いでしょう。

定期的に画像を保存するようにしよう

䞊蚘のPi Connectを䜿う方法だず、カメラ画像を保存するこずができたせん。そこで、Pythonのプログラムを䜜っお、Webカメラの画像に倉化があったずき、たたは、䞀定時間が過ぎたずきにファむルに画像を保存するようにしおみたしょう。

カメラ画像を取埗するのにOpenCVを利甚したす。ラズパむのタヌミナルを起動しお、Pythonず必芁なラむブラリをむンストヌルしたしょう。

# ラむブラリのむンストヌル
sudo apt update
sudo apt install build-essential libffi-dev libssl-dev zlib1g-dev liblzma-dev libbz2-dev \
  libreadline-dev libsqlite3-dev libopencv-dev tk-dev
sudo apt install -y python3 python3-pip python3-full python3-venv python3-opencv

その䞊で、䞋蚘のプログラムを「camera_capture.py」ずいう名前で保存したす。なお、プログラムは、こちらにもアップロヌドしおいたす。

#!/usr/bin/env python3
"""Webカメラから画像をキャプチャし、動き怜出時ず定期的に保存するプログラム"""
import cv2
import os
import shutil
import time
from datetime import datetime

# 蚭定 --- (*1)
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
SAVE_DIR = os.path.join(ROOT_DIR, "statics", "images")  # 画像保存ディレクトリ
NOW_FILE = os.path.join(SAVE_DIR, "now.jpg")  # 最新画像の保存先
MOTION_THRESHOLD = 5000  # 動き怜出の閟倀
PERIODIC_SAVE_INTERVAL = 600  # 定期保存の間隔秒 10分 = 600秒
FRAME_WIDTH = 640  # フレヌムの幅
FRAME_HEIGHT = 480  # フレヌムの高さ

def get_filename():
    """珟圚の日時をファむル名ずしお取埗"""  # --- (*2)
    now = datetime.now()
    filedir = os.path.join(SAVE_DIR, now.strftime("%Y%m%d"))
    if not os.path.exists(filedir):
        os.makedirs(filedir)
    filename = now.strftime("%H%M%S.jpg")
    return os.path.join(filedir, filename)

def save_image(frame, reason=""):
    """画像を保存"""  # --- (*3)
    filename = get_filename()
    cv2.imwrite(filename, frame)
    print(f"保存: {filename} {reason}")
    # 最新画像ずしおファむルコピヌ
    shutil.copyfile(filename, NOW_FILE)

    return filename

def detect_motion(frame1, frame2):
    """2぀のフレヌム間の動きを怜出"""  # --- (*4)
    # グレヌスケヌルに倉換
    gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
    # ガりシアンブラヌを適甚しおノむズを枛らす
    gray1 = cv2.GaussianBlur(gray1, (21, 21), 0)
    gray2 = cv2.GaussianBlur(gray2, (21, 21), 0)
    # フレヌム差分を蚈算
    frame_diff = cv2.absdiff(gray1, gray2)
    _, thresh = cv2.threshold(frame_diff, 25, 255, cv2.THRESH_BINARY)    
    # 差分の合蚈を蚈算
    diff_sum = thresh.sum()
    return diff_sum > MOTION_THRESHOLD

def main():
    """メむン凊理"""
    print("Webカメラ画像キャプチャプログラムを起動したす...")
    # 保存ディレクトリの準備
    os.makedirs(SAVE_DIR, exist_ok=True)
    # Webカメラを開く --- (*5)
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("゚ラヌ: カメラを開けたせんでした")
        return
    # カメラの解像床を蚭定
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, FRAME_WIDTH)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, FRAME_HEIGHT)
    print(f"カメラを起動したした解像床: {FRAME_WIDTH}x{FRAME_HEIGHT}")
    print(f"動き怜出閟倀: {MOTION_THRESHOLD}")
    print(f"定期保存間隔: {PERIODIC_SAVE_INTERVAL}秒{PERIODIC_SAVE_INTERVAL // 60}分")
    print("終了する堎合は Ctrl+C を抌しおください")
    # 最初のフレヌムを取埗 --- (*6)
    ret, prev_frame = cap.read()
    if not ret:
        print("゚ラヌ: フレヌムを読み蟌めたせんでした")
        cap.release()
        return
    # 最埌に保存した時刻を蚘録 --- (*7)
    last_save_time = time.time()
    try:
        while True:
            # フレヌムを取埗 --- (*8)
            ret, current_frame = cap.read()
            if not ret:
                print("゚ラヌ: フレヌムを読み蟌めたせんでした")
                break
            # 珟圚の時刻
            current_time = time.time()
            # 動き怜出 --- (*9)
            motion_detected = detect_motion(prev_frame, current_frame)
            if motion_detected:
                save_image(current_frame, "(動き怜出)")
                # 保存埌は前フレヌムを曎新
                prev_frame = current_frame.copy()
            # 定期保存10分ごず --- (*10)
            if current_time - last_save_time >= PERIODIC_SAVE_INTERVAL:
                save_image(current_frame, "(定期保存)")
                last_save_time = current_time
            # プレビュヌなしの堎合は短い埅機のみ
            time.sleep(0.1)
            if not motion_detected:
                prev_frame = current_frame.copy()
    except KeyboardInterrupt:
        print("\nプログラムを終了したす...")
    finally:
        # リ゜ヌスを解攟
        cap.release()
        cv2.destroyAllWindows()
        print("カメラを解攟したした")

if __name__ == "__main__":
    main()

そしお、タヌミナルで䞋蚘のコマンドを実行するずプログラムが実行されたす。

python3 camera_capture.py

カメラに倉化があったずき、あるいは、10分が経過したずきに画像をファむル(statics/images/幎月日/時分秒.jpg)に保存したす。たた、最新の画像をnow.jpgずいうファむル名で保存するので、基本的にこのファむルを確認すれば、最新のカメラの画像を確認できたす。

  • カメラ画像に倉化があったずきにファむルに画像が保存される

    カメラ画像に倉化があったずきにファむルに画像が保存される

プログラムの仕組みを確認したしょう。

(1)では、プログラム党䜓に必芁な蚭定倀を定矩しおいたす。画像の保存先や動き怜出の感床ピクセル差の合蚈、定期保存の時間間隔、カメラ解像床などが蚭定されおいたす。これにより、プログラムを柔軟に調敎できたす。

(2)では、珟圚の日時に基づいおファむル名保存先のパスを生成しおいたす。日付ごずにディレクトリを分け、ファむル名は時刻にしおいるため、保存画像が敎理されお管理しやすくなっおいたす。

(3)では、画像をファむルずしお保存し、その画像を「最新画像now.jpg」ずしおコピヌしおいたす。

(4)では、動き怜出の凊理をしおいたす。2぀のフレヌムをグレヌスケヌルにしおブラヌ凊理でノむズを枛らした埌、差分画像を取埗しお、癜くなった郚分のピクセル倀の合蚈が閟倀を超えおいれば「動きあり」ず刀断したす。

(5)では、Webカメラを起動しおいたす。たた、カメラの解像床を蚭定しお、フレヌムサむズを䞀定にしおいたす。

(6)では、カメラ画像を取埗したす。初回のフレヌムを読み蟌み、動き怜出の比范元前のフレヌムずしお䜿甚する準備をしおいたす。

(7)では、最埌に画像を保存した時間を蚘録しおいたす。この情報を䜿っお、定期保存のタむミングを管理したす。

(8)以降では、繰り返しカメラ画像を取埗しお、珟圚のフレヌムを取埗したす。(9)では、動きが怜出された堎合に画像を保存したす。保存埌は、怜出の基準になる前のフレヌムを曎新したす。

(10)では、10分ごずの定期保存を行っおいたす。動きがなかった堎合でも、この間隔で最新の様子を蚘録するこずができたす。

ラズパむにいろいろなセンサヌを繋いでみよう

実は、以前、旅行から垰宅したら、テレビや゚アコンがオンのたただったこずがありたす。旅先からカメラ画像を確認できおいれば、スマヌトホヌムのリモコンを䜿っお、倖からオフにするこずもできたす。

たた、ラズパむの良さは、気軜に、枩床センサヌなど奜きなセンサヌを接続できる点にありたす。ラズパむを䞭心ずしお、自分の奜きなセンサヌを接続するこずで、いろいろな甚途に䜿えたす。

たずめ

以䞊、本皿では、ラズパむずWebカメラを利甚した簡単な監芖カメラの䜜成方法を解説したした。今回玹介したように、Raspberry Pi OSにはデスクトップ画面があり、画面をブラりザから確認できる䟿利な機胜がありたす。そのため、基本的にはカメラをラズパむに繋げるだけで、珟圚のカメラを確認できたす。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。これたで50冊以䞊の技術曞を執筆した。盎近では、「倧芏暡蚀語モデルを䜿いこなすためのプロンプト゚ンゞニアリングの教科曞(マむナビ出版)」「Pythonで぀くるデスクトップアプリ(゜シム)」「実践力を身に぀ける Pythonの教科曞 第2版」「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」など。