• # ChatGPT

    Posté par . En réponse au message Détourage scan depuis photo téléphone. Évalué à 3.

    Je me réponds à moi même !

    ChatGPT a une solution en python avec opencv, c'est super rapide. Par contre il me met un fond noir autour de la page détecté. Impossible de lui faire recadrer l'image sur la détection ou même remplacer le noir par du blanc.

     import sys
     import cv2
     import numpy as np
     import os
     def detect_document(image_path):
     # Charger l'image
     image = cv2.imread(image_path)
     # Convertir l'image en niveaux de gris
     gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
     # Appliquer un flou gaussien pour réduire le bruit
     blurred = cv2.GaussianBlur(gray, (5, 5), 0)
     # Détecter les contours avec l'algorithme de Canny
     edges = cv2.Canny(blurred, 50, 150)
     # Trouver les contours dans l'image
     contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
     # Trier les contours par aire décroissante
     contours = sorted(contours, key=cv2.contourArea, reverse=True)
     # Parcourir les contours pour trouver celui qui correspond probablement à la feuille
     for contour in contours:
     # Approximer le contour à un polygone
     peri = cv2.arcLength(contour, True)
     approx = cv2.approxPolyDP(contour, 0.02 * peri, True)
     # Si le polygone a quatre côtés, c'est probablement la feuille
     if len(approx) == 4:
     page_contour = approx
     break
     # Dessiner le contour de la feuille sur une nouvelle image
     contour_image = np.zeros_like(image)
     cv2.drawContours(contour_image, [page_contour], -1, (255, 255, 255), thickness=cv2.FILLED)
     # Appliquer le masque à l'image d'origine pour extraire la région d'intérêt
     masked_image = cv2.bitwise_and(image, contour_image)
     # Trouver les coordonnées de la boîte englobante pour la région d'intérêt
     x, y, w, h = cv2.boundingRect(page_contour)
     # Recadrer l'image en fonction de la région d'intérêt
     cropped_image = masked_image[y:y+h, x:x+w]
     # Obtenir le chemin complet de l'image recadrée avec le préfixe "crop_"
     output_dir, filename = os.path.split(image_path)
     filename, file_extension = os.path.splitext(filename)
     output_path = os.path.join(output_dir, 'crop_' + filename + file_extension)
     # Enregistrer l'image recadrée avec le contour détecté
     cv2.imwrite(output_path, cropped_image)
     print("Image recadrée avec succès. Chemin d'enregistrement:", output_path)
     if __name__ == "__main__":
     # Vérifier si un argument a été fourni
     if len(sys.argv) != 2:
     print("Usage: python script.py <image_path>")
     sys.exit(1)
     # Récupérer le chemin de l'image à partir des arguments de la ligne de commande
     image_path = sys.argv[1]
     # Appeler la fonction pour détecter le document
     detect_document(image_path)