diff --git a/Realite Virtuelle/Exos/2023-03-22/contours/contours.pde b/Realite Virtuelle/Exos/2023-03-22/contours/contours.pde
new file mode 100644
index 0000000000000000000000000000000000000000..b8d484c921c5a3f27898e27c2f6a82c43d9ca58f
--- /dev/null
+++ b/Realite Virtuelle/Exos/2023-03-22/contours/contours.pde	
@@ -0,0 +1,238 @@
+// On ouvre la webcam
+// Convertir l'image en Noir et Blanc
+// On va calculer le gradient
+
+import processing.video.*;
+
+Capture webCam;      // Declaration de la Capture par Camera
+String[] cameras;    // Liste textuelle des webCams disponibles
+
+
+float[][] convolutionMatrix; // Matrice du gradient
+
+PImage bnwImage; // Image en noir et blanc
+
+void setup() {
+    
+    size(640, 480);
+    
+    //On liste les webCams disponibles
+    cameras = Capture.list();
+    
+    //On ouvre la premiere webCam
+    webCam = new Capture(this, cameras[0]);
+    webCam.start();
+
+	//On initialise l'image en noir et blanc
+	bnwImage = createImage(width, height, RGB);
+    
+}
+
+void draw() {
+    
+    // On affiche l'image de la webcam
+	if (webCam.available() == true) {
+		webCam.read();
+	}
+
+	// On convertit l'image en noir et blanc et le stock dans bnwImage
+	bnwImage = convertToBNW(webCam);
+
+
+    // On initialise la matrice du gradient avec des valeurs pour un gradient en croix
+    convolutionMatrix = new float[][]{
+		{0, 1, 0},
+		{1, -4, 1},
+		{0, 1, 0}
+	};
+
+	bnwImage = seuillage(bnwImage, 140);
+
+	bnwImage = stretching(bnwImage);
+
+	// On applique le gradient
+	bnwImage = convolution(bnwImage, convolutionMatrix);
+
+	// // On fait un seuillage
+	bnwImage = seuillage(bnwImage, 50);
+
+
+	// On affiche l'image en noir et blanc
+	image(bnwImage, 0, 0);
+
+}
+PImage stretching(PImage img) {
+
+	int min = 255;
+	int max = 0;
+
+	// On parcourt l'image
+	for (int x = 0; x < img.width; x++) {
+		for (int y = 0; y < img.height; y++) {
+			
+			// On recupere la couleur de l'image d'origine
+			int c = img.get(x, y);
+			
+			// On recupere les composantes RVB de la couleur
+			float r = red(c);
+			float g = green(c);
+			float b = blue(c);
+			
+			// On calcule la moyenne des composantes RVB
+			float moyenne = (r + g + b) / 3;
+
+			if (moyenne < min) {
+				min = (int) moyenne;
+			}
+
+			if (moyenne > max) {
+				max = (int) moyenne;
+			}
+		}
+	}
+	
+	// On cree une image de meme taille que l'image d'origine
+	PImage stretchingImage = createImage(img.width, img.height, RGB);
+	
+	// Tout ce qui est en dessous de min devient noir, tout ce qui est au dessus de max devient blanc
+	for (int x = 0; x < img.width; x++) {
+		for (int y = 0; y < img.height; y++) {
+			
+			// On recupere la couleur de l'image d'origine
+			int c = img.get(x, y);
+			
+			// On recupere les composantes RVB de la couleur
+			float r = red(c);
+			float g = green(c);
+			float b = blue(c);
+			
+			// On calcule la moyenne des composantes RVB
+			float moyenne = (r + g + b) / 3;
+			
+			// On cree une couleur avec la moyenne des composantes RVB
+			int c2;
+			if (moyenne < min) {
+				c2 = color(0, 0, 0);
+			} else if (moyenne > max) {
+				c2 = color(255, 255, 255);
+			} else {
+				c2 = color(moyenne, moyenne, moyenne);
+			}
+			
+			// On affecte la couleur a l'image en noir et blanc
+			stretchingImage.set(x, y, c2);
+		}
+	}
+
+	// On retourne l'image en noir et blanc
+	return stretchingImage;
+
+}
+
+PImage seuillage(PImage img, int seuil) {
+	
+	// On cree une image de meme taille que l'image d'origine
+	PImage seuillageImage = createImage(img.width, img.height, RGB);
+	
+	// On parcourt l'image
+	for (int x = 0; x < img.width; x++) {
+		for (int y = 0; y < img.height; y++) {
+			
+			// On recupere la couleur de l'image d'origine
+			int c = img.get(x, y);
+			
+			// On recupere les composantes RVB de la couleur
+			float r = red(c);
+			float g = green(c);
+			float b = blue(c);
+			
+			// On calcule la moyenne des composantes RVB
+			float moyenne = (r + g + b) / 3;
+			
+			// On cree une couleur avec la moyenne des composantes RVB
+			int c2;
+			if (moyenne > seuil) {
+				c2 = color(255, 255, 255);
+			} else {
+				c2 = color(0, 0, 0);
+			}
+			
+			// On affecte la couleur a l'image en noir et blanc
+			seuillageImage.set(x, y, c2);
+		}
+	}
+	
+	// On retourne l'image en noir et blanc
+	return seuillageImage;
+}
+
+
+PImage convolution(PImage img, float[][] filter) {
+	
+	// On cree une image de meme taille que l'image d'origine
+	PImage convolutionImage = createImage(img.width, img.height, RGB);
+	
+	// On calcule la convolution à partir de la matrice
+	for (int x = filter.length / 2; x < img.width - filter.length / 2; x++) {
+		for (int y = filter[0].length / 2; y < img.height - filter[0].length / 2; y++) {
+
+			int norme = 0;
+
+			for (int i = 0; i < filter.length; i++) {
+				for (int j = 0; j < filter[i].length; j++) {
+					int c = img.get(x + i - filter.length / 2, y + j - filter[i].length / 2);
+					float r = red(c);
+					float g = green(c);
+					float b = blue(c);
+					float moyenne = (r + g + b) / 3;
+					norme += moyenne * filter[i][j];
+				}
+			}
+
+			norme = abs(norme);
+
+			// On cree une couleur avec la moyenne des composantes RVB
+			int c2 = color(norme, norme, norme);
+
+			// On affecte la couleur a l'image en noir et blanc
+			convolutionImage.set(x, y, c2);
+
+		}
+	}
+	
+	// On retourne l'image en noir et blanc
+	return convolutionImage;
+}
+
+// Fonction qui convertit une image en noir et blanc
+PImage convertToBNW(PImage img) {
+	
+	// On cree une image de meme taille que l'image d'origine
+	PImage bnwImage = createImage(img.width, img.height, RGB);
+	
+	// On parcourt l'image
+	for (int x = 0; x < img.width; x++) {
+		for (int y = 0; y < img.height; y++) {
+			
+			// On recupere la couleur de l'image d'origine
+			int c = img.get(x, y);
+			
+			// On recupere les composantes RVB de la couleur
+			float r = red(c);
+			float g = green(c);
+			float b = blue(c);
+			
+			// On calcule la moyenne des composantes RVB
+			float moyenne = (r + g + b) / 3;
+			
+			// On cree une couleur avec la moyenne des composantes RVB
+			int c2 = color(moyenne, moyenne, moyenne);
+			
+			// On affecte la couleur a l'image en noir et blanc
+			bnwImage.set(x, y, c2);
+		}
+	}
+	
+	// On retourne l'image en noir et blanc
+	return bnwImage;
+}
\ No newline at end of file
diff --git a/Realite Virtuelle/Exos/2023-03-22/contours/data/harold.jpeg b/Realite Virtuelle/Exos/2023-03-22/contours/data/harold.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..363509b7d4d820307f480908034ead4490c7ae0c
Binary files /dev/null and b/Realite Virtuelle/Exos/2023-03-22/contours/data/harold.jpeg differ