import streamlit as st import cv2 from PIL import Image as PilImage from PIL import ImageDraw import numpy as np import io import base64 # Load the face detection classifier face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') def detect_and_write_on_faces(image, texts_to_write): # Convert the uploaded image to grayscale for face detection gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Detect faces in the image faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) # Convert the OpenCV image to a Pillow image pil_image = PilImage.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(pil_image) for i, (x, y, w, h) in enumerate(faces): # Write text on the detected face if i < len(texts_to_write): text_to_write = texts_to_write[i] draw.text((x, y - 10), text_to_write, fill=(255, 0, 0, 0)) # Convert the Pillow image back to OpenCV format image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) return image_with_text st.title("Face Detection and Text Writing") uploaded_image = st.file_uploader("Upload an image", type=["jpg", "png", "jpeg"]) if uploaded_image is not None: if st.button("Process Image"): input_image = cv2.imdecode(np.frombuffer(uploaded_image.read(), np.uint8), -1) # Define different texts for each face texts_to_write = [ "Happy face, this person has a retention rate of 69.", "Smiling face, spreading positivity!", "Serious face, focused and determined.", "Surprised face, something caught their attention!", "Confused face, deep in thought.", "Excited face, full of energy!", "Calm face, a picture of tranquility." ] result_image = detect_and_write_on_faces(input_image, texts_to_write) st.image(result_image, caption="Processed Image", use_column_width=True) # Allow the user to download the processed image as a JPEG file output_buffer = io.BytesIO() PilImage.fromarray(result_image).save(output_buffer, format="JPEG") st.markdown("### Download Processed Image") st.markdown( f"Download your processed image [here](data:file/jpeg;base64,{base64.b64encode(output_buffer.getvalue()).decode()})" )