Forum Linux.embarqué Enregistrement vidéo synchronisé avec capteurs

Posté par . Licence CC by-sa
2
16
mar.
2014

Bonjour,

Contexte

Je suis en train de réaliser un petit boitier (sur base de Raspberry Pi) qui contient une caméra USB (Logitech C270), une centrale inertielle MinIMU-9 et une puce GPS.
Mon but est de monter ce boitier sur ma moto afin de récupérer en temps réel les angles/accélérations/positions/vitesses et de les insérer dans la vidéo à postériori. Avant j'utilisais la PiCam, mais sa résolution et sa qualité ne sont pas super dans ce genre de discipline.

Problématique

Afin de synchroniser les données des capteurs et celui de la vidéo, je lance 2 processus. Le premier filme, et partage le numéro de la frame dans un espace d'échange en mémoire partagée. Le second interroge les capteurs et vient chercher le numéro de la frame dans l'espace partagé afin d'enregistrer dans un fichier les données du capteurs et le numéro de la frame correspondante. Ensuite (une fois rentré de la journée de roulage ou de ballade), je lance mon dernier exécutable (OpenCV) qui vient m’incruster les données sur la vidéo.
Quand j'utilisais la PiCam, j'utilisais une version modifiée de l'outil raspivid qui me permettait de faire ce que je voulais. Mais avec ma caméra Logitech C270, je rame un peu à trouver de la doc et des exemples. J'ai regardé du coté du driver UVC, mais je ne parviens pas à trouver de la doc. Ma prochaine piste est donc de regarder comment le logiciel guvcview fonctionne et m'en inspirer pour mon besoin. Mais je préfèrerais trouver de la documentation plutôt que de copier le code d'autres personnes et de passer à coté de quelque chose.

Si vous avez des infos, des idées ou une bibliothèque qui me permettrait de faire ce que je veux…

Merci,

Creuvard

