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)
|