Forum Programmation.python Traitement python sur fichiers (images) issues d'un programme externe en continu

Posté par  .
Étiquettes :
0
5
fév.
2010
Voici en quelques mots ce que je cherche à faire :

Fichier vidéo -> conversion en image par un programme externe (Ex: FFmpeg) -> récupération des images et traitement avec PIL des images

Les images traitées sont ensuite recombinées dans un flux vidéo (mais pour cette partie, j'ai déjà ce qu'il faut).

Pour lancer le programme externe, je pensais utiliser subprocess.Popen (permet ainsi de récupérer la sortie standard stdout)

Le problème vient de la récupération des fichiers images et d'utiliser ces données (sans passer par un fichier sur le disque dur) pour créer un objet image (librairie PIL). Il faut déjà arriver à "diviser" les données venant de stdout et utiliser ces données pour créer des objets images, en plus, il faut pouvoir "bloquer" le process pour ne pas être noyé d'objet image qui doivent également être traité avant d'être envoyé dans le process suivant.

Des idées ?

Si ce n'est pas clair, faites le moi savoir, je cherche depuis déjà des semaines ...

Merci.

Marmotte
  • # Ce n'est pas clair

    Posté par  . Évalué à 1.

    Si tu ne veux pas passé par des fichiers, explique pourquoi .
    possibilités :
    - Temps d'écriture + lecture des images
    - Pollution du disque (si c'est le cas tu peux les générer dans un repertoire temporarires puis les supprimer apres les avoir lues)
    - autres ...

    Ensuite pour te répondre il faudrait savoir quel soft tu comptes utiliser comme programme externe.
    Là, plusieurs alternatives apparaissent :
    - un argument permet de récupérer l'image sur stdout (tu peux donc la recupérer) ou autre
    - il ne sait générer que des fichiers (la tu es obligé de passer par des fichiers)

    en bref, le probleme ne semble pas etre dût a python
    • [^] # Re: Ce n'est pas clair

      Posté par  . Évalué à 1.

      1. Pourquoi ne pas passer par des fichiers sur le disque ?

      * Rapidité du traitement
      * Limiter les écritures disques inutiles

      Le but final du traitement est de partir d'un fichier vidéo -> faire un traitement image par image et ensuite recréer un fichier vidéo. Sachant que dans une vidéo il y a entre 2 à 60 images par secondes et que pour une vidéo full HD la taille de l'image (format PPM non compressé) fait facilement 6 à 7 Mb, ça représente vite un beau volume de données utiles uniquement pendant le traitement.

      2. Externe petmettant de créer des images à patir d'une vidéo :

      Il y en a plusieurs et le choix n'est pas encore arrêté. FFmpeg est une possibilité, mais je crains que la sortie du codec PPM ne soit que des fichiers (pas possible de rediriger vers un pipe car dans la ligne de commande le nom de fichier de sortie utilise une numérotation automatique style "%d3"). Il y a d'autres possiblités (comme les outils MJpegtools -> yuv2ppm).

      Mais je n'arrive quand même pas à récupérer les données brutes des images individuellement. (A partir des données brutes, je peux créer un objet image (librairie PIL)).

      C'est plus clair ?
      • [^] # Re: Ce n'est pas clair

        Posté par  . Évalué à 1.

        Oui c'est plus clair, merci

        Je ne vais pas pouvoir beaucoup t'aider pour ce qui est des soft ou lib interessantes dans ton cas.

        Par contre pour ce qui est des temps de lecture/ecriture sur les disques, as tu pensé à utiliser un ramfs ? (pas très portable j'en conviens)
  • # Éviter l'utilisation d'un programme externe

    Posté par  . Évalué à 3.

    Je pense que tu éviteras pas mal de problèmes en n'utilisant pas un programme externe pour faire la conversion Fichier vidéo -> trames individuelles. Si tu veux faire un truc plus ou moins """temps réel""", tu ne pourras pas t'en sortir comme çà...

    Tu as pensé à regarder du côté des bibliothèques comme pyffmpeg [http://code.google.com/p/pyffmpeg/] ou pymedia [http://pymedia.org/faq.html] ?

    Si ça te convient pas, utiliser un tmpfs/ramfs et le module subprocess est une bonne solution.
  • # OpenCV (adieu PIL)

    Posté par  . Évalué à 3.

    Je te recommande d'utiliser la bibliothèque OpenCV, elle permet entre autres de faire du traitement d'image sur une vidéo frame par frame (c'est ce qu'utilise entre autre VLC).
    http://opencv.willowgarage.com/documentation/python/reading_(...)

    En revanche, ne te contente pas de l'antique version 1.0, la 2.0 est beaucoup plus robuste et offre des bindings Python beaucoup plus agréables d'utilisation.


    Un truc marrant serait de faire un plugin GStreamer pour faire le traitement d'image, ça dépoterait pas mal niveau performances.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.