見出し画像

Tapoカメラから静止画を取得する


概要

IPカメラ等のRTSPストリームから先頭の画像を静止画(jpeg/png)として取得します。

静止画取得のAPIが用意されていないカメラでも、RTSPは対応している場合が多いので、有効な方法だと思います。

仮想環境の作成とライブラリのインストール

最初に仮想環境を作り、アクティブにします。

$ python -m venv .venv
$ source .venv/bin/activate

OpenCV をインストールします。

$ pip install opencv-python

プログラム

以下のプログラムを rtspimage.py として保存します。

import cv2
import sys

def get_image_from_rtsp(url):
    cap = cv2.VideoCapture(url)
    if not cap.isOpened():
        return None

    ret, frame = cap.read()

    cap.release()
    cv2.destroyAllWindows()

    if not ret:
        return None

    return frame

def main():
    url = sys.argv[1] # rtsp://username:password@192.168.1.45:554/stream2
    out_filename = sys.argv[2]

    frame = get_image_from_rtsp(url)
    if len(frame) > 0:
        cv2.imwrite(out_filename, frame)
    else:
        print('error')

main()

静止画の取得

URLの準備

TP-LINKのIPカメラ、Tapoの場合は以下のようになります。

rtsp://(ユーザー名):(パスワード)@(カメラのIPアドレス)/stream1

ユーザー名とパスワードは「カメラのアカウント」のユーザー名とパスワードです。
カメラのアカウントはスマホアプリの「デバイス設定」「高度な設定」「カメラのアカウント」から設定します。

末尾の stream1 は高解像度(1920x1080)、stream2 に変えることで低解像度(640x360)となります。

実行

$ python rtspimage.py URL 出力ファイル名

出力ファイル名は filename.jpg か filename.png の形で指定可能です。

TP-LINK以外のカメラのURL

他のメーカーのIPカメラでもたいていはRTSPをサポートしているので、URLさえ分れば可能です。

Ctronics

rtsp://ユーザー名:パスワード@IPアドレス:554/11

AXIS

rtsp://ユーザー名:パスワード@IPアドレス:554/axis-media/media.amp


いいなと思ったら応援しよう!

R-Y-O
そのお心がありがたいです。