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

OpenCV Discussion :

Conversion YUV vers RGB


Sujet :

OpenCV

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Conversion YUV vers RGB
    Bonjour,
    J'essaye actuellement de récupéré le flus rtsp de ma camera IP, j'utilise donc vlc-qt pour récupéré mes frames jusque la aucun problème.
    Seulement je n'arrive pas a convertir mes frames YUV en RGB a l'aide d'openCV, j'opère la conversion de cette façons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cv::Mat mat({frame->width, frame->height}, CV_YUV2BGR, frame->frameBuffer.data(), cv::Mat::AUTO_STEP);
    Ensuite si j'essaye d'affiché le flux j'obtient
    Nom : Capture d’écran 2016-10-03 à 09.48.06.png
Affichages : 987
Taille : 254,8 Ko
    Si j'essaye de sauvegardé une frame en fichier jpeg j'obtient l'assertion suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenCV Error: error: (-215) Assertion failed (image.channels() == 1 || image.channels() == 3 || image.channels() == 4) in imwrite_
    PS: image.channels() me retourne 11.
    Merci d'avance de votre aide.

  2. #2
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Je vais posé une question conne, mais es-tu sur que ton format de sortie est YUV? d'après la doc que tu as mis c'est du mjpeg, donc la sortie ne serait pas en YUV non?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Merci d'avoir répondu,
    J'utilise la class VlcVideoStream de vlc-qt et d'après la doc
    VlcVideoStream sets proper callbacks to get YUV frames from libVLC. This class should be subclassed and implement frameUpdated to specify what to do with the frame.
    je suppose que je reçois bien du YUV ? Est il possible de vérifié cela avec vlc directement ?
    Vlc me sort:
    Nom : Capture d’écran 2016-10-03 à 10.35.33.png
