Raspberry Piで作る!愛犬・愛猫のための自動見守りカメラシステム
仕事に集中している最中、ふと「家でお留守番している愛犬、寂しがっていないかな?」「体調は大丈夫かな?」と気になって、ついスマホでペットカメラアプリを開いてしまうことはありませんか?
その「確認」という小さな行為こそが、実は集中力をブツブツと途切れさせ、脳のワーキングメモリを浪費させている最大の原因かもしれません。
この記事では、そんな「心配性なエンジニア」の私が、試行錯誤の末に開発した 「PythonとOpenCVによる自作のペット動体検知・LINE画像自動送信システム」 のソースコードを公開し、テクノロジーで脳のメモリを解放しつつ、愛犬の安全を守る仕組みを紹介します。
出張中の手動確認が招いた「設計プレゼン大惨事」
一言で言えば、ペット見守りの自動化とは 「自分が能動的に見に行く」から「動きがあった時だけ通知が来る」へのシフト です。
かつての私は、1時間に何回もペットカメラアプリを起動し、愛犬がただ寝ている姿を確認しては閉じる、という作業を繰り返していました。これは、Web開発における「過剰なAPIのポーリング(頻繁なサーバー問い合わせ)」と同じで、脳とPCのネットワークリソースを無駄に浪費し、非常に疲弊する行為です。
特に数年前、私はこの「手動チェックの悪習慣」によって、仕事で大失態を演じました。
その日、私は大阪へ重要な新規システムの基本設計プレゼンのために出張していました。前夜から愛犬をペットホテルではなく、どうしても自宅で留守番させなければならない事情があり、私は心配で仕方がありませんでした。 プレゼン直前の大事な役員会議の最中も、私はテーブルの下で30分おきに手動でカメラアプリを起動し、愛犬の様子を確認していました。
「大丈夫そうだ」と閉じるたびに脳の集中力は途切れ、プレゼン本番の最中にも「あれ、そういえばさっきの確認で水は足りていたっけ?」と余計な心配が頭をよぎりました。 その結果、緊張と集中力の散漫から説明の論理が破綻し、役員からの核心を突く質問に対して全く見当違いな回答をしてしまったのです。当然プレゼンは不採用となり、会社の重要なビジネスチャンスを1つ不意にしてしまいました。
新幹線の帰り道、激しい後悔の中で私は悟りました。 「心配だからと手動でカメラを見に行くのは、ただ脳のメモリを浪費し、仕事のパフォーマンスを崩壊させるだけの自傷行為である。必要なのは、動きがあった瞬間だけ写真がLINEに送られてくる『受動的なイベントドリブン(イベント駆動)』システムだ」
この痛烈な失敗から、私は余っていたRaspberry PiとUSBカメラを使い、OpenCVの画像処理ライブラリを用いて「ペットがカメラの前を横切った(動いた)瞬間を検知し、その写真をLINE Notifyでスマホに自動送信する」スクリプトを構築しました。これにより、会議中も「LINEが来ない=安全に寝ている」という強力な安心感が得られ、脳のメモリは100%仕事へ集中できるようになりました。
以下は、この動体検知・LINE自動通知システムの処理フローを示す Mermaid シーケンス図です。
sequenceDiagram
autonumber
actor Pet as "ペット (愛犬)"
participant Cam as "カメラ (OpenCV)"
participant Pi as "Raspberry Pi (Python)"
participant LINE as "LINE Notify API"
actor User as "ユーザー (スマホ)"
Pet->>Cam: カメラの前を横切る
Cam->>Pi: フレーム映像を入力
Note over Pi: OpenCVが前フレームとの<br>「差分」を二値化処理
Pi->>Pi: 動き(輪郭)の面積が閾値を超えたか判定
critical "閾値を超えた場合 (動体検知)"
Pi->>Pi: その瞬間のフレームを「image.jpg」として保存
Pi->>LINE: 画像付きPOSTリクエスト (APIコール)
LINE->>User: LINEに「動きを検知しました」と写真付き通知!
end
OpenCVによる自作見守りシステムのメリットと注意点
見守りシステムを自作・自動化するメリットと、運用上のリアルな注意点は以下の通りです。
| メリット | 注意点(デメリット) |
|---|---|
| 無駄なスマホ操作の激減: 自分から見に行く必要が皆無になり、深い没入作業ができる | 外光の変化(カーテンの揺れや日光の差し込み)を「動き」と誤検知することがある |
| 本物の安心感: 「動きがあった瞬間の愛犬の写真」がLINEに送られてくるため、生存と安否が物理的に確認できる | スクリプトの実行環境(Pythonやライブラリ)のセットアップが必要 |
| プライバシーの完全保護: クラウドに動画をアップロードしないため、ハッキングによる自宅映像の流出リスクがゼロ | 暗所(夜間の消灯時)では、赤外線対応カメラモジュールを使用しないと動体検知が機能しない |
【実践】Python × OpenCV によるペット動体検知LINE送信スクリプト
ご自宅のPCやRaspberry PiにWebカメラ(安価なUSBカメラで可)を接続し、以下の手順でシステムを構築します。
ステップ1:必要なPythonライブラリのインストール
画像処理ライブラリの opencv-python をインストールします。
pip install opencv-python requests
ステップ2:Python自動検知プログラムの実装
以下のスクリプトを pet_monitor.py として保存します。このスクリプトは、カメラのリアルタイム映像から「フレーム差分法(前のフレームと現在のフレームの差を取得し、輪郭を抽出する手法)」を用いて動体を検出します。
# Python × OpenCV ペット動体検知 & LINE通知システム
import cv2
import requests
import time
import os
# ================= 設定情報 =================
LINE_TOKEN = "your_line_notify_token_here"
TEMP_IMAGE_PATH = "detected_pet.jpg"
MIN_CONTOUR_AREA = 5000 # 動体として検知する最小面積 (感度調整用)
COOL_DOWN_TIME = 60 # 一度通知した後のクールダウン秒数 (連打防止)
# ==========================================
def send_image_to_line(image_path):
"""保存された画像をLINE Notifyで送信する"""
url = "https://notify-api.line.me/api/notify"
headers = {"Authorization": f"Bearer {LINE_TOKEN}"}
payload = {"message": "\n🐶【ペットお留守番アラート】\nカメラの前で愛犬の動きを検知しました!"}
with open(image_path, "rb") as f:
files = {"imageFile": f}
response = requests.post(url, headers=headers, data=payload, files=files)
if response.status_code == 200:
print(" └─ ✅ LINEに画像を送信しました。")
else:
print(f" └─ ❌ LINE送信失敗: {response.text}")
def main():
# USBカメラまたはカメラモジュールの初期化 (0はデフォルトカメラ)
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("❌ カメラが認識されていません。")
return
print("📸 OpenCV 動体検知システム監視開始...")
time.sleep(2) # カメラの初期起動ウェイト
# 最初のフレームを読み込む
ret, frame1 = cap.read()
if not ret:
return
last_notified_time = 0
while True:
ret, frame2 = cap.read()
if not ret:
break
# 2つのフレームの絶対差分を計算
diff = cv2.absdiff(frame1, frame2)
# グレースケール(白黒)化し、ノイズ除去のためのブラー処理
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# 二値化(白黒はっきりさせる)処理
_, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY)
# 膨張処理(輪郭をはっきりさせる)
dilated = cv2.dilate(thresh, None, iterations=3)
# 輪郭を見つける
contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
# 輪郭の面積を計算
area = cv2.contourArea(contour)
# 閾値より大きい面積の動きのみを検知
if area > MIN_CONTOUR_AREA:
current_time = time.time()
# クールダウン時間内であれば通知をスキップ
if current_time - last_notified_time > COOL_DOWN_TIME:
print(f"🔥 動体を検知しました! (面積: {area:.0f})")
# 検知した瞬間の写真を保存
cv2.imwrite(TEMP_IMAGE_PATH, frame2)
# LINEに送信
send_image_to_line(TEMP_IMAGE_PATH)
last_notified_time = current_time
# 一時ファイルを削除
if os.path.exists(TEMP_IMAGE_PATH):
os.remove(TEMP_IMAGE_PATH)
# 次のループのためにフレームを更新
frame1 = frame2
# CPU負荷を下げるための微小なスリープ
time.sleep(0.1)
cap.release()
if __name__ == "__main__":
main()
よくある質問(FAQ)
Q1. 光の変化やカーテンの揺れを誤検知しないためのコツは?
OpenCVの二値化閾値(cv2.threshold の 20)や、検知する輪郭の最小面積(MIN_CONTOUR_AREA = 5000)の数値を大きく調整することで、細かな誤検知を劇的に減らすことができます。また、カメラの向きを「カーテンが映らない角度」に物理的に調整するのが最も効果的です。
Q2. Raspberry Piで24時間動作させても大丈夫ですか?
はい、PythonとOpenCVは非常に最適化されており、上記スクリプトは不要なCPU負荷を避ける設計(スリープ処理)が入っているため、安価なRaspberry Pi 4等で24時間連続稼働させても発熱やフリーズの問題なく非常に安定して稼働し続けます。
まとめ
ペットの見守りを自動化することは、単なるガジェット導入や過保護な心配ではありません。それは、お留守番している愛犬の安全を最先端のテクノロジーで守りつつ、あなたの脳のメモリを解放するための 「生産性防衛策」 です。
- 能動的な手動チェック(ポーリング)を廃止し、イベント駆動(プッシュ通知)の仕組みを作る
- PythonとOpenCVによるフレーム差分法を活用し、エッジ処理で動体を自動検知する
- 通知は1枚の写真としてLINEに集約し、会議中も「通知がない=安全」の安心感を得る
まずは、机の上に眠っている古いUSBカメラをPCに挿し、動体検知スクリプトを実行するところから始めてみませんか?そのコードが動いた瞬間、あなたの仕事への没頭力と愛犬への安心は、かつてないほど高い次元で両立するはずです。
さらに高度な自動化システムやNotion APIとの連携について知りたい方は、関連記事の「Notion APIとPythonによるルーティン自動生成」も合わせてご覧ください!あなたのスマートな効率化ライフを全力で応援しています。
関連記事(効率化)
GASでGmailの不要なメルマガを自動アーカイブ!毎朝のメール確認をゼロにする方法
2026/05/29
Makefileで複雑なローカル環境構築を1行に!面倒な手順を自動化するレシピ
2026/05/24