wangrong
2025-01-23 02819b5c047bb354b0ef2374e7c6a6ac4bbd5bba
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import threading
import socket
import re
import time
import datetime
import numpy as np
import pandas as pd
from flask import Flask
from flask import request
from flask import render_template
 
ba_df = pd.DataFrame(columns=["time", "channel", "ba_label", "involve_targets", "properties_of_involve_targets", "involve_region", "ba_image", "ba_video"])
ba_df['time'] = pd.to_datetime(ba_df['time'])
 
# live stream for channel 0, change to right url first
live_stream_0 = "http://192.168.77.60/flv?app=live&stream=vehicle_ba_sample_0" 
# live stream for channel 1, change to right url first
live_stream_1 = "http://192.168.77.60/flv?app=live&stream=vehicle_ba_sample_1" 
 
'''
receive ba data from socket and save to dataframe of pandas.
'''
def ba_receiver():
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    bind_ip = '192.168.77.68'
    bind_port = 7777
    udp_socket.bind((bind_ip, bind_port))
 
    while True:
        data, addr = udp_socket.recvfrom(1024 * 64)
        s = data.decode()
        print('############################################')
        print(f'Received data: \n{s}')
        print(f'From address: {addr}')
 
        li = re.findall("\<\-\-.*?\-\-\>", s, re.DOTALL)
        print(f"total {len(li)} records parsed! going to append to data frame...")
        for l in li:
            items = str(l).split('\n')
            ''' 
            items[0] <--
            items[1] time (y:m:d h:m:s.mili)
            items[2] channel index, frame index
            items[3] ba type, ba label
            items[4] ids of targets
            items[5] vertexs of region
            items[6] properties of targets
            items[7] record image path
            items[8] record video path
            items[9] -->
            '''
            assert(len(items) == 10)
            # append items to dataframe
            ba_df.loc[len(ba_df)] = [items[1].split('.')[0], items[2].split(',')[0], items[3].split(',')[1], items[4], items[6], items[5], items[7], items[8]]
            print(f"now total {len(ba_df)} records in ba_df!")
        print('############################################')
 
    udp_socket.close()
 
 
'''
create flask app
'''
app = Flask(__name__)
 
# home page
@app.route("/", methods=["GET", "POST"])
def home():
    '''
    filter properties
    '''
    select_channel = "all" 
    if 'select_channel' in request.form:
        select_channel = request.form['select_channel']
 
    select_ba_type = "all"
    if 'select_ba_type' in request.form:    
        select_ba_type = request.form['select_ba_type']
    
    # 1 hour by default
    now = time.time()
    past_1_hour = now - 3600
    select_start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(past_1_hour))
    select_end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now))
    
    if 'select_start_time' in request.form and request.form['select_start_time'] != '': 
        select_start_time = datetime.datetime.strptime(request.form['select_start_time'], '%Y-%m-%dT%H:%M:%S')
    
    if 'select_end_time' in request.form and request.form['select_end_time'] != '': 
        select_end_time = datetime.datetime.strptime(request.form['select_end_time'], '%Y-%m-%dT%H:%M:%S')
 
    sql = "ba_label != ''"
    if select_channel != 'all':
        sql += f" & channel == '{select_channel}'"
    if select_ba_type != 'all':
        sql += f" & ba_label == '{select_ba_type}'"
    sql += f" & time >= '{select_start_time}'"
    sql += f" & time < '{select_end_time}'"
 
    print(sql)
    filter_df = ba_df.query(sql)
    print(filter_df)
    ba_results = []
    for index, row in filter_df.iterrows():
        ba_results.append({'uid':index, \
                        'time':row['time'], \
                        'channel':row['channel'], \
                        'ba_label':row['ba_label'], \
                        'involve_targets':row['involve_targets'], \
                        'properties_of_involve_targets': row['properties_of_involve_targets'], \
                        'involve_region': row['involve_region'], \
                        'ba_image': './static/record_images/' + row['ba_image'] + '.jpg' if row['ba_image'] != '' else '', \
                        'ba_video': './static/record_videos/' + row['ba_video'] + '.mp4' if row['ba_video'] != '' else ''})
    return render_template("home.html", \
                            ba_results=ba_results, \
                            total_records=len(filter_df), \
                            select_channel = select_channel, \
                            select_ba_type = select_ba_type, \
                            select_start_time = select_start_time, \
                            select_end_time = select_end_time, \
                            live_stream_0=live_stream_0, \
                            live_stream_1=live_stream_1)
 
if __name__ == "__main__":
    # start receiving thread
    receiver = threading.Thread(target = ba_receiver)
    receiver.start()
    # run server
    app.run(host="192.168.77.68", port=7878)