見出し画像

留守時のペットを監視するPythonシステムの作成方法

Pythonを使ってカメラ、マイク、自動装置を連携させ、ペットの監視システムを作る方法を解説します。


①必要な機材と準備

ハードウェア
カメラ(USBウェブカメラやIPカメラ)
マイク(USBマイクまたは内蔵マイク)
自動装置
(例: おやつを出すフィーダー、スマートプラグ)
・PCまたはRaspberry Pi
(Pythonを実行する環境)

ソフトウェア
・Python 3.x
必要なライブラリ
(後述)
OS環境
(Windows, macOS, Linux, またはRaspberry Pi OS)


Pythonプロフェッショナルプログラミング 第4版 ↓


②Python環境のセットアップ

まずPythonをインストールします。以下の手順に従ってください。

Pythonを公式サイト(python.org)からダウンロードしてインストールします。
❷以下のコマンドで必要なPythonライブラリをインストールします。

pip install opencv-python numpy pyaudio flask gpiozero

opencv-python
画像・映像処理ライブラリ。

numpy
数値計算ライブラリ。

pyaudio
音声の録音と処理用。

flask
ウェブアプリケーションフレームワーク
(ライブ配信に使用)

gpiozero

Raspberry PiのGPIO制御用
(Raspberry Piを使う場合のみ)


よくわかるPython入門 ↓


③基本構成

監視システムは次の3つの機能を持ちます。

❶カメラ映像の録画とストリーミング
→ ペットの様子をリアルタイムで確認できる。
❷音声検知
→ ペットの声や異常音(吠え声、騒音)を検出。
❸自動装置の制御
→ スマートプラグやモーターでおやつフィーダーを動かす。


④実装ステップ


❶カメラ映像のストリーミング

OpenCVFlaskを使って、カメラ映像をリアルタイムで表示します。

サンプルコード

import cv2
from flask import Flask, Response

app = Flask(__name__)

def generate_frames():
    camera = cv2.VideoCapture(0)  # カメラを取得
    while True:
        success, frame = camera.read()
        if not success:
            break
        else:
            # 映像をJPEG形式に変換
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

@app.route('/video')
def video_feed():
    return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

ポイント
ブラウザで http://<IPアドレス>:5000/video にアクセスすると映像が確認できます。
・cv2.VideoCapture(0)USBカメラを指します。

注意点
IPカメラの場合、カメラのURLを指定します。

cv2.VideoCapture("http://<IP_CAMERA_URL>/video")

❷音声の録音と検知

pyaudioを使って音声を録音し、異常音を検知します。

サンプルコード

import pyaudio
import numpy as np

def detect_sound():
    chunk = 1024  # サンプルサイズ
    rate = 44100  # サンプリングレート
    threshold = 500  # 音量の閾値

    audio = pyaudio.PyAudio()
    stream = audio.open(format=pyaudio.paInt16, channels=1, rate=rate, input=True, frames_per_buffer=chunk)

    print("音声を検知中...")
    try:
        while True:
            data = np.frombuffer(stream.read(chunk), dtype=np.int16)
            volume = np.linalg.norm(data)
            if volume > threshold:
                print("異常音を検知しました! 音量:", volume)
    except KeyboardInterrupt:
        print("終了")
        stream.stop_stream()
        stream.close()
        audio.terminate()

detect_sound()

ポイント
・thresholdを調整して、ペットの声など特定の音量を検知できます。

注意点
音声デバイスの設定(例: マイクの感度)を調整してください。


Pythonプログラミングパーフェクトマスター[最新Visual Studio Code対応 第4版] (Perfect Master 192) ↓


❸自動装置の制御

Raspberry Pigpiozeroを使い、モーターやLEDを制御します。

サンプルコード(おやつフィーダーを動かす)

from gpiozero import Servo
from time import sleep

servo = Servo(17)  # GPIO 17に接続

def dispense_treat():
    print("おやつを出します...")
    servo.max()
    sleep(1)
    servo.min()
    sleep(1)

dispense_treat()

ポイント
・GPIOピン番号は使用しているピンに応じて変更してください。
スマートプラグを使う場合は専用APIを利用します。
(例: TP-Link KasaのAPI)

注意点
・Raspberry PiGPIO端子に正しく接続し、過電流を防ぐために抵抗を使用してください。


⑤システム統合

上記3つの機能を統合して、音声検知やリアルタイム映像をベースに自動装置を動かすようにします。

統合コード(例)

import cv2
from flask import Flask, Response
import pyaudio
import numpy as np
from gpiozero import Servo
from threading import Thread
from time import sleep

app = Flask(__name__)
servo = Servo(17)

# カメラストリーミング
def generate_frames():
    camera = cv2.VideoCapture(0)
    while True:
        success, frame = camera.read()
        if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

@app.route('/video')
def video_feed():
    return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

# 音声検知
def detect_sound():
    chunk = 1024
    rate = 44100
    threshold = 500
    audio = pyaudio.PyAudio()
    stream = audio.open(format=pyaudio.paInt16, channels=1, rate=rate, input=True, frames_per_buffer=chunk)
    try:
        while True:
            data = np.frombuffer(stream.read(chunk), dtype=np.int16)
            volume = np.linalg.norm(data)
            if volume > threshold:
                print("異常音を検知しました!")
                dispense_treat()
    except KeyboardInterrupt:
        stream.stop_stream()
        stream.close()
        audio.terminate()

# おやつフィーダー制御
def dispense_treat():
    print("おやつを出します...")
    servo.max()
    sleep(1)
    servo.min()
    sleep(1)

# 並行実行
if __name__ == '__main__':
    Thread(target=detect_sound).start()
    app.run(host='0.0.0.0', port=5000)

⑥注意点と改善案

セキュリティ
ストリーミングのURLは安全なネットワーク内で使用してください。

電力供給
Raspberry Piなどを使用する場合、安定した電力供給が必要です。

動作確認
ハードウェア(カメラ、マイク、モーター)を個別にテストしてから統合してください。


⑦今後の発展

AIを使った動物行動の検知
(TensorFlowなど)
モバイルアプリとの連携。
クラウドストレージへのデータ保存。


まとめ

これで、基本的なペット監視システムの構築が可能です!

いいなと思ったら応援しよう!