Capture vidéo et Python

Comment récupérer un flux vidéo à partir d'une webcam ou autre

Le problème exposé dans ce sujet a été résolu.

Bonjour les zesteux !

Je suis à la recherche d'un moyen pour récupérer et afficher un flux vidéo en provenance d'une webcam USB ou d'une caméra branchée sur un port Firewire ou sur un carte d'acquisition (de ce style par exemple).

J'espérais trouver un moyen de faire cela avec Python 3, mais il semble que la plupart des outils disponibles n'aient pas encore été portés. Pour Python2, j'ai donc trouvé OpenCV, SimpleCV (qui avait l'air cool a utiliser, mais qui ne semble plus mis à jour) et pygst (binding pour GStreamer, pour lequel je n'ai trouvé presque aucune ressource). Je me tourne donc vers vous pour vous demander si vous avez déjà utilisé l'un d'entre eux ou s'il existe une alternative compatible Python 3 (pygst l'est peut-être, j'ai pas trouvé :( )…

Par ailleurs, je me demande aussi si Python est le bon langage dans ce cas précis (acquisition vidéo) ou s'il vaut mieux que cette partie soit en C++ (ou autre).

Merci d'avance pour vos réponses !

Opencv 3 fonctionne avec Python 3.

Kje

Oups j'avais mal lu (bon en même temps, ça l'air très récent comme support) ! Merci, ça me rassure. :)

Pour l'usage, je cherche à afficher en direct le flux (+ enregistrement de l'image actuelle sur demande de l'utilisateur, pas en continu). Par la suite, j'aurais peut-être besoin d'effectuer certaines opérations (chroma-key notamment). Je sais pas si ça le fait avec Python (après rien ne m'empêche de re-coder les bouts critiques en C++).

+0 -0

J'avais pas put détailler, j'étais sur mon téléphone, désolé.

J'utilise au boulot OpenCv 3 avec Python 3.4 depuis la beta 2 et ça marche très bien. En réalité le code est dispo depuis longtemps, simplement il fallait compiler OpenCv a la main pour en profité. Avec la dernière version le support est devenue officiel.

Le gros point positif est que maintenant le binding python utilise numpy et donc on récpère des array numpy. Il faut faire attention aux types quand on appel les fonctions mais ça fonctionne sans problèmes.

Je pense que tu peux commencer ton projet avec OpenCv. Comme tu le dis il sera toujours temps de passer au C++, ou à Cython, les parties critiques si il y a des problèmes de perfs.

Pour juste de l'acquisition et de l'affichage, Python suffira largement.

Après, cela dépend de la nature des traitements que tu comptes faire. Si ceux-ci utilisent massivement OpenCV (plutôt que des calculs à toi), honnêtement ça devrait continuer à coller avec Python.

Sinon, comme le dit mon voisin du dessus, si tu dois faire des calculs qu'OpenCV ne supporte pas déjà, il faudra que tu profiles ton programme pour trouver code qui te ralentit vraiment, et l'optimiser, donc peut-être envisager récrire une ou deux fonctions en C++ et/ou avec Cython.

+0 -0

Au passage, au boulot, il n'y a aujourd'hui plus une seule partie du code qui ne soit pas en Python. Les calculs lourds sont fait en utilisant intelligemment OpenCV sur la partie image et numpy quand ce sont des traitements spécifique. Si tu te débrouille bien, la majorité des calculs peuvent être exprimés sous forme de combinaisons d'array ce qui permet de profiter à fond du parallélisme géré par numpy. Au final on se disait la même chose que toi et en pratique le code actuellement est largement assez rapide pour nos besoins donc pas besoin de rajouter du natif.

Bah c'est une lib de traitement matricielle. Ça permet d'avoir l'equivalent de matlab en gros. Tu récupère une array qui est un gros tableau de nombre et numpy propose tout plein de fonctions pour les manipuler d'un seul bloc et du coup profiter de son implémentation native (en gros tu essai de ne jamais faire le moindre for sur les pixels, trop lent en Python). numpy est LA lib de base de tous les packages lié au calcul scientifique en Python. Hesite pas à poser des questions dans un autre sujet dessus si tu as besoin. Cependant si c'est du traitement d'image que tu fais, il y a plus de chance que tu trouve ton bonheur dans OpenCV.

La seule petite chose qu'il faut faire attention quand tu utilise OpenCv depuis python est qu'il faut que les pixels soient codés, soit avec 3 canaux d'unsigned char quand ça représente une image (3 canaux de 0 à 255 en BGR), soit, pour les matrices de flottant en float32. Sinon tu va avoir des erreurs qui sont pas forcément très clair. Mais il suffit de le savoir et après ça roule tout seul

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte