Depuis que j’ai vu le film Iron Man, je rêve d’avoir un Jarvis à ma botte, mais surtout le super casque de son armure !

Je commence une série d’articles sur OpenCV et sur les fonctions de machine learning associée à l’analyse d’image pour creuser ce sujet qui m’intrigue. Voyons jusqu’où je pourrai aller avec mes maigres compétences en Python 🙂

D’ailleurs, je n’invente rien. Je n’ai fait que reprendre les infos et de bouts de code trouvés ça et là sur internet.

OpenCV Kesako ?

OpenCV signifie Open Source Computer Vision. Il s’agit d’une librairie contenant tout le nécessaire (des centaines d’algorithmes) pour réaliser du traitement d’images.

Pourquoi choisir OpenCV ?

Et bien, pour plusieurs raisons:

  • C’est LE framework le plus connu et le plus documenté
  • Il est utilisable dans plusieurs langages : C, Java, Python
  • Il est gratuit
  • Il contient plein d’algorithmes prêt à l’emploi (parfait pour un Noob comme moi)
  • On peut commencer très facilement commencer avec des scripts Python (même si j’aurais préféré du PowerShell 😉 )

Installation sous Windows (oui je sais, mais je préfère Windows)

La première étape, installer Python 3.
Ouvrir un prompt DOS en administrateur et lancer la commande :

Ensuite, on peut fermer la fenêtre DOS puis en ouvrir un nouvelle. C’est bête, mais il faut recharger le contexte pour avoir accès à l’installation de Python. Là on peut entrer dans le vif du sujet :

Et voilà. On a le strict minimum pour commencer 🙂

Analyser une image

Commençons par valider que tout est OK. Prenez votre éditeur de script préféré … Visual Studio Code
Vous pouvez l’installer à l’ancienne via le MSI pour via Winget

Ensuite, vous pouvez créer un répertoire dans lequel vous allez mettre une image JPEG portant le nom “test.jpg”. Puis créer un script dans le même répertoire comme suit :

import cv2 as cv
# load image from disk
img = cv.imread("test.jpg")
# Show image in windws with title
cv.imshow("Display window", img)
# Wait for a keystroke in the window
k = cv.waitKey(0)

Note: Attention au chemin du fichier ! Je n’ai pas précisé de chemin dans le script, il faudra donc se placer dans le répertoire pour lancer le script 😉

Et voilà ! Normalement, vos image s’affiche dans une fenêtre avec le titre fournit. Il suffit de presser une touche à l’intérieur de la fenêtre pour terminer le script.

J’entends crier “A l’arnaque” dans le fond …
Bon d’accord, j’ai sorti un bazooka pour tuer une mouche, mais c’est maintenant que les choses fun vont commencer !

On commencer par remplacer l’image par une photo de groupe avec des visage (photothèque perso ou Google image). Puis on va modifier le script comme suit :

import cv2
import matplotlib.pyplot as plt

imagePath = './test4.jpg'
img = cv2.imread(imagePath)

# On convertit l'image en nuances de gris pour accélerer les traitements
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# On charge un algo tout fait pour détecter les visages
face_classifier = cv2.CascadeClassifier(
    cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
)
# On ajuste les critères de détection
face = face_classifier.detectMultiScale(
    gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(5, 5)
)

# On dessine un rectangle vert tout moche autour des visages repérés (sur l'image originale)
for (x, y, w, h) in face:
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 4)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# On affiche le résultat
cv2.imshow("Display window", img)
k = cv2.waitKey(0) # Wait for a keystroke in the window

Et là on commence a avoir les yeux qui brillent !

C’est déjà pas mal, mais est-ce qu’on ne pourrait pas faire encore mieux ?

Analyser une vidéo

Là, on va passer dans la cours des grands … et pourtant c’est loin d’être compliqué.
Finalement, on va juste changer deux choses dans le script :

  • On va capturer le flux de la webcam au lieu d’un fichier image
  • On va faire une boucle pour appliquer notre traitement image par image, puis les afficher (vidéo de sortie)
import cv2

# On charge l'algo de détection des visages
face_classifier = cv2.CascadeClassifier(
    cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
)

# on prend la première webcam connectée au PC
video_capture = cv2.VideoCapture(0)

# on créé une fonction pour sortir le code de détection de visage et de création du rectangle (pour une image)
def detect_bounding_box(vid):
    gray_image = cv2.cvtColor(vid, cv2.COLOR_BGR2GRAY)
    faces = face_classifier.detectMultiScale(gray_image, 1.1, 5, minSize=(40, 40))
    for (x, y, w, h) in faces:
        cv2.rectangle(vid, (x, y), (x + w, y + h), (0, 255, 0), 4)
    return faces

# Notre boucle principale
while True:
    # On récupère le flux vidéo
    result, video_frame = video_capture.read()  # read frames from the video
    if result is False:
        break  # terminate the loop if the frame is not read successfully

    # On appelle notre fonction de traitement
    faces = detect_bounding_box(
        video_frame
    )  

    # on affiche le résultat (une image)
    cv2.imshow(
        "My Face Detection Project", video_frame
    ) 

    # On arrête le script en appuyant sur "q"
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

# on nettoye les ressources
video_capture.release()
cv2.destroyAllWindows()

On touche au but !

Synthèse

Un final, je retient qu’on peut s’amuser très rapidement et très facilement avec OpenCV.
Le Python est un grand plus pour la simplicité et l’agilité, même si on n’y connaît quasi-rien …
Mais nous n’avons fait qu’effleurer le sujet.

Références

By Kevin

Leave a Reply

Your email address will not be published. Required fields are marked *