Programmation en C: Projet

La caméra numérique est devenu un capteur primordial dans l'industrie. Grâce au grand volume de production, c'est un capteur bon marché — malgré sa complexité.

Par contre, une caméra acquérit beaucoup trop d'information, et nécessite un algorithme de traitement d'images pour extraire l'information desirée.

Dans le cadre de ce projet, on va développer un tel algorithme, et mettre un place un système automatique de traitement d'images.

Description du projet

Vous disposez d'une série d'images similaires, prises sous approximativement les mêmes conditions, et vous mettez en place un système de traitement d'images qui extrait une information de ces images, ou les classifie selon un critère. Votre système doit tourner de manière autonome: quand on lui fournit une image, il doit extraire l'information sans intervention humaine.

Vous pouvez utiliser une des séries d'images suivantes, ou travailler avec vos propres images:

Col du Simplon
Neige sur la Furka
Monnaie

Une partie importante du projet doit être écrite en C, mais votre système peut comporter plus qu'un programme C. Pour lancer des tâches régulières, acquérir des images, ou publier des résultats, nous avons un serveur à disposition.

Forme

Vous pouvez faire le projet à deux, ou seul.

Les 8 semaines prochaines, les heures d'exercices sont dédiées au projet. Au début de la semaine 14, vous rendez:

Ensuite, chaque groupe défend son projet auprès d'un petit jury sous forme d'une discussion de 15 minutes.

Code de départ

Vous pouvez commencer votre projet avec un des dossiers suivants:

Ces dossiers contiennent:

Lire et écrire des images

image.h définit les structures et fonctions suivantes:

			struct Pixel {
				unsigned char r;
				unsigned char g;
				unsigned char b;
				unsigned char a;
			};

			struct Image {
				int width;
				int height;
				struct Pixel * pixels;
			};

			void image_create(struct Image * image, int width, int height);
			const char * image_read(struct Image * image, const char * pngFileName);
			const char * image_write_to_png(struct Image * image, const char * pngFileName);
			const char * image_write_to_jpeg(struct Image * image, const char * jpegFileName, int quality);
			void image_free(struct Image * image);
		

Ces fonctions peuvent être utilisées comme suit:

			// Créer une image vide de 1000x600 pixels
			struct Image image;
			image_create(&image, 1000, 600);

			// Lire une image *.png ou *.jpg
			struct Image image;
			const char * erreur = image_read(&image, "chameaux.jpg");
			if (erreur != NULL) {
				printf("Impossible de lire %s: %s\n", nomFichier, erreur);
				return 1;
			}

			// Modifier un pixel à la position (x, y)
			int i = y * image.width + x;
			image.pixels[i].r = 0;
			image.pixels[i].g = 0;
			image.pixels[i].b = 0;

			// Ecrire une image PNG
			image_write_to_png(&image, "chameaux-modifies.png");

			// Ecrire une image JPG (avec la qualité 95)
			image_write_to_jpeg(&image, "chameaux-modifies.jpg", 95);

			// Libérer une image plus utilisée
			image_free(&image);