Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import cv2 | |
| import numpy as np | |
| from PIL import Image | |
| from io import BytesIO | |
| import barcode | |
| from barcode.writer import ImageWriter | |
| import qrcode | |
| def image_to_bytes(img): | |
| pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) | |
| buffer = BytesIO() | |
| pil_image.save(buffer, format="PNG") | |
| return buffer.getvalue() | |
| def generate_barcode(link): | |
| code128 = barcode.get_barcode_class('code128') | |
| barcode_image = code128(link, writer=ImageWriter()) | |
| buffer = BytesIO() | |
| barcode_image.write(buffer) | |
| return Image.open(buffer) | |
| def generate_qrcode(link): | |
| qr = qrcode.QRCode( | |
| version=2, | |
| error_correction=qrcode.constants.ERROR_CORRECT_L, | |
| box_size=4, | |
| border=2, | |
| ) | |
| qr.add_data(link) | |
| qr.make(fit=True) | |
| qr_image = qr.make_image(fill_color="black", back_color="white") | |
| small_qr_image = qr_image.resize((100, 100), Image.Resampling.LANCZOS) | |
| buffer = BytesIO() | |
| small_qr_image.save(buffer, format="PNG") | |
| return Image.open(buffer) | |
| def main(): | |
| st.set_page_config(page_title="Application de Vision par Ordinateur", layout="wide") | |
| st.title("Application de Vision par Ordinateur") | |
| st.sidebar.header("Chargement de l'image") | |
| if "default_image" not in st.session_state: | |
| st.session_state["default_image"] = None | |
| uploaded_file = st.sidebar.file_uploader("Charge une image", type=["png", "jpg", "jpeg"]) | |
| if uploaded_file is not None: | |
| image = Image.open(uploaded_file) | |
| st.session_state["default_image"] = np.array(image) | |
| st.sidebar.image(image, caption="Image par défaut", use_container_width=True) | |
| if st.session_state["default_image"] is None: | |
| st.sidebar.warning("Veuillez charger une image pour commencer.") | |
| return | |
| st.sidebar.header("Fonctionnalités") | |
| menu_option = st.sidebar.selectbox("Choisissez une fonctionnalité", [ | |
| "Accueil", | |
| "Transformations d'image", | |
| "Cropping", | |
| "Rotation", | |
| "Floutage", | |
| "Contours", | |
| "Génération de Code-barres et QR Code", | |
| "Détection Faciale" | |
| ]) | |
| image_np = st.session_state["default_image"] | |
| if menu_option == "Accueil": | |
| st.header("Bienvenue sur l'application de Vision par Ordinateur") | |
| st.write( | |
| "Cette application utilise OpenCV pour effectuer diverses transformations " | |
| "et manipulations d'images. Charge une image depuis la barre latérale et explore les fonctionnalités." | |
| ) | |
| elif menu_option == "Transformations d'image": | |
| st.subheader("Transformations d'image") | |
| col1, col2, col3, col4 = st.columns(4) | |
| with col1: | |
| if st.button("Transformer en gris"): | |
| gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY) | |
| st.image(gray, caption="Image en Niveaux de Gris", use_container_width=True) | |
| with col2: | |
| if st.button("Couleur rouge"): | |
| red = image_np.copy() | |
| red[:, :, 1:] = 0 | |
| st.image(red, caption="Image Rouge", use_container_width=True) | |
| with col3: | |
| if st.button("Couleur verte"): | |
| green = image_np.copy() | |
| green[:, :, [0, 2]] = 0 | |
| st.image(green, caption="Image Verte", use_container_width=True) | |
| with col4: | |
| if st.button("Couleur jaune"): | |
| yellow = image_np.copy() | |
| yellow[:, :, 0] = 0 | |
| st.image(yellow, caption="Image Jaune", use_container_width=True) | |
| elif menu_option == "Cropping": | |
| st.subheader("Cropping") | |
| x1 = st.number_input("x1", 0, image_np.shape[1] - 1, step=1) | |
| y1 = st.number_input("y1", 0, image_np.shape[0] - 1, step=1) | |
| x2 = st.number_input("x2", 1, image_np.shape[1], step=1) | |
| y2 = st.number_input("y2", 1, image_np.shape[0], step=1) | |
| if st.button("Cropper"): | |
| cropped = image_np[int(y1):int(y2), int(x1):int(x2)] | |
| st.image(cropped, caption="Image Croppée", use_container_width=True) | |
| elif menu_option == "Rotation": | |
| st.subheader("Rotation") | |
| angle = st.selectbox("Angle de rotation", [45, 90, 180]) | |
| if st.button("Tourner"): | |
| rows, cols, _ = image_np.shape | |
| rotation_matrix = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, 1) | |
| rotated = cv2.warpAffine(image_np, rotation_matrix, (cols, rows)) | |
| st.image(rotated, caption=f"Image Rotée de {angle} degrés", use_container_width=True) | |
| elif menu_option == "Floutage": | |
| st.subheader("Floutage") | |
| blur_level = st.slider("Niveau de flou (k)", min_value=1, max_value=51, step=2, value=15) | |
| if st.button("Appliquer le flou"): | |
| blurred = cv2.GaussianBlur(image_np, (blur_level, blur_level), 0) | |
| st.image(blurred, caption=f"Image Floutée (k={blur_level})", use_container_width=True) | |
| elif menu_option == "Contours": | |
| st.subheader("Contours") | |
| if st.button("Capturer les contours"): | |
| gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY) | |
| edges = cv2.Canny(gray, 100, 200) | |
| st.image(edges, caption="Contours de l'Image", use_container_width=True) | |
| elif menu_option == "Génération de Code-barres et QR Code": | |
| st.subheader("Génération de Code-barres et QR Code") | |
| link = st.text_input("Entre un lien ou un texte pour générer le code-barres et le QR code") | |
| if st.button("Générer"): | |
| if link: | |
| barcode_image = generate_barcode(link) | |
| st.image(barcode_image, caption="Code-barres généré", use_container_width=True) | |
| qrcode_image = generate_qrcode(link) | |
| st.image(qrcode_image, caption="QR Code généré", use_container_width=True) | |
| else: | |
| st.error("Veuillez entrer un lien valide pour générer les codes.") | |
| elif menu_option == "Détection Faciale": | |
| st.subheader("Détection Faciale") | |
| # Charger le modèle Haarcascade pour la détection des visages | |
| face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml") | |
| # Bouton pour démarrer la détection des visages | |
| if st.button("Lancer la détection des visages"): | |
| # Initialiser la webcam | |
| cap = cv2.VideoCapture(0) # 0 pour la webcam par défaut | |
| if not cap.isOpened(): | |
| st.error("Impossible d'accéder à la webcam.") | |
| else: | |
| st.info("Appuyez sur Ctrl+C pour arrêter la détection.") | |
| # Flux vidéo en temps réel | |
| frame_placeholder = st.empty() | |
| while True: | |
| ret, frame = cap.read() | |
| if not ret: | |
| st.error("Erreur lors de la capture vidéo.") | |
| break | |
| # Convertir en niveaux de gris | |
| gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) | |
| # Détecter les visages | |
| faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) | |
| # Dessiner des rectangles autour des visages détectés | |
| for (x, y, w, h) in faces: | |
| cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) | |
| # Convertir l'image pour Streamlit | |
| frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |
| # Afficher l'image dans l'interface Streamlit | |
| frame_placeholder.image(frame, channels="RGB", use_container_width=True) | |
| # Libérer la webcam une fois le flux terminé | |
| cap.release() | |
| if __name__ == "__main__": | |
| main() | |