【Python】ネットワークカメラ(IPカメラ)でリアルタイムストリーミング【RTSP, OpenCV】

Pythonプログラムで、ネットワークカメラ(IPカメラ)を使ってリアルタイムストリーミングする方法をご紹介します。
RTSPプロトコルとOpenCVを利用します。
ネットワークカメラは次を使用します。

記事の最後にサンプルコードを載せています。
コピペで簡単に利用できますのでどうぞご活用ください。

やること
・ネットワークカメラをWiFi接続
・ネットワークカメラをRTSP設定
・RTSPプロトコルでカメラに接続
・フレーム取得してリアルタイムストリーミング

それでは順に見ていきましょう!

目次

やること

OpenCVを使ってリアルタイムストリーミングするところは共通です。
前半のRTSPプロトコルで接続するまでは、今回使用するTP-Link Tapo C210固有の設定です。

お使いのネットワークカメラに合わせて適宜読み替えてください。

ネットワークカメラをWiFI接続

TP-Link Tapo C210をお使いのWiFiに接続します。
Tapoアプリを使用します。
案内に従いWiFi接続をして、アプリ上からストリーミング取得できるところまで進めます。

詳しくは公式サイトをご参照ください。
TP-Link Tapo C210
https://www.tp-link.com/jp/smart-home/tapo/tapo-c210/

ネットワークカメラをRTSP設定

ネットワークカメラにURL接続するためのRTSP設定を行います。
RTSP(Real-Time Streaming Protocol)は、リアルタイムでメディアストリーミングを制御するためのプロトコルです。IPカメラ、ビデオ会議、ライブストリーミングなどで広く活用されています。
URLを使用してメディアセッションの開始、停止、制御を可能にし、ビデオや音声のストリーミングに使用されます。

TP-Link公式の情報としては次があります。

Tapoを使用したRTSPライブストリーミングの利用方法
https://www.tp-link.com/jp/support/faq/2680/

上記を参考にRTSP設定していきましょう!

最終的に次のようなURL形式で接続できます。
camera_url = "rtsp://<ユーザーネーム>:<パスワード>@<IPアドレス>:554/stream1"

そのための設定は次の通りです。
Tapoアプリから設定します。

STEP
高度な設定に進みます
STEP
カメラのアカウントに進みます
STEP
アカウントのユーザーネーム・パスワードを設定します

これでRTSP設定は完了です、

RTSPプロトコルでカメラに接続

IPアドレスは次の画面から確認できます。

先ほどのRTSP設定と合わせて次のようにしてネットワークカメラに接続します。

import cv2

# カメラに接続
camera_url = "rtsp://<ユーザーネーム>:<パスワード>@<IPアドレス>:554/stream1"
cap = cv2.VideoCapture(camera_url)

これまで確認してきたとおり、次の3つはそれぞれの環境に応じた値に変更ください。
・ユーザーネーム
・パスワード
・IPアドレス

フレーム取得してリアルタイムストリーミング

無事接続までできましたら、USBカメラなどでリアルタイムにフレーム取得する応用です。

import cv2

# ウィンドウを作成
cv2.namedWindow("Real-time Video", cv2.WINDOW_NORMAL)

while True:
    # フレームを取得
    ret, frame = cap.read()

    if not ret:
        print("フレームを取得できません")
        break

    # フレームをウィンドウに表示
    cv2.imshow("Real-time Video", frame)

サンプルコード

これまでの内容を合体すると次のようになります。

import cv2

# カメラに接続
camera_url = "rtsp://<ユーザーネーム>:<パスワード>@<IPアドレス>:554/stream1"
cap = cv2.VideoCapture(camera_url)

# カメラが正しく接続されたか確認
if not cap.isOpened():
    print("カメラに接続できません")
    exit()

# ウィンドウを作成
cv2.namedWindow("Real-time Video", cv2.WINDOW_NORMAL)

while True:
    # フレームを取得
    ret, frame = cap.read()

    if not ret:
        print("フレームを取得できません")
        break

    # フレームをウィンドウに表示
    cv2.imshow("Real-time Video", frame)

    # 'q'キーを押すとループを終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# カメラとウィンドウをリリース
cap.release()
cv2.destroyAllWindows()

ネットワークカメラにRTSPプロトコルで接続します。
リアルアイムでフレームを取得し、ウィンドウを更新します。
これらの処理をWhileループで繰り返し処理します。

本当にただのイメージ画像になりますが、こんな感じになります。
ネットワークカメラ経由で取得したフレームを、いつものOpenCVウィンドウでリアルタイム表示できるようになりました。
USBカメラでもこんな簡単か!と思ったのですが、ネットワークカメラでもこんな風にできてしまうんですね。

ここまでできれば、本質的には他のストリーミング方法と差異はありません。
例えば、frameに対して、テンプレートマッチングでも画像認識でも物体検出でも、
他のディープラーニング処理でも掛けることができます。
カメラで緑枠に所望の対象物を検知しているやつですね。
テレビや雑誌でみるアレです。

応用を磨けば、想像するあの処理を実装できることでしょう!
是非お試しあれ!

ということで、今回は以上となります。
この記事が少しでもお役に立てれば幸いです。
それでは、読んで頂きありがとうございました!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次