[quote=“romvaillant”]Bon le calcul s’est bloqué au bout de 19 stages… Après une journée d’attente j’ai arrêté le calcul car il ne faisait apparemment rien (pourtant il prenait 100% de mes 2 cœurs).
Ça marche bien!! Il faut bien évidemment que je l’améliore…Mais dans l’ensemble le résultat est correct! Comme amélioration je pense supprimer la marge blanche autour de la flèche pour que les bords de la flèches collent les bordures de l’image, Faire les traits en noir au lieu de rouge, et épaissir les contours. Qu’en penses tu ?[/quote]
Bah parfois je suis resté 2 jours sur un niveau…
Maintenant je m’arrête à des images de 50x50 ou 30x70 en N&B sinon c’est effectivement un peu long.
Tu peux jouer avec tes images positives en effet. Déjà les passer en N&B et réduire un peu leur taille (que je ne connais pas mais c’est une piste), mettre plus ou moins de distorsion dans la préparation des échantillons d’entrainement, augmenter le nombre d’images de fond, ma banque de base est un peu faiblarde, j’ai commencé à m’en faire une de 5000 photos mais faut que je repasse tout en 640x480 et N&B.
Par contre pour la suppression de la marge tu peux essayer mais je ne garantis rien.
[quote=“romvaillant”]Maintenant j’ai une autre question, toujours sur OpenCV! Comment utiliser plusieurs modèles?Si je crée un autre objet OpenCV et que je réécris toutes les fonctions il ne détectera que mon deuxième modèle…Le problème se situe au niveau de la fonction cascade:C’est à dire que si je l’utilise deux fois dans le style de
opencv1.cascade(...);
opencv2.cascade(...);
Il reconnait et détecte uniquement le deuxième modèle malgré le fait que je fasse
Rectangle[] formes1 = opencv1.detect();
Rectangle[] formes2 = opencv2.detect();
Dans mon cas je vais créer le fichier XML de ma flèche mais dans l’autre sens, donc je voudrais utiliser le modèle de ma flèche gauche et de la flèche droite.[/quote]
Alors pour faire des détections de plusieurs objets dans une image je ne me suis pas posé trop de questions. Si je fait 2 détections :
CvHaarClassifierCascade *cascade1=NULL;
CvMemStorage *storage1=NULL;
CvHaarClassifierCascade *cascade2=NULL;
CvMemStorage *storage2=NULL;
// chgt cascade 1
cascade1 = cvLoad( chemin1, 0, 0, 0 );
storage1 = cvCreateMemStorage (0);
cvClearMemStorage( storage1 );
// chgt cascade 2
cascade2 = cvLoad( chemin2, 0, 0, 0 );
storage2 = cvCreateMemStorage (0);
cvClearMemStorage( storage2 );
// detections
CvSeq* faces1 = cvHaarDetectObjects( image, cascade1, storage1, 1.1, 3, 0, cvSize(20, 20) );
CvSeq* faces2 = cvHaarDetectObjects( image, cascade2, storage2, 1.1, 3, 0, cvSize(20, 20) );
// menage
cvReleaseHaarClassifierCascade( &cascade1 );
cvReleaseMemStorage ( &storage1 );
cvReleaseHaarClassifierCascade( &cascade2 );
cvReleaseMemStorage ( &storage2 );
Voila en gros le code en C à la bourrin. Après j’utilise les types CvSeq pour exploiter les positions et tailles des objets détectés. La doc officielle donne quelques billes là-dessus.
Mais pour détecter gauche et droite tu peux faire la détection avec juste un xml :
détection gauche —> rotation image 180° —> détection gauche
en temps de calcul tu y gagnera et puis tu ne gères qu’un seul xml.
Sinon j’y ai repensé, plutôt que le lance roquettes atomique qu’est le haartraining, as-tu réfléchi à détecter tes flèches plus simplement en cherchant des formes géométriques ?
OpenCV est assez puissant pour ça. Tu fais un petit traitement pour isoler les contours, tu récupères les contours sous forme vectorielle et tu confrontes ce qui a été trouvé avec un modèle.
Je m’étais amusé à faire ça pour détecter des formes géométriques simples.
La doc fourni des infos pour les caractérisations de lignes, de rectangles, de cercles, d’ellipses…ensuite il faut combiner un peu.
EDIT : y’a des mecs qui font ça aussi avec allegro il me semble mais je n’ai pas regardé.
Mais fais un peu attention, ça rend barge la vision