Nous développons un outil d'acquisition multicapteurs et nous rencontrons des problèmes pour enregistrer les images (d'une webcam) sur le disque dur.Enregistrer efficacement les fichiers image sur le disque C#
Nous utilisons trois fils à cette fin:
- Un fil qui rassemble en permanence l'image capturée de la webcam.
- Fil d'horloge qui collecte la dernière image et l'envoie dans une méthode d'enregistrement de fichier.
- Le thread minuteur appelle un troisième thread à enregistrer, afin de ne pas interférer avec la fonctionnalité de thread minuteur principal.
Cela fonctionne très bien pour les basses fréquences. Lorsque nous élevons le FPS à environ 30, nous commençons à perdre des images. Notez que nous avons plusieurs capteurs et pas seulement une webcam. Voilà pourquoi nous utilisons cette architecture et ne pas sauvegarder directement les fichiers à partir du fil de webcam (nous avons besoin de tout garder synchronisé)
C'est la mise en œuvre actuelle de la méthode de sauvegarde:
private void saveImageFrame(Bitmap b, ulong frameID)
{
string fileSavePath = _path+ "//";
if (b != null)
{
Task.Factory.StartNew(() =>
{
lock (_lock)
{
Bitmap toSave = new Bitmap(b);
string fileName = fileSavePath + frameID.ToString() + ".bmp";
toSave.Save(fileName);
}
});
}
}
Nous avons aussi essayé sans le fil de la tâche (pour l'enregistrement) et sans le verrou. Ces deux résultats dans des conditions de course, puisque l'économie prend plus de temps que l'intervalle de temps de la minuterie.
Je suis sûr qu'il existe de meilleures façons de le faire à la fois en termes d'architecture et de fonctions .NET. Toute aide pour améliorer la performance de ce serait grandement appréciée!
Je ne suis pas certain de comprendre le flux de données et les minuteurs. Lorsque le thread de la webcam a assemblé une instance d'image, pourquoi n'effectue-t-il pas une file d'attente immédiate sur le thread de sauvegarde, disons, un BlockingCollection et en crée immédiatement un nouveau pour l'image suivante? –
Puisque nous avons plusieurs capteurs (pas seulement webcam) et que nous aimerions tous avoir la même clé (qui est FrameID dans ce cas), nous voulons qu'ils soient tous sauvés par un composant principal qui fournit cette clé. Espérons que cela clarifie – Omri374