Files
detecttracking/realtime/full_realtime.py
2024-12-31 16:45:04 +08:00

137 lines
4.2 KiB
Python

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 25 09:17:32 2024
@author: ym
"""
import os
import sys
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
from contrast.utils.event import ShoppingEvent
sys.path.append(r"D:\DetectTracking")
from tracking.utils.read_data import read_weight_sensor, extract_data_realtime, read_tracking_output_realtime
from tracking.utils.read_data import read_process
def time_std2stamp(custom_time):
date_part = custom_time.split('-')[0]
time_part = custom_time.split('-')[1]
ms_part = int(custom_time.split('-')[2])
standard_time = f"{date_part} {time_part[:2]}:{time_part[2:4]}:{time_part[4:]}"
dt = datetime.strptime(standard_time, "%Y%m%d %H:%M:%S")
timestamp = int(dt.timestamp() * 1000) + ms_part
return timestamp
def time_stamp2std(timestamp):
if isinstance(timestamp, float) or isinstance(timestamp, str):
timestamp = int(timestamp)
ms = timestamp%1000
times = timestamp//1000
std_time = datetime.fromtimestamp(times)
stdtime = std_time.strftime("%Y%m%d-%H%M%S") + '-' +str(ms)
return stdtime
def get_timeduring_weight(procpath):
eventStart, eventEnd, weightValue = None, None, None
if os.path.isfile(procpath):
timeDict = read_process(procpath)
if "eventStart" in timeDict.keys():
eventStart = timeDict["eventStart"]
if "eventEnd" in timeDict.keys():
eventEnd = timeDict["eventEnd"]
if "weightValue" in timeDict.keys():
weightValue = timeDict["weightValue"]
return eventStart, eventEnd, weightValue
def event_devide(wpath):
'''
基于重力时序数据 _weight.data 进行事件切分
'''
# wpath = r'D:\全实时\source_data\2024122416\20241224-162658370_weight.data'
tpath, _ = os.path.split(wpath)
wsdata = read_weight_sensor(wpath)
times, weights = wsdata[:, 0], wsdata[:, 1]
Start, End = times[0], times[-1]
evtpaths, evtTimeWeight = [], []
for filename in os.listdir(tpath):
filelist = filename.split('_')
custom_time = filelist[0]
evtpath = os.path.join(tpath, filename)
if os.path.isdir(evtpath):
stamp = time_std2stamp(custom_time)
if stamp >= Start and stamp <= End:
evtpaths.append(evtpath)
for evtpath in evtpaths:
evtname = os.path.basename(evtpath)
event = ShoppingEvent(evtpath, stype = "realtime")
# try:
# event = ShoppingEvent(evtpath, stype = "realtime")
# except Exception as e:
# print(f"Error is: {e}", evtname)
'''读取事件的起止时间、重力变化值'''
propath = os.path.join(evtpath, "process.data")
evtStart, evtEnd, wgtValue = get_timeduring_weight(propath)
evtTimeWeight.append((evtStart, evtEnd, wgtValue))
'''重力变化曲线、事件起止区间'''
fig, ax1 = plt.subplots(figsize=(16, 9), dpi=100)
ax1.plot(times-Start, weights, 'bo-', linewidth=1, markersize=3)
ax1.set_title('Weight (gram)')
for t0, t1, w in evtTimeWeight:
min_diff = float('inf')
index = None
for i, t in enumerate(times):
diff = abs(t0 - t)
if diff < min_diff:
min_diff = diff
index = i
w0 = weights[index]
w1 = w0 + w
ax1.plot((t0, t0) - Start, (w0, w1), 'r*-', linewidth=1, markersize=6)
ax1.plot((t1, t1) - Start, (w0, w1), 'r*-', linewidth=1, markersize=6)
ax1.plot((t0, t1) - Start, (w1, w1), 'r*-', linewidth=1, markersize=6)
ax1.grid(True)
plt.show()
return plt
def main():
tpath = r"D:\全实时\source_data\2024122416"
rltpath = r"D:\全实时\result"
for filename in os.listdir(tpath):
bname = filename.split("_")[0]
if filename.find("_weight.data") <= 0:
continue
wpath = os.path.join(tpath, filename)
plt = event_devide(wpath)
plt.savefig(os.path.join(rltpath, f'{bname}.png' )) # svg, png, pdf
print(filename)
print("Done!")
if __name__ == "__main__":
main()