水野翔太 が2021年08月25日に更新
【Python,PHP】監視カメラの映像データをサーバへと送信する
- 監視カメラの制御やサーバへのデータの送信などについて、木村涼と共にプログラムを作成した。
- 私は主にサーバとの通信、サーバ側の処理を担当したため、これについて記述する。
- 監視カメラの映像に関する解説はこちらへ(木村涼.「前期に取り組んだ内容」)
作成したプログラムの紹介
ファイル名をサーバへ送信するプログラム
- 次のプログラムは、監視カメラが撮影した映像のファイル名を取得し、サーバへと送信するプログラムである。
- 実際の運用時には、カメラの起動時と映像データの削除があったときに、関数が呼び出されファイル名の更新が行われる。
- 送信されたファイル名のデータは、サーバ側からファイル名を指定し、映像データをサーバへと送信させるために用いられる。
- 作成したプログラム(Python)
import os import csv import requests def sendFileName(): dataSendCam="post先のurl"#post先のurl path="取得する映像ファイルのpath" files = os.listdir(path) files_dir = [f for f in files if os.path.isdir(os.path.join(path, f))] print(files_dir) files_dir=list(map(lambda x:path+x,files_dir)) print(files_dir) fileList = list(map(lambda x:os.listdir(x),files_dir)) fileNames=[] for file in fileList: fileNames=file+fileNames print(fileNames) with open('ファイル名を記録するファイル', 'w') as f: w = csv.writer(f,lineterminator='\n') for file in fileNames: w.writerow([file]) f.close() sendData={"formの名前":open('ファイル名を記録するファイル',"rb")} requests.post(dataSendCam, files=sendData)#映像のpost
- なおサーバ側では、受信したファイル名のデータを記録するPHPを用意してある。
- 参考:PHP: file_put_contents - Manual
映像データをサーバへ送信するプログラム
- 次のプログラムは、監視カメラの映像データを送信するプログラムである。
- サーバから送信するファイル名を取得し、監視カメラ側のPCから映像データを送信している。
- サーバへのリクエストに対するレスポンスにファイル名を含めることで、監視カメラ側のPCに送信させる映像データを指定している。
- 作成したプログラム(Python)
import os import cv2 import time import requests dataSendCam="post先のurl"#post先のurl selectDate="取得するファイル"#取得するファイル選択 while True: response = requests.post(selectDate) returnDate=(response.text).split(",") if(returnDate[0] != '\r\n'): for tmpDate in returnDate: fileNameDate=str(tmpDate) moviePath='./'+ fileNameDate[:8] +'/'+ fileNameDate if os.path.isfile(moviePath): with open(moviePath, 'rb') as file: tmp=requests.post(dataSendCam, data=file,headers={'content-type':"application/octet-stream"}) print(tmp.text) #if(tmp.text=="complete"): tmp=requests.post(dataSendCam, data={"videoName":fileNameDate}) print(tmp.text) time.sleep(5) # キー待ち if cv2.waitKey(1) & 0xFF == ord('q'): break
- サーバ側では、受け取った映像データをPHPのfile_get_contents関数を用いて取得している。
- 「file_get_contents("php://input")」を用いることにより、JSON形式のデータや大きなデータでも取得が可能になる。
- 参考:【PHP】JSONでPOSTされた値の取り出し方。file_get_contents("php://input") するようだ。 - Qiita
映像データを取得するためのWEBページ
- サーバ側ではWEB上で、取得する映像データの指定とダウンロードを行えるようにしている。
- WEBページの作成には、PythonをCGIとして用いて、formからのデータ取得、映像データのダウンロードリンクの生成、監視カメラ側PCからのリクエストに対するレスポンス内容の変更処理などを行っている。
- 「cgi.FieldStorage()」関数の使い方は、公式のサポートページがあり、これを参考にした。
- 参考:cgi --- CGI (ゲートウェイインターフェース規格) のサポート — Python 3.9.4 ドキュメント
- 次の画像は、作成したWEB上でのインタフェースである。
- 現在はまだ開発中のため、簡素なものとなっている。今後、CSS、JavaScriptを用いたインターフェース開発に取り組んでいく予定である。
- ホームページ
- 映像のダウンロードページ