PS: Je code en C

  • # une camera, un logiciel et une syncro temporelle

    Posté par . Évalué à 2.

    pour ne pas prendre une camera ordinaire mise à l'heure, embarqué ton logiciel dans un appareil mis à l'heure aussi.

    tu lances le logiciel, il log avec un timestamp
    tu lances la video (elle a un timestamp par defaut)

    au montage tu joins les deux

    • [^] # Re: une camera, un logiciel et une syncro temporelle

      Posté par . Évalué à 2.

      Le soucis, c'est que il faut que j'ai un timestamp extrêmement précis.

      Au départ, j'avais fait de rapide teste qui consistaient à noter l'heure au démarrage de chaque programme (lecteur capteurs et lancement de la vidéo). Le résultat n'était pas bon, car si la caméra m'est \frac{1}{4} de seconde à se lancer, ça désynchronise tout.
      Du coup lors du rendu à 240 km/h en bout de ligne droite ça affiche que la moto est sur l'angle alors que je suis encore en pleine phase de freinage parce que les capteurs sont en avance par rapport à l'image. Visuellement c'est mauvais.

      Dans l'idéal je filme en 720p/1080p à 25 ou 30 fps. Donc si je veux être 100% synchrone du premier coup et pouvoir lisser mes données avec le filtre de Kalman (via OpenCv), je voudrais être carré.

      Je précise que j'ai essayé depuis OpenCv, mais je ne parviens pas à dépasser les 640x480 en résolution (problème visiblement connu et non réglé dans OpenCv), c'est la raison qui me pousse à chercher ailleurs.

      • [^] # Re: une camera, un logiciel et une syncro temporelle

        Posté par . Évalué à 3. Dernière modification le 17/03/14 à 11:07.

        fait un timestamp heure/minute/secondes/millieme

        en ayant des horloges synchronisées, ca devrait le faire.

        si ta video demarre à 14h31m15s005
        et ton log de capteur demarre à 14h32m10s076
        tu sais que tu n'auras rien pendant le gap du debut, ensuite ce sera synchro.

        • [^] # Re: une camera, un logiciel et une syncro temporelle

          Posté par . Évalué à 1.

          Je vais ré-écrire ce qu'il me semble avoir compris.

          Mise en fonction

          1. Je détecte que l'interrupteur/bouton du boitier qui active le système Caméra&Capteurs est actionné
          2. je fais un timestamp t1
          3. J'active la vidéo (fork(), thread(), execv() …)
          4. Je fais un timestamp t2
          5. J'interroge les capteurs (fork(), thread(), execv() …)

          De retour à la maison

          1. Récupération Vidéo + fichier de données capteurs
          2. affiche les données capteurs par-dessus la vidéo à \Delta T=t2 - t1 millisecondes du début de la vidéo
          3. Loutrage devant la téloche pour débriefer

          Si c'est bien comme ça que tu me conseilles de faire, le problème que j'ai du mal à résoudre, c'est le temps entre l'activation de la vidéo (étape 2 de la mise en fonction) et l'enregistrement effectif de la première frame. Sur les tests que j'ai fait, le raspberry réagit de manière différentes à chaque lancement (des fois j'ai des grosses latence).
          Du coup, on en revient à la même problématique, il me faut une API/DRIVER… qui me permette de détecter l'enregistrement de la première frame.

          • [^] # Re: une camera, un logiciel et une syncro temporelle

            Posté par . Évalué à 3.

            ton raspberry est à leur.
            - ta video dispose deja d'un timecode (timeline)
            - ton loggeur des capteurs doit juste stocker le timestamp de la mesure, à chaque mesure.

            ensuite tu correles le timestamp du logger avec le timecode de la video.

            et si le loggueur met 2 minutes à demarrer, ben tu n'auras pas de data pendant les 2 premieres minutes de videos car timestamp non trouvé dans les datas.

            • [^] # Re: une camera, un logiciel et une syncro temporelle

              Posté par . Évalué à 1.

              Ok, je vais donc regarder de ce coté la.

              Mise en fonction

              Je vais donc lancer une commande de ce genre la:

              mencoder tv:// -tv driver=v4l2:width=1920:height=1080:device=/dev/video0:forceaudio:adevice=/dev/audio -ovc lavc -oac mp3lame -lameopts cbr:br=64:mode=3 -o Roulage_session_1.avi

              puis lancer la boucle d’acquisition et noter le timestamp de chaque acquisition capteur

              A la maison

              Plan A

              Extraire le timestamp de la vidéo je sais pas trop comment si je le fait en ligne de commande (ya une commande magique mplayer ou autre ?)

              Plan B

              Utiliser la propriété CV_CAP_PROP_POS_MSEC de Videocapture pour lancer la synchro en auto.
              Il reste plus qu'a voir la précision du timestamp.

              Je vais tester ça ce soir, je te remercie.
              Si ça fonctionne, ça sera plus simple que ce que j'avais envisagé.

              • [^] # Re: une camera, un logiciel et une syncro temporelle

                Posté par . Évalué à 2.

                As tu envisagé de générer, a postériori, un fichier du type "SRT" (sous titre), pour inserer frame par frame les valeurs de vitesse/angle tu que souhaite incruster ?

                mplayer ou ffmepg peuvent incruster un fichier sous-titre, à la milliseconde près. Là aussi, il y'a un callage a faire pour faire en sorte que la premiere capture des capteurs coincide bien avec la bonne frame capturé.

                • [^] # Re: une camera, un logiciel et une syncro temporelle

                  Posté par . Évalué à 1.

                  Bonjour,

                  oui, j'ai envisagé cette possibilité. Mais je me suis rapidement arrêté.
                  Car dans mon idée, je souhaiterais incruster des jauges pour les angles ou mettre une image de moto qui bouge à gauche/droite en fonction des angles (ou autres bidules du genre). Et comme j'y connais pas grand chose en sous-titre, je suis partie en mode fromscratch bien bourrin.

                  Mais effectivement, ça permettrais de générer différents sous titres (niveau de télémétrie) activable ou non depuis sa télé ou mplayer/vlc.
                  Si tu as des exemples (vimeo, youtube… ) de formats de sous titre ça m’intéresse.
                  Il font bien des barres de défilements pour les karaoké, pourquoi pas des jauges ou des chose un peu mieux chiadées.

                  • [^] # Re: une camera, un logiciel et une syncro temporelle

                    Posté par . Évalué à 3.

                    Bonjour.
                    Il existe plusieurs formats de sous titre, et cela dépend du logiciel que tu utilises pour les incruster. Certains formats ne sont pas comme des sous-titre DVD, pour lesquels tu peux changer de langue en cours de lecture. La plupart des sous titres sont directement incrustés dans la vidéo.

                    Le format SRT est bien documenté, et la précision est de l'ordre de la milliseconde. Par contre, tu ne peux incruster que du texte, et peut etre des symboles (en fonction de la police de caractère), mais pour incruster une jauge ca va être compliqué. Bien que tu puisse simuler une barre de progression avec des série de "::::::". Je crois que tu peux changer la couleur des sous titres par des balises html dans le fichier .SRT.

                    ffmpeg suporte aussi le format ASS, qui est bien plus puissant que SRT (support des images).

  • # ça claque

    Posté par . Évalué à 3.

    Désolé, je n'ai pas les compétences pour t'aider.
    Par contre ton projet correspond exactement à une envie que j'avais de connaitre ces informations l'accélération et l'angle sur un parcours.
    Incrusté dans une vidéo, ça doit vraiment claquer.
    J'espère que tu arrivera à surmonter les difficultés d'implémentation et que tu partagera le résultat.

    • [^] # Re: ça claque

      Posté par . Évalué à 3.

      Salut,

      Si mon projet abouti, je le partagerais sans aucun soucis (Plan boitier, matériel et sources…).

      Je place ci-dessous des liens vers deux photos et une vidéo:

      Proto N°1

      Le boitier seul

      Boitier posé sur une table

      Le boitier monté sur ma brelle (KTM 990 SMR)

      Boitier monté sur la moto

      Vidéo de test - Dans mon bureau

      La vidéo est juste un test d'exploitation du résultat de la mesure d'angle (combinaison de l'accéléromètre & gyroscope). En bas c'est l'angle Gauche/Droite et sur le bord gauche c'est Wheeling/Stoppy ;-)

      Lien vers la vidéo

      Proto N°2

      Bien que le boitier restera identique (à quelques centimètres prés) dans le temps, différentes choses devraient changer. La centrale inertielle notamment qui vibre trop lorsqu'elle est positionnée sur le T de fourche et puis le coté pas pratique qui oblige à démonter le boitier lors d'une pause café (assez encombrant quand même).
      L'idée est de venir positionner le boitier sous la selle afin de se rapprocher du centre de gravité. Cela permet aussi d'imaginer de laisser le dispositif lors des pauses. En revanche cela oblige à avoir un fils entre le boitier et la caméra plus ou moins long en fonction de la position de celle-ci. C'est la raison qui m'a fait choisir une caméra USB. Branchement facile et câble (1m) déjà présent.
      Pour la suite j'image parvenir à synchroniser l'image de ma GoPro avec le système. Les deux caméras devront avoir le même framerate, et essayer de faire la synchronisation via une impulsion lumineuse style stroboscope de téléphone (ou flash photo).

      • [^] # Re: ça claque

        Posté par . Évalué à 2.

        Super, merci d'avoir partagé.
        Il semble que tu n'ai plus de problème de latence entre le vidéo et les mesures capteurs.
        Comment a tu résolu le problème finalement ?

        • [^] # Re: ça claque

          Posté par . Évalué à 1.

          La vidéo c'est mon ancien système avec le coup de la mémoire partagée (n° de la frame) entre processus.

          Le problème c'est que je suis pas fan de la caméra, et je voudrais essayer avec une meilleur caméra.
          Ce week-end je vais me pencher plus longuement sur la question du timestamps, car mes rapides tests de cette semaine ont échoués.

          Le paramètre CV_CAP_PROP_POS_MSEC de OpenCv ne me renvoie pas le timestamp que je veux mais le "_Current position of the video file in milliseconds_" au lieux "_or video capture timestamp_"

  • # solution de capteurs sans fil avec synchronisation de l image

    Posté par . Évalué à 1.

    Bonjour,

    Je travaille dans l entreprise TEA (Technologie Ergonomie Application) qui commercialise les systemes CAPTIV.
    CAPTIV offre des applications dans de nombreux domaines dans lesquels les besoins de mesure et d'observations synchrones a l'image sont essentiels, en labo comme sur le terrain.

    • Le modele CAPTIV L7000 permet l'acquisition synchrone d'images video et de mesures capteurs a partir de SOLUTIONS SANS FIL, il permet la prise en compte d'observations fines, le rapprochement visuel d'une image a un evenement mesure ou observe (pardon pour les accents, j'ai un clavier querti), la generation et l'edition de rapports multimedia, et plus encore… Dans votre cas, vous auriez besoin des capteurs T sens sans fil ACCELEROMETRE, vous pouvez aussi ajouter un inclinometre et l'orientation. Vous posez tout simplement ces capteurs sur votre moto, ils sont relies sans fil a un recepteur sans fil DATALOGGER T LOG (taille d'un petit GPS). Vous filmez un point top synchro sur le datalogger avec votre camera au debut de l'enregistrement et par un procede specifique a TEA, les mesures seront synchro a l'image video. Vous analisez ensuite l'acquisition avec le logiciel CAPTIV qui est tres intuitif (definition de zones cibles par selection graphique ou par equation, statistiques, analyse poussee)…

    Si vous avez deja des capteurs et que vous ne souhaitez pas investir dans des capteurs sans fil, vous pouvez prendre le captiv L2100-M (analyse d'activite par codage video) qui permet d'importer vos mesures capteurs, d'importer votre video et de realiser la synchronisation. Il offre de nombreuses possibilites d'analyse.

    Vous pouvez me contacter a vincent.moreau@teaergo.com ou au 06 47 11 69 67 pour plus de renseignements.

    Je suis a votre disposition.

    Cordialement,

    Vincent MOREAU

Suivre le flux des commentaires

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