from flask import Flask, render_template, jsonify, request from flask_socketio import SocketIO, emit from fire import firestore_client as fc import dlib import base64 import cv2 import numpy as np import time app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socket = SocketIO(app, async_mode="eventlet") img = None hog_face_detector = dlib.get_frontal_face_detector() def base64_to_img(base64_image): # Remove the "data:image/jpeg;base64," prefix from the string image_data = base64_image.split(',')[1] # Decode the base64-encoded image data decoded_data = base64.b64decode(image_data) # Convert the binary data to a NumPy array np_array = np.frombuffer(decoded_data, np.uint8) # Decode the NumPy array to an OpenCV image image = cv2.imdecode(np_array, cv2.IMREAD_COLOR) return image def prep_image(image,name,fc): image = base64_to_img(image) count = 0 while count < 10: time.sleep(2) face_hog = hog_face_detector(image,1) for face in face_hog: x = face.left() y = face.top() w = face.right() - x h = face.bottom() - y crop = image[y:y+h,x:x+w] crop = cv2.resize(crop, (224, 224)) retval, buffer = cv2.imencode('.jpg', crop) res = base64.b64encode(buffer) doc= name+"_"+str(count) print(res) doc_ref = fc.collection("faces").document(str(doc)) doc_ref.set({ "img":res }) count += 1 return(count) @socket.on("connect") def test_connect(): print("Connected") emit("my response", {"data": "Connected"}) @socket.on("image") def receive_image(image): global img img = image['image'] # Emit the received image as base64 string to the '/camera' route socket.emit('forward_image', {'image': img}, namespace='/camera') @app.route("/") def home(): return render_template("index.html") @app.route("/camera", methods=['POST',"GET"]) def camera(): if request.method == 'GET': # image_data = request.form['image'] # Process the received image data as needed # Return the processed image data return jsonify({'image': img}) else: return "Method Not Allowed", 405 @app.route("/login") def login(): doc_ref = fc.collection("current_users").document('user') doc = doc_ref.get() if doc.exists: doc = doc.to_dict() else: print("No such document!") res = doc['name'] return render_template('login.html',name = res) @app.route("/sign", methods=('GET', 'POST')) def sign(): doc_ref = fc.collection("faces").document('users') doc = doc_ref.get() if doc.exists: doc = doc.to_dict() else: print("No such document!") res = doc['name'] result = "error" if request.method == "POST": name = request.form.get("name") res.append(name) result = prep_image(img,name,fc) return render_template('sign.html',data = result) if __name__ == '__main__': socket.run(app, debug=True,port=7860,host="0.0.0.0")