12 void maj_angle(
int vecX,
int vecY,
int rayon,
double* angle){
15 double coeffx, coeffy;
22 coeffx = -0.2*vecX/rayon;
23 coeffy = 0.2*vecY/rayon;
30 if (l0 != 0) angle[0] = l0;
31 if (l1 != 0) angle[1] = l1;
37 if (pos > ref)
return 0;
42 int MAX_PWM = 130, MIN_PWM = 30;
43 if (val_pwm > MAX_PWM){
46 else if (val_pwm < MIN_PWM){
58 fichier = fopen(
"/dev/ttyACM0",
"w");
60 printf(
"Erreur ouverture fichier\n");
61 perror(
"fopen failed for /dev/ttyACM0" );
66 fprintf(fichier,
"%d\n",(
int)angle[0]);
67 fprintf(fichier,
"%d\n",(
int)angle[1]);
77 int w = imcv->widthStep;
78 char* ptr = imcv->imageData;
80 imFlux.create(imcv->width,imcv->height, NULL);
82 for(
int y=0; y<imcv->height; y++ ) {
84 for(
int x=0; x<imcv->width; x++ ) {
87 G = ptr[y*w + 3*x + 1];
88 R = ptr[y*w + 3*x + 2];
91 imFlux.setPixel(x,y,sf::Color(R,G,B,1));
99 void traitement(IplImage* frame, IplImage* HSV, IplImage* Binaire,
int LowH,
int HighH,
int LowS,
int HighS,
int LowV,
int HighV){
102 cvCvtColor(frame, HSV, CV_BGR2HSV);
105 cvSmooth( HSV, HSV, CV_GAUSSIAN, 15, 0,0,0);
109 CvScalar valinf={(double)LowH,(
double)LowS,(double)LowV};
110 CvScalar valsup={(double)HighH,(
double)HighS,(double)HighV};
112 cvInRangeS(HSV, valinf,valsup, Binaire);
122 CvMoments *moments = (CvMoments*)malloc(
sizeof(CvMoments));
124 cvMoments(Binaire, moments, 1);
126 double moment10 = cvGetSpatialMoment(moments, 1, 0);
127 double moment01 = cvGetSpatialMoment(moments, 0, 1);
128 double area = cvGetCentralMoment(moments, 0, 0);
130 *posX = moment10/area;
131 *posY = moment01/area;
136 void config(
int* LowH,
int* HighH,
int* LowS,
int* HighS,
int* LowV,
int* HighV){
138 cvNamedWindow(
"Control", CV_WINDOW_AUTOSIZE);
141 cvCreateTrackbar(
"LowH",
"Control", LowH, 179,NULL);
142 cvCreateTrackbar(
"HighH",
"Control", HighH, 179,NULL);
144 cvCreateTrackbar(
"LowS",
"Control", LowS, 255,NULL);
145 cvCreateTrackbar(
"HighS",
"Control", HighS, 255,NULL);
147 cvCreateTrackbar(
"LowV",
"Control", LowV, 255,NULL);
148 cvCreateTrackbar(
"HighV",
"Control", HighV, 255,NULL);
154 cvNamedWindow(
"HSV", CV_WINDOW_AUTOSIZE );
155 cvNamedWindow(
"Binaire", CV_WINDOW_AUTOSIZE );
156 cvNamedWindow(
"Camera", CV_WINDOW_AUTOSIZE );
158 cvShowImage(
"HSV", HSV);
159 cvShowImage(
"Binaire", Binaire);
160 cvShowImage(
"Camera", frame );
166 cvCircle(frame, cvPoint(width/2,height/2), height*
JEU, CV_RGB(0, 255, 0), 4, 8, 0 );
171 cvLine(frame, cvPoint(posX-20,posY), cvPoint(posX+20,posY), CV_RGB(255, 0, 0), 4, 8, 0 );
172 cvLine(frame, cvPoint(posX,posY-20), cvPoint(posX,posY+20), CV_RGB(255, 0, 0), 4, 8, 0 );
176 cvLine(frame, cvPoint(posX-20,posY), cvPoint(posX+20,posY), CV_RGB(0, 0, 255), 4, 8, 0 );
177 cvLine(frame, cvPoint(posX,posY-20), cvPoint(posX,posY+20), CV_RGB(0, 0, 255), 4, 8, 0 );
184 CvHaarClassifierCascade* cascade = 0;
185 const char* cascade_name =
"haarcascade_frontalface_alt.xml";
188 cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
192 fprintf( stderr,
"ERROR: Could not load classifier cascade\n" );
204 static CvMemStorage* storage = 0;
208 IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 );
215 storage = cvCreateMemStorage(0);
218 cvNamedWindow(
"result", 1 );
221 cvClearMemStorage( storage );
228 CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,1.1, 2, 0, cvSize(60, 60),cvSize(500, 500));
231 tab_face[0]->largeur = 0;
232 tab_face[1]->largeur = 0;
235 for( i = 0; i < (faces ? faces->total : 0); i++ ){
237 CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
241 pt2.x = (r->x+r->width)*scale;
243 pt2.y = (r->y+r->height)*scale;
246 cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
249 tab_face[i]->point.x = (pt1.x + pt2.x)/2;
250 tab_face[i]->point.y = (pt1.y + pt2.y)/2;
251 tab_face[i]->largeur = r->width;
259 cvShowImage(
"result", img );
262 cvReleaseImage( &temp );
266 void get_color(IplImage* image,
face* rec_face,
int* BGR){
269 int largeur = rec_face->largeur;
271 cvSetImageROI(image,cvRect(rec_face->point.x -largeur/2, rec_face->point.y -largeur/2, largeur,largeur));
273 colors = cvAvg(image);
275 cvResetImageROI(image);
277 BGR[0] = colors.val[0];
278 BGR[1] = colors.val[1];
279 BGR[2] = colors.val[2];
void config(int *LowH, int *HighH, int *LowS, int *HighS, int *LowV, int *HighV)
Fonction d'affichage du panneau de configuration de la couleur à suivre.
void detect_and_draw(IplImage *img, CvHaarClassifierCascade *cascade, face **tab_face)
Détecte et renvoie un rectangle pour chaque visage sur l'image.
CvHaarClassifierCascade * init_cascade()
Charge les fichiers cascades pour la reconnaissance faciale.
void Position_moy(IplImage *Binaire, int *posX, int *posY)
Effectue le baricentre des pixels d'une image binaire pour obtenir la postion de l'objet.
int ajust_pos(int pos, int ref)
permet d'éviter des positions supérieures à ref considérées comme aberrantes.
void traitement(IplImage *frame, IplImage *HSV, IplImage *Binaire, int LowH, int HighH, int LowS, int HighS, int LowV, int HighV)
Effectue une binarisation de frame en fonction des bornes HSV.
void maj_angle(int vecX, int vecY, int rayon, double *angle)
Met à jour angle selon la distance entre le centre de la caméra et la cible, avec un tolérance circul...
#define JEU
Coefficient de tolérance pour le suivi d'objet.
Bibliothèque, Headers et Documentation des fonctions.
#define MAX_FACE
Nombre maximum de faces traitées.
void affichage_config(IplImage *frame, IplImage *HSV, IplImage *Binaire)
Fonction d'affichage du flux vidéo, du flux en HSV et de sa binarisation.
int limite_moteur(int val_pwm)
Fonction qui vérifie que les valeurs envoyees aux moteurs sont correctes.
void controle_moteur(double *angle)
Fonction d'envoie des angles aux moteurs.
void Affichage_Tracking(IplImage *frame, int posX, int posY, int width, int height)
Fonction d'affichage des informations de suivi.
int image_CV2SFML(IplImage *imcv, sf::Image imFlux)
Convertit une image opencv (IplImage) en une image SFML (sf::Image)
Contient les informations sur chaque face détectée : positions, largeur.