IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques, systèmes et outils C Discussion :

Prendre une "photo" de /dev/video0 en C


Sujet :

Bibliothèques, systèmes et outils C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 2
    Par défaut Prendre une "photo" de /dev/video0 en C
    Bonsoir,

    J’essaie de prendre une photo avec ma webcam sous Unix (debian 64bit) en C.

    Avec cheese, ou n'importe quel logiciel j'y arrive, mais je souhaite le faire en C (ou C++)
    Il faut donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *buf[76800]; // camera resolution 320x240
    int fd = open("/dev/video0" , O_RDONLY);
    int num= read(fd, buf, 76800);
    l'open me retourne un bon fd.
    le read me retourne -1. (error 22:[Invalid argument])

    J'aimerai tenter de le faire sans API, juste avec open, read et j'ai crue voir sur d'autre forum qu'il fallait utilisé ioctl.


    Merci beaucoup de votre aide.
    Cordialement.

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *buf[76800]; // camera resolution 320x240
    Cette ligne déclare 76800 POINTEURS vers des chars, ce qui n'est surement pas ce que tu voulais faire.
    Tu voulais plutôt dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char buf[76800]; // camera resolution 320x240
    A noter que 76800 correspond à la taille d'une image 320x240 en 8 bits par pixels, ce qui n'est pas forcément le format que read() va te retourner par défaut.
    Tu dois utiliser ioctl() avec le sélecteur VIDIOC_S_FMT pour imposer un format.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 2
    Par défaut
    Pour le char *buf[76800]; je m'étais tromper en recopiant mon code T_T
    je l'ai fait en cpp en utilisant une std::pair<void *, size_t>*;

    sinon merci pour la piste, j'ai réussi, avec : (dans l'ordre)
    VIDIOC_QUERYCAP
    VIDIOC_CROPCAP
    VIDIOC_S_CROP
    VIDIOC_S_FMT
    VIDIOC_REQBUFS
    VIDIOC_QUERYBUF
    VIDIOC_QBUF
    VIDIOC_STREAMON
    VIDIOC_DQBUF
    VIDIOC_QBUF
    VIDIOC_STREAMOFF
    se qui me donne une joli image en yuv422 avec mmap.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/04/2005, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo