【Python】顔検出後にSlackへ自動通知する方法|不審者検知や来客通知に

【Python】カメラ映像にテキストやロゴをリアルタイムで合成する方法 Python

監視カメラの映像を見続けるのは非効率です。PythonとOpenCVを使えば、顔を検出したタイミングで自動的にSlackへ通知を送るシステムが構築できます。

この記事では、リアルタイム映像から顔を検出し、その瞬間にSlackへメッセージと画像付きで通知する方法を紹介します。不審者検知やオフィス来客通知などに応用可能です。

使用するライブラリ

pip install opencv-python slack_sdk

Slackの通知には slack_sdk を使います。

Slack側の準備:Webhook URLの取得

  1. Slack App管理ページで新規アプリ作成
  2. 「Incoming Webhooks」を有効にする
  3. 通知先チャンネルを選択し、Webhook URL を取得

顔検出とSlack通知を組み合わせたスクリプト

import cv2
import datetime
import requests

# Haar Cascadeによる顔検出器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

# Slack Webhook URL
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/XXXXXXXX/XXXXXXXX/XXXXXXXXXXXXXXXX"

def notify_slack(image_path):
    with open(image_path, 'rb') as f:
        img_data = f.read()
    response = requests.post(
        SLACK_WEBHOOK_URL,
        json={
            "text": "⚠️ 顔を検出しました。",
            "attachments": [{
                "fallback": "顔検出画像",
                "image_url": "画像はこの方法では直接送信できません。ファイルアップロード方式推奨。"
            }]
        }
    )
    print("Slack通知:", response.status_code)

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    if len(faces) > 0:
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

        # 顔検出時に画像保存とSlack通知(1回だけに制限可能)
        now = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        filename = f"detected_{now}.jpg"
        cv2.imwrite(filename, frame)
        notify_slack(filename)
        print("顔検出 → Slack通知")

        # 1検出ごとに待機時間(スパム防止)
        cv2.waitKey(5000)

    cv2.imshow("Face Monitor", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Slackに画像を送る方法(ファイルアップロード)

Webhookでは画像の「URL共有」は可能ですが、ローカル画像のアップロードにはSlack APIのファイルアップロード機能が必要です。

from slack_sdk import WebClient

slack_token = "xoxb-xxxxxxxxxxxx"
client = WebClient(token=slack_token)

def upload_to_slack(file_path, message):
    client.files_upload(
        channels="#通知チャンネル",
        file=file_path,
        title="検出された人物",
        initial_comment=message
    )

応用例

  • 特定の顔だけを通知対象にする(顔認識)
  • LINEやメールと併用するマルチ通知
  • 夜間のみ通知するようにスケジュール制御
  • 検出ログをCSVで保存

まとめ

PythonとOpenCV、Slack APIを組み合わせることで、カメラに映った人物を検出して即時通知するシステムが簡単に実現できます。通知機能を組み込むことで監視作業の省力化やセキュリティ向上が期待できます。

今後は顔認証や人物識別との連携、検出頻度の記録、クラウド保存などへの拡張も可能です。まずは基本構成から構築してみましょう。