Vous êtes sur la page 1sur 38

Algorithmique, C++

Recollement d'images

Objectif du TP : programmation d'un algorithme de recollement d'images

Langage C++

Introduction au langage Gestion de la mmoire, hritage, gnricit, Standard Template Library (STL), ... Application de notions vues en CTD Algos de programmation dynamique et Dijkstra Structures de donnes, calculs de cots Options de compilation, outils de profilage, ...

Algorithmique et structures de donnes

Programmation efficace et optimisations

Dbogage de programmes

Droulement

4 sances de cours + 7 sances en salle machine + 1 sance de TD (planning : cf. wikiosk) Travailler sur votre compte sur ensibm 3 dlivrables, sur 2/2/1 point(s), rendre la fin de 3 sances machines (Teide) Note de TP = de la note d'algo

Sances notes

Nouveaut : une note pour 2 sances conscutives (5 et 6, 8 et 9, 11 et 12) Enonc fourni au dbut de la premire sance Travail effectuer pour le dbut de la seconde sance Dbut de la seconde sance : questionnaire + nonc complmentaire

Ce qui vous est fourni

Poly (cf. wikiosk) : Enonc du sujet global du TP Introduction C++ (non exhaustif !) Des fichiers sources Au dbut des sances de TP Eventuellement incomplets Des images pour les tests

Vous pouvez aussi en utiliser d'autres

Ce qui doit tre rendu

A la fin des sances n 6, 9 et 12 Un code complt Un questionnaire rempli Via Teide Travail en monmes (Hopefully) Retour/correction lors de la sance suivante

Questionnaire

Dbut de sance 2/2, questions de comprhension sur la 1re partie Code de la sance 1/2 pas forcment corrig

Certains, pris au hasard, seront corrigs Note note du questionnaire => sanction Vous pouvez demander une correction individualise

Rq: toutes les sances en salles machines sont obligatoires (-1 pt sur la note finale par absence)

Sujet du TP : recollement d'images


Une image numrique est constitue d'un tableau d'lments de base appels pixels Pixel = PICTure ELement A chaque pixel est associe une couleur : triplet de scalaires (R,V,B) R : Rouge, V : Vert, B : Bleu

Recollement d'images

Soient deux images I1 et I2


deux vues voisines de la mme scne, places en partie lune sur lautre

pour quelles se raccordent le mieux possible. J : zone de chevauchement (Rectangle de taille n x m pixels) I1 J I2
Deux images se chevauchant

Recollement d'images
Chemin dans J : suite de pixels voisins J

I1 I2

Erreur entre les images en un pixel p J de couleur (R1,V1,B1) dans I1 et de couleur (R2,V2,B2) dans I2

2 2 2 (p) = (R1 R2 ) +(V1 V2 ) +(B1 B2 )

Recollement d'images

Cot d'un chemin trac dans J = somme des erreurs des pixels qui forment le chemin But : raccordement entre les images le moins visible possible

Calculer le chemin de cot minimal Image I1 affiche gauche de ce chemin, Image I2 sa droite.

Recollement d'images

Recollement d'images

Objectifs des sances de TP : Prparer les classes et mthodes utiles Calculer un chemin optimal :

Plusieurs algorithmes

Tester et comparer ces algorithmes

Tests : n'hsitez pas utiliser vos propres photos !

Plan des sances de cours

Aujourd'hui (sance n 1)
Prsentation du sujet du TP De Java et C C++

Sance n 3

Hritage, gnricit STL et structures de donnes Optimisation, dbogage, exceptions,

Sance n 7

Sance n 10

Introduction C++ Premire partie

De Java et C C++

Introduction

Langage objet : classes, hritage, gnricit C++ peut tre considr comme extension de C (en premire approximation) C est un sous-ensemble de C++ ( peu de choses prs) Pas de garbage collector ( Java) Bibliothque Standard : STL

Structures de donnes Algos standards

Hritage du C

Types de base : int, double, float, char Arithmtique de base : +, - , *, /, %, Tests et boucles :

if (condition) { insts; } else { insts; } for (int i=0; i<n; i++) { insts;} while (condition) {insts;} do {insts;} while(condition);

Pointeurs et tableaux : char v[10]; int *i;

Extensions des fonctions

