Description de l'implémentation du simulateur "View hive generator"¶
L'application "View hive simulator" est un simulateur visuel illustrant les allées et venues des abeilles dans une ruche. Elle permet aux utilisateurs d'observer les abeilles quittant la ruche et de consulter les données sur le nombre d'abeilles entrées et sorties. Les utilisateurs peuvent ajuster plusieurs paramètres pour personnaliser l'expérience de simulation, tels que la taille des abeilles, leur vitesse et la fréquence d'apparition des abeilles.
But¶
cette application est conçue pour tester une reconnaissance d'abeilles d'un algorithme de détection d'objets en temps réel (YOLOv8). Elle simule différents scénarios d'apparition et de mouvement des abeilles, permettant ainsi de vérifier et d'améliorer les algorithmes de détection d'objets en temps réel.
Interface utilisateur¶
Voici l'application "view hive generator" :
Éléments de la fenêtre principale¶
La fenêtre principale de l'application est structurée en plusieurs sections :
-
Vue de Dessus de la Ruche
Affiche les abeilles entrant et sortant de la ruche.
-
Panneau de Contrôle
Permets aux utilisateurs de régler différents paramètres de la simulation.
-
Panneau de Commande
Permets aux utilisateurs de démarrer, arrêter et reprendre une simulation.
-
Enregistrement
Permets aux utilisateurs d'enregistrer une simulation au format MP4.
Contrôles et paramètres¶
-
Nombre d'abeilles à l'intérieur
Description: Détermine le nombre d'abeilles visibles dans la section "Intérieur de la ruche".
Type: Numérique (entier)
-
Nombre d'abeilles à l'extérieur
Description: Détermine le nombre d'abeilles visibles dans la section "Extérieur de la ruche".
Type: Numérique (entier)
-
Durée
Description: Affiche le temps écoulé depuis le début de la simulation.
Type: Horloge (HH:MM:SS)
-
Taille des abeilles
Description: Ajuste la taille des abeilles affichées.
Type: Slider (échelle de 1 à 10)
-
Vitesse des abeilles
Description: Ajuste la vitesse à laquelle les abeilles se déplacent.
Type: Slider (échelle de 1 à 10)
-
Chance d'apparition d'abeille
Description: Détermine la probabilité d'apparition des abeilles toutes les secondes.
Type: Slider (échelle de 0% à 100%)
-
Changer l'image de fond
Description: Permets de changer l'image de fond de la simulation.
Type: Bouton
-
Boutons de contrôle de la simulation
-
Démarrer (Play)
- Description : Lance la simulation.
- Type: Bouton
-
Arrêter (Stop)
- Description : Arrête la simulation.
- Type : Bouton
- Relancer (Restart)
- Description: Relance une simulation.
- Type: Bouton
-
-
Enregistrement
- Démarrer
- Description: Permets de lancer un enregistrement de la simulation
- Type: Bouton
- Arrêter
- Description: Permets de stopper l'enregistrement de la simulation.
- Type: Bouton
- Démarrer
Fonctionnalités et code¶
Déplacement des abeilles¶
Cette méthode permet de déplacer chaque abeille dans la simulation. Chaque abeille se déplace verticalement dans une direction déterminée par sa position initiale (à l'intérieur ou à l'extérieur de la ruche). Le mouvement vertical est aléatoire, mais restreint dans une certaine plage.
/// <summary>
/// Déplace les abeilles dans une certaine plage
/// </summary>
public void MoveBee()
{
foreach (Bee bee in bees)
{
if (bee.IsInside)
{
// Si l'abeille est à l'intérieur, elle se déplace vers le haut
bee.ChangeCoordonner(0, -rdm.Next(MIN_RANGE_PIXEL_MOVE_BEE, MAX_RANGE_PIXEL_MOVE_BEE));
}
else
{
// Si l'abeille est à l'extérieur, elle se déplace vers le bas
bee.ChangeCoordonner(0, rdm.Next(MIN_RANGE_PIXEL_MOVE_BEE, MAX_RANGE_PIXEL_MOVE_BEE));
}
}
}
Explication du fonctionnement¶
- Boucle sur toutes les abeilles :
-
La méthode utilise une boucle
foreach
pour parcourir toutes les abeilles dans la listebees
. -
Déplacement vertical des abeilles :
- Si l'abeille est à l'intérieur de la ruche (
bee.IsInside
esttrue
), elle se déplace vers le haut. La position Y de l'abeille est réduite d'une valeur aléatoire comprise entreMIN_RANGE_PIXEL_MOVE_BEE
etMAX_RANGE_PIXEL_MOVE_BEE
. -
Si l'abeille est à l'extérieur de la ruche (
bee.IsInside
estfalse
), elle se déplace vers le bas. La position Y de l'abeille est augmentée d'une valeur aléatoire comprise entreMIN_RANGE_PIXEL_MOVE_BEE
etMAX_RANGE_PIXEL_MOVE_BEE
. -
Mouvement aléatoire :
- Le déplacement vertical de chaque abeille est déterminé par un nombre aléatoire généré par
rdm.Next(MIN_RANGE_PIXEL_MOVE_BEE, MAX_RANGE_PIXEL_MOVE_BEE)
. Cela ajoute un comportement naturel et imprévisible au mouvement des abeilles.
Détection des abeilles¶
Cette méthode permet de détecter si les abeilles ont traversé des lignes de détection, indiquant leur entrée ou leur sortie de la ruche. Lorsqu'une abeille traverse la ligne supérieure ou inférieure, le compteur correspondant est incrémenté.
/// <summary>
/// Compte les abeilles à l'extérieur et à l'intérieur grâce à une détection
/// </summary>
/// <param name="beeList">Liste des abeilles à détecter</param>
public void DetectionBee(List<Bee> beeList)
{
for (int i = 0; i < beeList.Count; i++)
{
int cordsBee = beeList[i].Coordonne.Y + (beeList[i].Img.Height / 2);
// L'abeille touche la barre supérieure
if (cordsBee >= lineTopDetectedBee && cordsBee <= lineTopDetectedBee + LINE_DETECTION_MARGIN)
{
beeList[i].TouchLineTop = true;
// L'abeille touche la barre inférieure et la valeur n'a pas encore été ajoutée
if (beeList[i].TouchLineBottom && beeList[i].AddNumber == false)
{
// L'abeille entre dans la ruche
NumberBeeInside++;
beeList[i].AddNumber = true;
if (Record)
{
NumberBeeInsideDuringRecord++;
}
}
}
// L'abeille touche la barre inférieure
if (cordsBee >= lineBottomDetectedBee && cordsBee <= lineBottomDetectedBee + LINE_DETECTION_MARGIN)
{
beeList[i].TouchLineBottom = true;
// L'abeille touche la barre supérieure et la valeur n'a pas encore été ajoutée
if (beeList[i].TouchLineTop && beeList[i].AddNumber == false)
{
// L'abeille sort de la ruche
NumberBeeOutside++;
beeList[i].AddNumber = true;
if (Record)
{
NumberBeeOutsideDuringRecord++;
}
}
}
}
}
Explication du fonctionnement¶
- Boucle sur toutes les abeilles :
-
La méthode utilise une boucle
for
pour parcourir toutes les abeilles dans la listebeeList
. -
Calcul des coordonnées de détection :
-
cordsBee
représente la position verticale actuelle de l'abeille en ajoutant la moitié de la hauteur de l'image de l'abeille à sa position Y. -
Détection de la ligne supérieure :
- Si les coordonnées de l'abeille se trouvent dans la plage de détection de la ligne supérieure (
lineTopDetectedBee
àlineTopDetectedBee + LINE_DETECTION_MARGIN
), le drapeauTouchLineTop
de l'abeille est activé. -
Si l'abeille a déjà touché la ligne inférieure (
TouchLineBottom
esttrue
) et qu'elle n'a pas encore été comptabilisée (AddNumber
estfalse
), cela signifie que l'abeille est entrée dans la ruche. Le compteurNumberBeeInside
est incrémenté, et si l'enregistrement est activé (Record
esttrue
),NumberBeeInsideDuringRecord
est également incrémenté. -
Détection de la ligne inférieure :
- Si les coordonnées de l'abeille se trouvent dans la plage de détection de la ligne inférieure (
lineBottomDetectedBee
àlineBottomDetectedBee + LINE_DETECTION_MARGIN
), le drapeauTouchLineBottom
de l'abeille est activé. - Si l'abeille a déjà touché la ligne supérieure (
TouchLineTop
esttrue
) et qu'elle n'a pas encore été comptabilisée (AddNumber
estfalse
), cela signifie que l'abeille est sortie de la ruche. Le compteurNumberBeeOutside
est incrémenté, et si l'enregistrement est activé (Record
esttrue
),NumberBeeOutsideDuringRecord
est également incrémenté.
Ces fonctionnalités permettent de simuler et de suivre le mouvement des abeilles entrant et sortant d'une ruche de manière réaliste et précise.
Enregistrement de la simulation¶
Le bouton "Enregistrement" permet de capturer la simulation image par image jusqu'à ce que le bouton "Stop" soit pressé, ce qui arrête l'enregistrement et sauvegarde le fichier au format MP4. Il permet aussi d'enregistrer dans un fichier texte le nombre d'abeilles entrées et sorties durant le laps de temps. Pour par la suite comparer les données avec le module de surveillance externe.
```csharp ///
simulator.Record = true;
// Initialiser le VideoFileWriter
_videoWriter = new VideoFileWriter();
_videoWriter.Open(linkRecordDownload, width, height, 25, VideoCodec.MPEG4);
_isRecording = true;
tmrRecording.Start();
}
}
/// <summary>
/// Bouton pour arrrêter l'enregistrement
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStopRecord_Click(object sender, EventArgs e)
{
if (_isRecording)
{
// Arrêter l'enregistrement
tmrRecording.Stop();
_videoWriter.Close();
_videoWriter.Dispose();
_isRecording = false;
}
if (File.Exists(linkDataDownload))
{
File.Delete(linkDataDownload);
}
File.Create(linkDataDownload).Close();
using (StreamWriter sw = File.AppendText(linkDataDownload))
{
sw.WriteLine("Nombre d'abeille sortie : " + simulator.NumberBeeOutsideDuringRecord);
sw.WriteLine("Nombre d'abeille entree : " + simulator.NumberBeeInsideDuringRecord);
}
simulator.Record = true;
}
/// <summary>
/// Timer qui addition des captures d'écran pour crée le flux vidéo
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tmrRecording_Tick(object sender, EventArgs e)
{
if (_isRecording)
{
// Capture l'image actuelle du PictureBox
_currentFrame = new Bitmap(ptbHiveWatch.Width, ptbHiveWatch.Height);
ptbHiveWatch.DrawToBitmap(_currentFrame, new Rectangle(0, 0, ptbHiveWatch.Width, ptbHiveWatch.Height));
// Ajouter l'image à la vidéo
_videoWriter.WriteVideoFrame(_currentFrame);
// Libérer la mémoire
_currentFrame.Dispose();
}
}
```