Affichages : 916
Taille : 42,9 Ko

    Rien avoir mais on peut redimensionné les image attaché directement sur developpez.com ?

  4. #4
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Effectviement il semble que VLC te balance du fluix yuv, mais pourquoi passer par vlc? Pourquoi tu ne lis pas directement le flux sortant de ta caméra et que tu l'affiche dans Qt? Si j'ai bien compris, ta caméra te donne un stream en http, il te suffirait de le lire et de l'afficher dans un renderer non? .

    Ensuite si tu veux réellement convertir, il vaut mieux utiliser ffmpeg par exemple. Opencv, je ne suis pas sur que ça soit vraiment adapté pour la vidéo :/.
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  5. #5
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    J'utilise vlc pour lire mon flux rtsp et opencv pour incrusté différent textes dynamiques et enregistré le flux dans un fichier, j'utilise vlc pour la facilité mais il est vrais que je peut me pencher sur ffmpeg,
    pour le flux http j'ai différentes cameras qui fournissent toute un flux rtsp (et pas forcement un http) donc je préfère passé par le rtsp.

  6. #6
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    De ce que j'ai vu sur internet, ffmpeg permet de lire un flux rtsp et donc de pouvoir le stocker, ensuite tu peux utiliser opencv pour incruster ton texte et enregistrer le flux sortant. Je pense que ça sera plus adapté que vlc pour ce que tu veux faire. Sinon essaye de voir du coté de vlc si il n'y a pas des exemple de ce que tu veux faire .

    Perso j'ai pas trouvé grand chose, et j'ai pas l'impression que vlc-qt dispose de beaucoup de ressource sur internet pour la manipulation des flux, mais plutôt pour l'affichage directe dans qt :/.

    EDIT:
    D'après ton screenshot c'est bien du mjpeg (MPEG-4 comme me l'a fait remarqué dragonjoker59) qui sort, donc ffmpeg me semble tout indiqué. Ensuite si tu as plusieurs type de flux à gérer, vlc semble le mieux car il permet de tout mettre au même format. Il faudrait regarder pour la matrice de conversion ce qu'elle te donne et comparer avec l'article wiki sur le YUV pour voir si la matrice est la même. De ce que j'ai vu, il y a plusieurs manière d’encoder le YUV, donc peut-etre que ton paramètre indiquant le type de flux n'est pas le bon .

    EDIT2:
    En relisant ton code, tu utilise CV_YUV2BGR, ça ne serait pas CV_YUV2RGB que tu voudrais?
    Essaye aussi avec l'enum CV_YUV2RGB_I420 ou CV_YUV420p2RGB, ça correspondrait peut-etre plus à ton encodage que le simple enum .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  7. #7
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    En relisant ton code, tu utilise CV_YUV2BGR, ça ne serait pas CV_YUV2RGB que tu voudrais?
    Essaye aussi avec l'enum CV_YUV2RGB_I420 ou CV_YUV420p2RGB, ça correspondrait peut-etre plus à ton encodage que le simple enum
    J'ai essayé toute les valeurs de l'enum (CV_YUV2BGR_XXX et CV_YUV2RGB_XXX) cela donne exactement le même résultat.

    D'après ton screenshot c'est bien du mjpeg qui sort, donc ffmpeg me semble tout indiqué. Ensuite si tu as plusieurs type de flux à gérer, vlc semble le mieux car il permet de tout mettre au même format. Il faudrait regarder pour la matrice de conversion ce qu'elle te donne et comparer avec l'article wiki sur le YUV pour voir si la matrice est la même. De ce que j'ai vu, il y a plusieurs manière d’encoder le YUV, donc peut-etre que ton paramètre indiquant le type de flux n'est pas le bon
    La camera est configuré pour sortir du h264, je pense que je vais voir du coté de ffmpeg et voir si je peut convertir directement du coté de ffmpeg si ce n'est pas concluant j'essayerais d'utilisé l'option Transcode de vlc.

  8. #8
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Sinon essaye d'enregistrer le flux sortant de ta camera dans un fichier mjpeg. Le flux sortant de vlc dans un yuv et compare les deux en le lisant avec vlc player, tu pourras déjà voir si vlc arrive à se lire lui même. J'ai cru voir des bugs sur opencv concernant la conversion yuv->rgb, mais j'ai pas creusé pour voir si ils étaient corriger.

    Néanmoins, ça te donne pas mal de piste à découvrir déjà . Tiens nous au courant .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  9. #9
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Citation Envoyé par skeud Voir le message
    D'après ton screenshot c'est bien du mjpeg qui sort, donc ffmpeg me semble tout indiqué. Ensuite si tu as plusieurs type de flux à gérer, vlc semble le mieux car il permet de tout mettre au même format. Il faudrait regarder pour la matrice de conversion ce qu'elle te donne et comparer avec l'article wiki sur le YUV pour voir si la matrice est la même. De ce que j'ai vu, il y a plusieurs manière d’encoder le YUV, donc peut-etre que ton paramètre indiquant le type de flux n'est pas le bon .
    Le MPEG-4 n'est pas du MJPEG hein, là le format est du H264, et on utilise généralement du YUV420 pour stocker les frames avant encodage.
    Il faut donc bien voir si CV_YUV2[RGB/BGR] est bien ce dont tu as besoin, CV_YUV420p2RGB me semble plus approprié.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  10. #10
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Le MPEG-4 n'est pas du MJPEG hein, là le format est du H264, et on utilise généralement du YUV420 pour stocker les frames avant encodage.
    Il faut donc bien voir si CV_YUV2[RGB/BGR] est bien ce dont tu as besoin, CV_YUV420p2RGB me semble plus approprié.
    J'ai essayé CV_YUV420p2[RGB/BGR] et le problème reste le même.

    PS: tes tutoriels sur opengl sont géniaux

  11. #11
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    C'est une image en niveaux de gris, ou en couleurs?
    A la vue de ton résultat, on dirait une image en niveaux de gris, du coup, il est possible qu'elle ne soit pas stockée en YUV et que la tentative de décompression donne ce résultat.
    En tout cas, si c'était du MJPEG tu n'aurais pas cet output, je pense, mais un beau plantage lors de la tentative d'affichage.

    EDIT:

    Mes tutoriels ne sont que des traductions, mais je trouve les originaux géniaux.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  12. #12
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    C'est une image en niveaux de gris, ou en couleurs?
    A la vue de ton résultat, on dirait une image en niveaux de gris, du coup, il est possible qu'elle ne soit pas stockée en YUV et que la tentative de décompression donne ce résultat.
    En tout cas, si c'était du MJPEG tu n'aurais pas cet output, je pense, mais un beau plantage lors de la tentative d'affichage.

    EDIT:

    Mes tutoriels ne sont que des traductions, mais je trouve les originaux géniaux.
    C'est une vidéo couleur que VLC et vlc-qt (mais pas ffplay ) affiche sans problème lorsque que je ne touche pas aux frames.
    Le fait que le flux est en NTSC peut t'il joué ?

  13. #13
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Je sais pas si cela peut aidé mais ffmpeg me sort:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ffmpeg -i rtsp://192.168.1.106:554/main
    [rtsp @ 0x7f8408003400] Could not find codec parameters for stream 0 (Video: h264, none): unspecified size
    Consider increasing the value for the 'analyzeduration' and 'probesize' options
    Input #0, rtsp, from 'rtsp://192.168.1.106:554/main':
      Metadata:
        title           : Media Presentation
      Duration: N/A, bitrate: N/A
        Stream #0:0: Video: h264, none, 90k tbr, 90k tbn, 180k tbc
        Stream #0:1: Data: none
    EDIT
    Bon mes tests avec ffmpeg ne sont pas vraiment concluant
    voici mon code d'essai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    const auto stream_path = "rtsp://192.168.1.106/main";
     
    av_register_all();
    avformat_network_init();
     
    AVFormatContext* formatContext = avformat_alloc_context();
    AVDictionary *opts = nullptr;
    av_dict_set(&opts, "rtsp_transport", "udp", 0);
     
    if (!avformat_open_input(&formatContext, stream_path, nullptr, &opts))
    	return -1;
     
    if (avformat_find_stream_info(formatContext, nullptr) < 0)
    	return -1;
    et la je tombe dans une boucle infinie dans avformat_find_stream_info

Discussions similaires

  1. Conversion Grayscale vers RGB
    Par imenham dans le forum Images
    Réponses: 2
    Dernier message: 08/07/2015, 20h20
  2. Méthodologie Conversion HLS vers RGB
    Par Daikyo dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 22/11/2009, 20h57
  3. Conversion ColorIndex vers RGB
    Par coco21 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/08/2007, 10h02
  4. YUV vers RGB et vice-versa
    Par progfou dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 22/09/2006, 01h41
  5. Conversion yuv vers rgb en hardware
    Par pifpanfpouf dans le forum DirectX
    Réponses: 1
    Dernier message: 20/03/2006, 14h00

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