「Raspberry Pi」(通称: ラズパイ)は、安価な手のひらサイズの小型コンピューターです。Linuxを動かすことができて、電子工作用途にも使えます。IoTブームでとりあえず買ってはみたけれど、今は押し入れで眠っているという方も多いのではないでしょうか。本稿では、ラズパイを活用して、監視カメラを作って、留守がちな年末年始に活用することを目指してみましょう。
ラズパイとは?
そもそも、Raspberry Piは、イギリスのRaspberry Pi財団(Raspberry Pi Foundation)が教育目的で開発した小型コンピュータです。安価でクレジットカードと同じくらいのサイズなので、1つ持っていても邪魔になりません。
最近では教育用途にとどまらず、Linuxが動作する手軽なマシンとして、個人開発や研究用途で広く使われています。消費電力も低いことから、サーバーやバッチ処理、電子工作まで、さまざまな場面で活用できます。
一般的な家電量販店では売っていないものの、IoTブームの2013年に200万台が販売され、2025年3月までに、なんと合計6,800万台以上が販売されました。販売台数からもラズパイの人気が窺えるのではないでしょうか。
ラズパイの購入に関して
2025年現在、Raspberry Pi 5が現行の主力モデルとして販売されています。メモリの搭載量によって価格が異なりますが、メモリが8GBのモデルであれば、Amazonで17000円前後で入手できます。ただし、ラズパイは本体だけ入手しても何もできず、電源やSDカード、本体ケースなど必要なものを揃える必要があり、トータルで2〜3万円ほどが必要となります。
本稿ではラズパイを監視カメラの作成に使いますが、この用途であれば、一世代前のラズパイでも全く問題ありません。筆者は、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」を起動したら、持っているデバイスを選択、OSを選択と、「次へ」ボタンを順にクリックしていけば、あっという間にセットアップ完成です。Imagerを使って、Wi-Fiの設定もできるのでとても楽です。
Raspberry Pi OSのデスクトップを堪能しよう
デフォルトのRaspberry Pi OSでは、GUIが有効となっています。パスワードを入れてログインすると、一般的なデスクトップPCのように利用できます。左上のラズパイアイコンをクリックすると、メニューが表示されるので、ブラウザなど、いろいろなアプリを起動できます。
デフォルトでは、最低限のアプリしか入っていませんが、Debian/Linux由来の多くのフリーソフトを簡単にインストールして使うことができます。ラズパイメニューの「Preferences > Recommended Software(オススメのソフトウェア)」をクリックすると、一覧からアプリを選んでインストールできます。
プログラミングに便利な「Visual Studio Code」も手軽にインストールできます。「Programming > Visual Studio Code」をチェックして右下の「Apply」をクリックするとインストールが始まります。
また、うまくWi-Fiが設定できていなかった場合には、右上の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」ボタンを押すと動画を保存できます。
続いて、Raspberry Pi Connectをセットアップします。これは、パソコンのブラウザなどからRaspberry Piの画面やリモートシェルにアクセスできる便利なサービスです。こちらでアカウントを作成したら、ラズパイ本体の右上にある「Raspberry Pi Connect」にサインインします。
そして、パソコンのブラウザを開いて、Pi Connectにサインインします。こちらにある端末一覧の画面を開いて、「Connect via > Screen sharing」をクリックします。すると、次の画面のようにラズパイの画面が表示されます。
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自動処理の教科書(マイナビ出版)」など。










