ComputerVision / app.py
DavidNgoue's picture
Update app.py
43dda14 verified
raw
history blame
7.87 kB
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()