Surcharge de fonctions :
int puissance(int x, int n){ //calcule xn = x.xx } double puissance(int x, double n){ //calcule xn = en log x }

Arguments par dfaut dune fonction


int ajouter(int a, int b=1) { return a+b; } ajouter(2); // renvoie 3

Gestion de la mmoire

2 nouveaux oprateurs de gestion de la mmoire :


new type : allocation d'un objet unique new type[n] : allocation d'un tableau de taille n delete adresse : libration d'un objet unique delete [] adresse : libration d'un tableau

Plus de malloc, allocation dynamique Attention aux fuites de mmoire !

Gestion de la mmoire

Exemple :
int* pi = new int;
// Au lieu de : // int *pi = (int *) malloc(sizeof(int));

float* RGB = new float[3]; delete pi;


// Au lieu de : free(pi);

delete [] RGB;

Rfrences

Notion de rfrence : &


& (ampersand) = alias sur une variable ou un objet. Exemple : int ix; int &ir = ix; // Est une ref sur ix ir = j; // Ne transforme pas ir en ref sur j
// mais copie j dans ix

ix = 1; // ir = 1 aussi ir = 2; // ix = 2 aussi Passage de Paramtres : void Recopie(int &i);

Entres/sorties de base

Soit printf, scanf , soit utilisation des flux.


#include <iostream>

Entre clavier :
int i; std::cin >> i; // Lit un entier

Sortie l'cran :
int i = 2; std::cout << "i : " << i << std::endl;

Flux d'erreur :
std::cerr << "erreur !" << std::endl;

Entres/sorties fichier

Exemple :
ifstream f("infile"); // Ouverture en lecture ofstream g("outfile");// Ouverture en criture fstream h("filename",ios::in|ios::out);
//Ouverture en lecture et criture

char buf[81]; f.getline(buf, 80); // Lit une ligne while (f) { g << buf << std::endl; // Envoie dans g f.getline(buf,80); // Lit la ligne suivante }

Espace de nommage

quivalent du paquetage Java et Ada Dfini laide du mot-cl namespace Intrt : viter les conflits de noms entre plusieurs modules.
namespace pile_de_char { void empiler(char); char depiler(); } namespace pile_de_int { void empiler(int); int depiler(); }

Espace de nommage : utilisation

Exemple :
void main(){ pile_de_char::empiler( x ); if (pile_de_char::depiler() != x) std::cerr << "impossible" << std::endl; }

Mot-cl using : introduit l'identificateur dans la rgion dclarative courante :


using pile_de_char::empiler(char); => empiler('x');

Les classes

Dfinition d'un nouveau type C++ Une classe est compose : d'attributs (donnes internes) de fonctions membres appeles mthodes

Une variable de ce type (une instance) est appele un objet Encapsulation : dclaration mthodes et attributs un endroit unique

Un exemple de classe
class Point { int _x, _y; int abscisse () const { return _x; } int ordonnee () const { return _y; } void set_coord (int x, int y) { _x = x; _y = y; } };

Exemple d'utilisation
void main() { Point p; p.set_coord(1,2); std::cout << "abscisse : " << p.abscisse() << " ordonnee : " << p.ordonnee() << std::endl; }

Accs aux attributs et mthodes

L'utilisateur peut restreindre l'accs aux attributs et fonctions membres de ses classes : public, private, protected

private : autoris uniquement aux fonctions membres de la classe public : autoris pour toute fonction protected : autoris uniquement aux fonctions membres de la classe et aux classes drives

Conseil d'utilisation : tous les attributs privs

Un exemple d'utilisation
class Point { private: // Pas obligatoire, par dfaut ! int _x, _y; public: // Les mthodes suivantes sont publiques int abscisse () const { return _x; } int ordonnee () const { return _y; } void set_coord (int x, int y) { _x = x; _y = y; } };

Constructeurs

Rle (principalement) : allouer la mmoire initialiser les attributs Par dfaut sont implments :

constructeur vide constructeur de recopie

Constructeurs : exemple
class Point { int _x, _y; public : Point() : _x(0), _y(0) {}
// Constructeur par dfaut ; celui qui est appel lors d'une dclaration du type : // Point p;

Point(int x, int y) : _x(x), _y(y) {}


// Constructeur appel lors d'une dclaration du type : // Point p(1,2);

Point(const Point& P) : _x(P._x), _y(P._y){}


// Constructeur de recopie : // Point p1; // Point p2(p1); // p2 est une copie de p1

};

Elments de syntaxe

Liste d'initialisation d'un constructeur :


Point() : _x(0),_y(0) {}

Fonctions membres constantes : ne modifient pas les attributs de la classe


class Point { int _x, _y; public: int abscisse() const { return _x; } };

Destructeurs

Rle : librer la mmoire ! Appels automatiquement la fin de la porte de l'objet (fermeture d'accolade } ) Par dfaut un destructeur vide est implment

Destructeur : exemple
class Tableau { int *_t; public: Tableau(int s = 10) { _t = new int[s]; } ~Tableau() { delete [] _t; } }; { Tableau T; } // Destructeur ~Tableau() appel automatiquement
// en fin de porte

Sparation dclaration/implantation
Fichier Point.h :
Class Point { int _x, _y; Public: int abscisse() const; };

Fichier Point.cpp :
Point::Point() : _x(0), _y(0) {} int Point::abscisse() const {return _x;}

Rfrences croises

Problme : titi.h
#include "toto.h" class titi { void f1(toto t); };

toto.h
#include "titi.h" class toto { void f1(titi t); };

toto.cpp
#include "toto.h" void toto::f1(titi t){}

titi.cpp
#include "titi.h" void titi::f1(toto t){}

NE FONCTIONNE PAS !!

Rfrences croises

Solution : prdclarations
titi.h
class toto; class titi { void f1(toto t); };

toto.h
class titi; class toto { void f1(titi t); };

toto.cpp
#include "toto.h" #include "titi.h" void toto::f1(titi t){}

titi.cpp
#include "titi.h" #include "toto.h" void titi::f1(toto t){}