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)