OpenCV – nuances de gris/N&B/Contours

nous allons voir ici comment transformer , en temps réel, le flux vidéo en nuance de gris et en noir et blanc.

puis a partir de ces étapes préliminaires faire la détection de contour.

premier petit bout de programme Python, on récupère le flux vidéo d’une webcam USB et on l’affiche :

import cv2 
capture = cv2.VideoCapture(0) 
while (True):
    ret, frame = capture.read() 
    cv2.imshow('video original', frame)
    if cv2.waitKey(1) == 27:
        break 
capture.release()
cv2.destroyAllWindows()

la boucle “if + break ” permet d’arrêter l’affichage de la vidéo en appuyant sur la touche “Echap” du clavier ( code ascii 27). voici le résultat de ce bout de programme:

évolution du programme de base , on transforme le flux video RGB en nuance de gris et on affiche les 2 vidéos ensembles pour comparer le résultat:

import cv2  
capture = cv2.VideoCapture(0)

while True:  
    # extraction des images
    (ret, frame) = capture.read()     
    # conversion en nuance de gris
    grayFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # affichage des 2 videos
    cv2.imshow('video original', frame)
    cv2.imshow('video grey', grayFrame)
    # fin du programme par appui de la touche Echap
    if cv2.waitKey(1) == 27:
        break
 
capture.release()
cv2.destroyAllWindows()

voila ce que ça donne:

variante suivante du deuxième programme , on récupère le flux vidéo de la webcam USB , on le transforme en nuance de gris et en noir et blanc binaire et on affiche les 3 vidéos ensembles pour comparer le résultat:

import cv2 
capture = cv2.VideoCapture(0)
 
while (True): 
    (ret, frame) = capture.read() 
    grayFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # conversion en noir et blanc
    (thresh, blackAndWhiteFrame) = cv2.threshold(grayFrame, 127, 255, cv2.THRESH_BINARY)    
    cv2.imshow('video original', frame)
    cv2.imshow('video grey', grayFrame)
    cv2.imshow('video bw', blackAndWhiteFrame)
    if cv2.waitKey(1) == 27:
        break
 
capture.release()
cv2.destroyAllWindows()

copie d’écran du résultat avec les 3 flux vidéo affichés ensembles :

ensuite premier traitement du flux video , la recherche et le dessin du contour des objets tracé en rouge :

import cv2 
capture = cv2.VideoCapture(0)
 
while (True): 
    (ret, frame) = capture.read() 
    grayFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # conversion en noir et blanc
    (thresh, blackAndWhiteFrame) = cv2.threshold(grayFrame, 127, 255, cv2.THRESH_BINARY)
    # recherche du controur
    contours = cv2.findContours(blackAndWhiteFrame, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) [-2]
    # dessin du contour en rouge
    for c in contours:
        cv2.drawContours(frame, [c], -1, (0,0,255), 2)        
    cv2.imshow('contour', frame)   
    if cv2.waitKey(1) == 27:
        break
 
capture.release()
cv2.destroyAllWindows()

copie d’ecran du resultat:

petite variante du traitement précédent , juste en remplaçant le 2 en fin de la ligne de commande “drawContour” par -2 on remplis le contour au lieu de dessiner le contour.

cv2.drawContours(frame, [c], -1, (0,0,255), 2) 
remplacé par:
cv2.drawContours(frame, [c], -1, (0,0,255), -2)

voici le programme modifié:

import cv2 
capture = cv2.VideoCapture(0)
 
while (True): 
    (ret, frame) = capture.read() 
    grayFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # conversion en noir et blanc
    (thresh, blackAndWhiteFrame) = cv2.threshold(grayFrame, 127, 255, cv2.THRESH_BINARY)
    contours = cv2.findContours(blackAndWhiteFrame, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) [-2]
    for c in contours:
        cv2.drawContours(frame, [c], -1, (0,0,255), -2)        
    cv2.imshow('contour', frame)   
    if cv2.waitKey(1) == 27:
        break
 
capture.release()
cv2.destroyAllWindows()

et voici le resultat sur le flux video en temps réel