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アプリから設定します。
これで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
に対して、テンプレートマッチングでも画像認識でも物体検出でも、
他のディープラーニング処理でも掛けることができます。
カメラで緑枠に所望の対象物を検知しているやつですね。
テレビや雑誌でみるアレです。
応用を磨けば、想像するあの処理を実装できることでしょう!
是非お試しあれ!
ということで、今回は以上となります。
この記事が少しでもお役に立てれば幸いです。
それでは、読んで頂きありがとうございました!