OpenCV: processus de chaque image
Je veux écrire une application multiplate-forme, en utilisant OpenCV pour la capture vidéo. Dans tous les exemples, j'ai trouvé des images de la caméra sont traitées à l'aide de la prise de fonction et en attente pendant un certain temps. Et je veux traiter chaque image dans une séquence. Je veux définir ma propre fonction de rappel, qui sera exécutée à chaque fois, quand une nouvelle image est prête à être traitée (comme dans directshow pour Windows, lorsque vous la définition et de la mise en graphique de votre propre filtre à ces fins).
La question est donc: comment puis-je faire cela?
- Vous aurez probablement besoin d'ajouter votre propre schéma de mise en mémoire tampon si vous voulez vous assurer que vous ne laissez pas tomber tous les blocs.
- J'ai peut-être tort, mais je ne vois pas pourquoi vous ne pouvez pas faire ce que vous demandez basé sur l'exemple de l'utilisation de VideCapture dans la documentation. Il suffit de saisir votre image avec l'opérateur<< et de les traiter comme ils arrivent
- Viens de réaliser que vous posiez la question il y a longtemps.. 😀
Vous devez vous connecter pour publier un commentaire.
Selon le code ci-dessous, tous les rappels doivent suivre cette définition:
Cette signature signifie que le rappel va être exécuté sur chaque image récupérée par le système. Sur mon exemple, make_it_gray() alloue une nouvelle image pour enregistrer le résultat de la conversion en niveaux de gris et le renvoie. Cela signifie que vous devez libérer de cette image sur votre code. J'ai ajouté des commentaires sur le code à ce sujet.
Notez que si votre rappel demande beaucoup de traitement, le système pourrait passer quelques images de la caméra. Prendre en compte les suggestions Paul R et diverscuba23 fait.
EDIT:
J'ai changé le code ci-dessus de sorte qu'il imprime le courant de framerate et effectue un manuel de conversion en niveaux de gris. Ils sont de petites modifications sur le code et je l'ai fait pour des fins d'éducation, donc on sait comment effectuer les opérations au niveau du pixel.
Réflexions rapides serait d'avoir 2 fils, le premier thread est responsable de l'accaparement des cadres et des notifiy le deuxième thread lorsqu'ils sont disponibles (les place dans une file d'attente de traitement), le deuxième thread n'tous de votre traitement dans un événement de type à boucle façon.
Voir boost::thread et boost::signals2 que les deux ensemble devrait fournir plus le cadre (à l'exception de la file d'attente) pour ce que j'ai décrit ci-dessus.