Uncategorized PR

Google Nestカメラ × OBS × Pythonで、フトアゴの行動を可視化してみた

記事内に商品プロモーションを含む場合があります

結論:Nestカメラでもリアルタイム行動分析はできる

Google Nestカメラの映像をブラウザ経由でOBSに取り込み、
さらに仮想カメラ経由でPython(OpenCV)に渡すことで、
フトアゴヒゲトカゲ「からし」の動きをリアルタイムに分析できるようになります。

専用の監視システムを使わずに、自宅環境だけで行動解析を実現できるのが最大の利点です。


理由:Nestカメラは直接アクセスが制限されている

Google Nestカメラは、公式API経由以外での映像取得が制限されています。
そのため、Pythonなどのプログラムから直接ストリームを扱うことは困難です。

そこで、映像を一度ブラウザで表示し、OBS(Open Broadcaster Software)でキャプチャ。
OBSの仮想カメラ出力を利用することで、PythonからWebカメラのように映像を取得できます。

この方法は、Nestカメラ以外のネットワークカメラにも応用可能です。


手順:3ステップで構築する

1. Nestカメラの映像をブラウザで開く

  1. Google Home Web にアクセス
  2. 対象のカメラ(からし)を選び、ライブ映像を表示
  3. 映像が常に見えるようにウィンドウを固定(ピクチャーインピクチャーでも可)

2. OBSで映像を取り込む

  1. OBSを起動
  2. 「ソース」→「+」→「ウィンドウキャプチャ」を選択
  3. Nestカメラを表示しているブラウザウィンドウを指定
  4. Altキーを押しながらドラッグで余白をトリミング

その後、「仮想カメラ開始」ボタンをクリックすると、
OBSの映像がシステム上で「Webカメラ」として認識されます。


3. Pythonで映像を読み込む

import cv2

cap = cv2.VideoCapture(0)

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

    cv2.imshow("Karashi Live", frame)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

カメラのデバイス番号は環境により異なります。
もし映らない場合は VideoCapture(1)VideoCapture(2) に変更して確認します。


応用1:動き検出(差分によるモーション解析)

映像のフレーム差分を使って動いた瞬間を検出できます。
以下は基本形のスクリプトです。

import cv2

cap = cv2.VideoCapture(0)
ret, prev_frame = cap.read()
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)

while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    diff = cv2.absdiff(prev_gray, gray)
    _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    motion_level = cv2.countNonZero(thresh)
    cv2.putText(frame, f"Motion: {motion_level}", (20, 50),
                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    cv2.imshow("Motion Detection", frame)
    prev_gray = gray
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

数値が大きいほど動きが強いことを意味します。
からしが頭を動かしたり歩いたりすると、数値が急上昇します。


応用2:動いた部分を白く表示する

動いた部分だけを白で表示すれば、どこが動いたかを直感的に把握できます。

import cv2

cap = cv2.VideoCapture(0)
ret, prev_frame = cap.read()
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)

while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    diff = cv2.absdiff(prev_gray, gray)
    _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    thresh = cv2.dilate(thresh, None, iterations=2)
    thresh = cv2.erode(thresh, None, iterations=1)

    cv2.imshow("Karashi Movement Map", thresh)
    prev_gray = gray

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

白い部分が動作領域、黒い部分が静止領域です。
からしが少し動くと、その軌跡が白く浮かび上がります。


応用3:ヒートマップ化(活動量の蓄積)

時間経過とともに動きの多い場所を蓄積し、
活動の多いエリアほど赤く表示するヒートマップを生成します。

import cv2
import numpy as np

cap = cv2.VideoCapture(0)
ret, prev_frame = cap.read()
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)
heatmap = np.zeros_like(prev_gray, dtype=np.float32)

while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    diff = cv2.absdiff(prev_gray, gray)
    _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    thresh = cv2.dilate(thresh, None, iterations=2)
    thresh = cv2.erode(thresh, None, iterations=1)

    heatmap += thresh / 255.0
    heatmap = np.clip(heatmap, 0, 255)

    heatmap_color = cv2.applyColorMap(heatmap.astype(np.uint8), cv2.COLORMAP_JET)
    blended = cv2.addWeighted(frame, 0.4, heatmap_color, 0.6, 0)

    cv2.imshow("Karashi Heatmap", blended)
    prev_gray = gray

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

赤い部分が「よく動いた場所」、青い部分が「ほとんど動かない場所」を示します。
長時間観察すれば、からしのバスキング位置や活動パターンが可視化されます。


まとめ:からしの行動を「データ」で観察する

Nestカメラの映像を活用し、OBSとPythonを組み合わせることで、
単なる監視映像が「行動研究ツール」へと変わります。

フレーム差分で動きを検出し、ヒートマップで可視化することで、
フトアゴの生活リズムを数値と色で理解できるようになります。

観察が記録になり、記録が研究になる。
身近なペットの行動をデータサイエンスで見る――その第一歩がここから始まります。


次回予告

ヒートマップを時間帯ごとに分割し、
からしの「朝・昼・夜」の活動リズムをグラフ化してみる予定です。