summaryrefslogtreecommitdiff
path: root/face-detection/03_face_recogition.py
diff options
context:
space:
mode:
Diffstat (limited to 'face-detection/03_face_recogition.py')
-rw-r--r--face-detection/03_face_recogition.py88
1 files changed, 48 insertions, 40 deletions
diff --git a/face-detection/03_face_recogition.py b/face-detection/03_face_recogition.py
index 185d3c2..51741a5 100644
--- a/face-detection/03_face_recogition.py
+++ b/face-detection/03_face_recogition.py
@@ -2,6 +2,9 @@ import cv2
import os
import numpy as np
from picamera2 import Picamera2
+from flask import Flask, render_template, Response
+
+app = Flask(__name__)
#Parameters
id = 0
@@ -28,53 +31,58 @@ cam.preview_configuration.align()
cam.configure("preview")
cam.start()
-while True:
- # Capture a frame from the camera
- frame=cam.capture_array()
+def generate_frames():
+ while True:
+ # Capture a frame from the camera
+ frame=cam.capture_array()
- #Convert fram from BGR to grayscale
- frameGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
- #Create a DS faces- array with 4 elements- x,y coordinates top-left corner), width and height
- faces = face_detector.detectMultiScale(
- frameGray, # The grayscale frame to detect
- scaleFactor=1.1,# how much the image size is reduced at each image scale-10% reduction
- minNeighbors=5, # how many neighbors each candidate rectangle should have to retain it
- minSize=(150, 150)# Minimum possible object size. Objects smaller than this size are ignored.
- )
- for(x,y,w,h) in faces:
- namepos=(x+5,y-5) #shift right and up/outside the bounding box from top
- confpos=(x+5,y+h-5) #shift right and up/intside the bounding box from bottom
- #create a bounding box across the detected face
- cv2.rectangle(frame, (x,y), (x+w,y+h), boxColor, 3) #5 parameters - frame, topleftcoords,bottomrightcooords,boxcolor,thickness
+ #Convert fram from BGR to grayscale
+ frameGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
+ #Create a DS faces- array with 4 elements- x,y coordinates top-left corner), width and height
+ faces = face_detector.detectMultiScale(
+ frameGray, # The grayscale frame to detect
+ scaleFactor=1.1,# how much the image size is reduced at each image scale-10% reduction
+ minNeighbors=5, # how many neighbors each candidate rectangle should have to retain it
+ minSize=(150, 150)# Minimum possible object size. Objects smaller than this size are ignored.
+ )
+ for(x,y,w,h) in faces:
+ namepos=(x+5,y-5) #shift right and up/outside the bounding box from top
+ confpos=(x+5,y+h-5) #shift right and up/intside the bounding box from bottom
+ #create a bounding box across the detected face
+ cv2.rectangle(frame, (x,y), (x+w,y+h), boxColor, 3) #5 parameters - frame, topleftcoords,bottomrightcooords,boxcolor,thickness
- #recognizer.predict() method takes the ROI as input and
- #returns the predicted label (id) and confidence score for the given face region.
- id, confidence = recognizer.predict(frameGray[y:y+h,x:x+w])
+ #recognizer.predict() method takes the ROI as input and
+ #returns the predicted label (id) and confidence score for the given face region.
+ id, confidence = recognizer.predict(frameGray[y:y+h,x:x+w])
- # If confidence is less than 100, it is considered a perfect match
- if confidence < 100:
- id = names[id]
- confidence = f"{100 - confidence:.0f}%"
- else:
- id = "unknown"
- confidence = f"{100 - confidence:.0f}%"
+ # If confidence is less than 100, it is considered a perfect match
+ if confidence < 100:
+ id = names[id]
+ confidence = f"{100 - confidence:.0f}%"
+ else:
+ id = "unknown"
+ confidence = f"{100 - confidence:.0f}%"
#Display name and confidence of person who's face is recognized
cv2.putText(frame, str(id), namepos, font, height, nameColor, 2)
cv2.putText(frame, str(confidence), confpos, font, height, confColor, 1)
- # Display realtime capture output to the user
- cv2.imshow('Raspi Face Recognizer',frame)
+ # Display output Flask web application:
+ # Convert the frame to JPEG format
+ ret, buffer = cv2.imencode('.jpg', frame)
+ frame = buffer.tobytes()
+
+ # Yield the frame in the HTTP response
+ yield (b'--frame\r\n'
+ b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
+
+@app.route('/')
+def index():
+ return render_template('index.html')
- # Wait for 30 milliseconds for a key event (extract sigfigs) and exit if 'ESC' or 'q' is pressed
- key = cv2.waitKey(100) & 0xff
- #Checking keycode
- if key == 27: # ESCAPE key
- break
- elif key == 113: # q key
- break
+@app.route('/video_feed')
+def video_feed():
+ return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')
-# Release the camera and close all windows
-print("\n [INFO] Exiting Program and cleaning up stuff")
-cam.stop()
-cv2.destroyAllWindows()
+if __name__ == '__main__':
+ app.run(debug=True)