IoTで水耕栽培研究

水耕栽培とかIoTの備忘録

ネットワークカメラとRaspberry Piの連携

こんにちは!
前回の続きで、購入したネットワークカメラをRaspBerry Piの連携をご紹介します。

前回は購入したネットワークカメラ C200についてご紹介しました。

amesyabody.hatenablog.com

このカメラはRTSP(RealTime Streaming Protocol)に対応しており、 このプロトコルによるリクエストを受け付けてくれる、という特徴があるものでした。
一方で、PythonではRTSPライブラリを利用する事が可能なので、 RaspBerry PiによるC200の制御が可能になるというわけです。

今回はその具体的な方法を説明します。

全体像

やりたいことはこんな感じです。

構成
今回は図の①~③ Pythonで画像データを取得する所まで説明できれば、と思います。

①カメラ単体のアカウント設定

C200を購入し、専用アプリ「Tapo」との紐づけを行った所からのご説明をします。

1. スマホアプリ画面右上の設定 をタップ

スマホアプリ画面の右上 設定をタップ

2. 高度な設定 をタップ

高度な設定 をタップ

3. カメラのアカウント をタップ

カメラのアカウント をタップ

4. アカウント名とパスワードを入力

アカウント名とパスワードを入力

ここはセキュリティを担保する所なので、真面目にパスワードを設定する事を推奨します。 これでRTSP通信の準備ができました。

②角度調整

スマホアプリのカメラ画面に戻り、画像下のコントローラで移したい角度に調整します。 このパンチルト調整が細かくできて、とても便利です。

角度調整もアプリで行います。便利~
この角度調整も、Pythonで制御することが可能ですが、今回の用途では必要ありません。

Pythonで画像取得リクエス

①で取得したカメラのアカウント名とパスワードを用いて、RTSP通信による画像取得をRaspBerry Piから取得します。

下準備

pythonOpenCVライブラリをインストールしましょう。

pip install opencv-python

OpenCVは画像や動画を処理する汎用性の高いライブラリです。 無料で使えるのが気が引けるくらい豊富な機能を持っています。 今回はこのライブラリのRTSPビデオキャプチャを使います。

import cv2 #OpenCV
import os
from datetime import datetime as dt

user_id = "amesyabody" #①で指定したアカウント名
user_pw = "hogehuga" #①で指定したパスワード
host = "xxx.xxx.xxx.xxx" #カメラのIPアドレス
port = "554" #RTSPポート
stream = "stream2" #解像度を指定する stream1:1920x1080 stream2:640x360

cap = cv2.VideoCapture(f"rtsp://{user_id}:{user_pw}@{host}:{port}/{stream}")
ret, frame = cap.read()

# 日付読み込み
tdatetime = dt.now()
tstr = tdatetime.strftime('%Y-%m-%d-%H-%M-%S')
print(tstr+".jpg")

# 静止画ファイル保存
cv2.imwrite(tstr+".jpg", frame)

cv2.VideoCaptureにてRTSP通信のパラメータを指定してリクエストしていることがわかります。 コード内のアカウント名、パスワード、IPアドレスなどは都度環境に合わせて設定する必要がありますが、 OpenCVのおかげでかなり簡単なコードとなってます。これを実行すると、日付日時の名前のついた 画像ファイルをキャプチャすることが可能です。

最後に

無料のライブラリを活用することでとにかく安価にネットワークカメラの制御を行うことが出来ました。 次回になるかわかりませんが、この画像撮影を定期的にクラウドに保存する自動化までしたいと思います。 (実はもうできているのですが、記事に書くのが大変~"(-""-)")。 近頃は気温の変化が急激で、野菜の成長も著しいです。 色々報告したいこともたまってきてますので、頑張って書いていこうと思います。

ではまた!