差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
| tutorial_4 [2022/01/04 16:38] – [第二項 データベースへの接続] satoshi | tutorial_4 [2022/01/04 22:16] (現在) – satoshi | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== 第4章 データベース連携 | + | ====== 第4章 データベースへの結果データ保存【中級編】 |
| この章では3章でCSVで出力していたログをデータベースに入れて、管理しやすくする方法を学びます。\\ | この章では3章でCSVで出力していたログをデータベースに入れて、管理しやすくする方法を学びます。\\ | ||
| 次章でBIツールで利用するための準備となります。\\ | 次章でBIツールで利用するための準備となります。\\ | ||
| ===== 第一項 データベースの作成 ===== | ===== 第一項 データベースの作成 ===== | ||
| - | SCORER Edgeの左メニューからSDK→databaseを表示して右上のADDボタンを押します。\\ | + | SCORER Edgeの左メニューからSDK→Relational Databaseを表示して右上のADDボタンを押します。\\ |
| 設定は基本標準のままで、パスワードだけ、推奨を記録するか自分で入力してください\\ | 設定は基本標準のままで、パスワードだけ、推奨を記録するか自分で入力してください\\ | ||
| {{:: | {{:: | ||
| 行 13: | 行 13: | ||
| データベースはかなり雑に捉えれば、データベースサーバー>データベース>テーブル>レコード(ここに実データが入っている)\\ | データベースはかなり雑に捉えれば、データベースサーバー>データベース>テーブル>レコード(ここに実データが入っている)\\ | ||
| という関係性となっているので、まずはデータベースを作成します。\\ | という関係性となっているので、まずはデータベースを作成します。\\ | ||
| - | 「データベースを作成」をクリックして「tutorial」という名前のデータベースを作成しましょう(照合順序は選ばなくて今回は問題ありません。)\\ | + | 「データベースを作成」をクリックして「tutorial」という名前のデータベースを作成しましょう。照合順序はutf8_general_ciにしておきましょう。\\ |
| {{:: | {{:: | ||
| 行 26: | 行 26: | ||
| import mysql.connector | import mysql.connector | ||
| - | db=mysql.connector.connect(host=" | + | db=mysql.connector.connect(host=" |
| cursor=db.cursor() | cursor=db.cursor() | ||
| 行 55: | 行 55: | ||
| ===== 第三項 スターターコードへの組み込み ===== | ===== 第三項 スターターコードへの組み込み ===== | ||
| + | 前項までの練習用プログラムを03stopinfront_sketch.pyに組み込むと下記のようになります。\\ | ||
| + | <sxh Python; | ||
| + | import mysql.connector | ||
| + | import sys | ||
| + | import os | ||
| + | import json | ||
| + | import cv2 | ||
| + | import math | ||
| + | from datetime import datetime, timedelta, timezone | ||
| + | import csv | ||
| + | import glob | ||
| + | import numpy as np | ||
| + | | ||
| + | if __name__ == ' | ||
| + | | ||
| + | dirpath = ' | ||
| + | duration = 5 | ||
| + | area_def_file = os.environ[' | ||
| + | | ||
| + | JST = timezone(timedelta(hours=+9), | ||
| + | print(sys.argv[1]+" | ||
| + | file_list = sorted(glob.glob(' | ||
| + | print(" | ||
| + | for filename in file_list: | ||
| + | print(filename) | ||
| + | | ||
| + | json_open = open(area_def_file, | ||
| + | result_json_file = open(' | ||
| + | areadef = json.load(json_open) | ||
| + | resultarr = {} | ||
| + | for areaidx, area in enumerate(areadef[' | ||
| + | areaname=' | ||
| + | print(areaname) | ||
| + | resultarr[areaname]={} | ||
| + | print(" | ||
| + | for areaidx, area in enumerate(areadef[' | ||
| + | areaname=' | ||
| + | print(areaname) | ||
| + | polygon = [] | ||
| + | for point in area[' | ||
| + | polygon.append([point[' | ||
| + | | ||
| + | contour = np.array(polygon) | ||
| + | print(contour) | ||
| + | for filename in file_list: | ||
| + | print(areaname+" | ||
| + | if os.path.getsize(filename) == 0: | ||
| + | continue | ||
| + | | ||
| + | raw_json_open = open(filename, | ||
| + | raw_json = json.load(raw_json_open) | ||
| + | | ||
| + | for frame in raw_json: | ||
| + | jptime = datetime.fromtimestamp(frame[' | ||
| + | people = frame[' | ||
| + | for person in people: | ||
| + | | ||
| + | # | ||
| + | personpos = [person[" | ||
| + | test = cv2.pointPolygonTest(contour, | ||
| + | if test>0: | ||
| + | if person[' | ||
| + | resultarr[areaname][person[' | ||
| + | resultarr[areaname][person[' | ||
| + | resultarr[areaname][person[' | ||
| + | if resultarr[areaname][person[' | ||
| + | resultarr[areaname][person[' | ||
| + | else: | ||
| + | resultarr[areaname][person[' | ||
| + | |||
| + | json.dump(resultarr, | ||
| + | |||
| + | db=mysql.connector.connect(host=" | ||
| + | cursor=db.cursor() | ||
| + | cursor.execute(" | ||
| + | db.commit() | ||
| + | cursor.execute(""" | ||
| + | id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, | ||
| + | stream_id VARCHAR(32), | ||
| + | areaname VARCHAR(32), | ||
| + | tracking_id VARCHAR(32), | ||
| + | start_time_jp DATETIME, | ||
| + | end_time_jp DATETIME, | ||
| + | total_duration INT, | ||
| + | stop_judge TINYINT);""" | ||
| + | db.commit() | ||
| + | for areaname, records in resultarr.items(): | ||
| + | print(areaname) | ||
| + | f = open(" | ||
| + | write = csv.writer(f) | ||
| + | write.writerow([" | ||
| + | for tracking_id, | ||
| + | write.writerow([record[' | ||
| + | |||
| + | cursor.execute(" | ||
| + | | ||
| + | db.commit() | ||
| + | f.close() | ||
| + | </ | ||
| + | ハイライトしているところが変更点です。\\ | ||
| + | < | ||
| + | python 04stopinfront_db_sketch.py 20211101 | ||
| + | </ | ||
| + | などで実行すると下記のようにデータベースにデータが入っていることがわかります。\\ | ||
| + | {{:: | ||
| + | なお、2回実行すると同じデータが追加で入ってしまいます(自動付与されるIDは別になりますが)。\\ | ||
| + | 同じ日付を再度実行したい場合はその分のデータをSQLで削除するか、テーブルごと削除して再度実行しましょう。\\ | ||
| + | 次項はこのデータをMetabaseというBIツールを用いてグラフ表示してみましょう。\\ | ||