wangrong
2025-03-19 291afb9c81aae1d15d9e3edcea618d0a2e1fc5a6
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
import threading
import socket
import re
import time
import datetime
import os
import numpy as np
import pandas as pd
import faiss
import cv2
from flask import Flask
from flask import request
from flask import render_template
 
# live stream for channel 0, change to right url first
live_stream_0 = "http://192.168.77.60/flv?app=live&stream=lpr_0" 
 
lpr_df = pd.DataFrame(columns=["time", "color", "text", "cropped_image", "whole_image"])
lpr_df['time'] = pd.to_datetime(lpr_df['time'])
 
'''
receive license plate recognize result from socket (sent from VideoPipe)
'''
def lpr_receiver():
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    bind_ip = '192.168.77.68'
    bind_port = 9999
    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
            items[2] channel index, frame index
            items[3] cropped image's path
            items[4] whole image's path
            items[5] license plate color
            items[6] license plate text
            items[7] -->
            '''
            assert(len(items) == 8)
            # append items to dataframe
            lpr_df.loc[len(lpr_df)] = [items[1].split('.')[0], items[5], items[6], items[3], items[4]]
            print(f"now total {len(lpr_df)} records in lpr_df!")
        print('############################################')
 
'''
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']
    
    # 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 = "color != ''"
    if select_channel != 'all':
        sql += f" & channel == '{select_channel}'"
    sql += f" & time >= '{select_start_time}'"
    sql += f" & time < '{select_end_time}'"
 
    print(sql)
    filter_df = lpr_df.query(sql)
    print(filter_df)
    plate_results = []
    for index, row in filter_df.iterrows():
        plate_results.append({'uid':index, \
                        'time':row['time'], \
                        'color':row['color'], \
                        'text':row['text'], \
                        'cropped_image': row['cropped_image'], \
                        'whole_image': row['whole_image']})
    return render_template("home.html", \
                            plate_results=plate_results, \
                            total_records=len(filter_df), \
                            select_start_time = select_start_time, \
                            select_end_time = select_end_time, \
                            live_stream_0=live_stream_0)
 
if __name__ == "__main__":
    # start plate receiving thread
    receiver = threading.Thread(target = lpr_receiver)
    receiver.start()
 
    # run server
    app.run(host="192.168.77.68", port=9696)