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
