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 de rtype (cv::Mat.depth()) impossible


Sujet :

OpenCV

  1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut Conversion de rtype (cv::Mat.depth()) impossible
    Salut les OpenCV,

    j'ai d'abords développer une petite library d'effets divers, avec pour les test une grosse vingtaine d'images de tout types concernant la nature de l'image: paysages, portraits, groupes de personnes, dessins 3D ou 2D, etc... soit photos ou image, couleurs (avec canal alpha ou non) ou gris
    dans la plupart des formats supportés par OpenCV ( *.bmp, *.jpeg, *.jpg et *.png).

    Avec un bon fichiers main.cpp incluant la library graphique de débogage highgui permettant de tester mes effets et ajustements de tout types.

    J'ai même compiler la library en library statique.

    Et du coup j'ai commencer a développer la GUI, et là un gros hic... !!! ???

    J'ai ajouter de nouveau fichiers de tests (images) et le drame je tombe sur fichier qui me résiste: il est encoder en 16-bit (non-signé).

    Et j'arrive pas a le convertir en U8 ou du mois la conversion réussis mais quand ont affiche l'image après il ne correspond pas a l'image de départ.
    l'image est la suivante:

    Nom : 48-bits_1.png
Affichages : 230
Taille : 821,8 Ko

    L'image est de type:
    PNG image data, 640 x 480, 16-bit/color RGB, non-interlaced
    Sois si je ne convertis pas en U8 et met quand même a 8 la valeurs depth dans la GUI, j'obtiens un affichage de l'image vraiment strier et pas ressemblant du tout.

    Sinon si j'essaie de convertir l'image en U8 soit avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    frame.convertTo(frame, CV_8U) ;
    // ou alors:
    frame.assignTo(frame, CV_8U) ;
    Et bien j'obtiens un mauvais affichage partiel de l'image:

    juste le milieux bas de l'image: ce qui correspond au rebord au bas du socle (le triangle là ou c'est plus le bleu foncé) sur lequel repose le vase en bleu uniforme (b=255).

    Au lieu du motif et de la couleur créer par l'ombre du vase et du socle.

    J'ai tout essayer de convertir en U8 avant ou après la conversion en RGB,
    en passant par une Mat temporaire
    (car il y a des opérateurs dans OpenCV qui ne peuvent travailler inline (src et dst la même Mat.) ),
    ou en assignant la conversion a une Mat temporaire qui est pré-configuré en CV_8U
    ou alors de prendre en compte le nombre de canaux lors de la conversion c.a.d CV_8UC3
    et j'ai même penser que il y avait un canal alpha caché, vue a quoi ressemble l'image et vue sont encodage, c'est peut-être possible.

    Rien a faire pour obtenir l'image original en passant par une conversion quelqu'onque.

    J'arrive juste a afficher correctement l'image en passant par le main.cpp de test de ma library donc par highgui sans conversion,

    ce qui ne me convient pas pour l'affichage avec GTK+3, avec la technique que j'utilise c.a.d en passant par un GdkPixbuf...

    Car il faut que j'obtienne une image RGB(A) avec 8 de depth (CV_8U) pour pouvoir l'afficher de cette manière.

    Je m'en remet donc a vous et vous serai grandement reconnaissant si vous désirez bien me fournir une solution au problème car j'ai épuisé les miennes.

    Merci pour vos réponses éclairés et bon code CV a vous.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  2. #2
    Membre régulier
    Homme Profil pro
    Computer Vision engineer
    Inscrit en
    Mars 2012
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Computer Vision engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 65
    Points : 86
    Points
    86
    Par défaut
    Essaie de rajouter un facteur d'échelle de 1/256 et de rajouter une autre Mat pour la copie, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cv::Mat a = cv::imread("path");  // 16U img
    cv::Mat b(a.size(), CV_8U) ; // 8U img
    a.convertTo(b,CV_8U,1.0/256);
    Pour moi ça marche!

  3. #3
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut Merci je l'avait penser mais autrement.
    Merci beaucoup d'avoir résolu le problème, car ta solution fonctionne parfaitement.

    J'avais penser a ce type de solution d'ajouter un facteur et | ou une addition dans les paramètres de ConvertTo() ,

    seulement je n'ai pas penser au fameux saturate_cast()<> de OpenCV donc je ne savais pas quel valeur(s) mettre,

    étant donnée que l'image est un 16bits unsigned car ton facteur fonctionnera sûrement avec une image encodé en float CV_32F aussi je pense vue la nature du 1.0/256.

    Qu'en pense tu ?

    Car je n'ai pas d'images encoder par défaut sur CV_32F sure mon disque dur et j'ai bien fait le tour de mon dossier image récursivement.

    Et je n'en trouve pas sur le net.

    Pour finir j'arrive a avoir un affichage correct en tentant de convertir une CV_8U en CV_32F (simplement pour en avoir une rapidement la de suite).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    frame = cv::imread(argv[1], cv::IMREAD_UNCHANGED) ;
    cv::Mat b(frame.size(), CV_32F) ;
    frame.convertTo(b, CV_32F, 1.0/256 ) ;
    Mais il y a une erreur lors de la tentative de sauvegarde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cv::imwrite("./test01.png", b) ;
    Par contre comme ceux-ci ca n'affiche pas correctement mais sauvegarde correctement.
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <opencv2/opencv.hpp>
     
    int main (int argc, char *argv[]) {
     
      if (argc != 2) {
     
        fprintf(stdout,"usage %s filename\n",argv[0]) ;
        return 1 ;
      } 
     
      cv::Mat frame ;
     
      frame = cv::imread(argv[1], cv::IMREAD_UNCHANGED) ;
     
      cv::Mat b(frame.size(), CV_32F) ;
     
      frame.convertTo(b, CV_32F ) ;
     
      cv::namedWindow("MyWin") ;
     
      fprintf(stdout, "img channels: %d depth: %d\n", b.channels(), b.depth() ) ;
     
      while (true) {
     
        char keycode = cv::waitKey(1) ;
     
        if ( keycode != -1) {
          fprintf(stdout,"Keycode: %d\n",keycode) ; 
          break ;
        }  
     
        imshow("MyWin", b) ;
     }
     
     cv::imwrite("./test01.png", b) ;
     
     return 0 ;
     
    }
    Donc je me suis tromper au-dessus il faut géré les CV_32F autrement:
    Mais je suppose que une image encoder en plus 16bits est peu commune sauf imagerie spécialisée horsmise...

    Merci beaucoup encore d'avoir solutionner le problème.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  4. #4
    Membre régulier
    Homme Profil pro
    Computer Vision engineer
    Inscrit en
    Mars 2012
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Computer Vision engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 65
    Points : 86
    Points
    86
    Par défaut
    Quand tu dis qu'il y a une erreur de sauvegarde..tu veux dire quoi au juste?

  5. #5
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Et bien simplement que ça donne une image toute noire au lieux celle-ci:

    Nom : 13966403114103367.png
Affichages : 164
Taille : 50,3 Ko
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  6. #6
    Membre régulier
    Homme Profil pro
    Computer Vision engineer
    Inscrit en
    Mars 2012
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Computer Vision engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 65
    Points : 86
    Points
    86
    Par défaut
    T'as une fenêtre blanche qui s'affiche ? c'est très normal, l'affichage ne supporte pas les floats!

  7. #7
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    OK et encore merci d'avoir résolu le problème.

    En espérant qu'il ne se balade pas trop d'images encoder en CV_32F dans les ordinateurs et le net...
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

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

Discussions similaires

  1. Conversion d'un fichier.mat à un fichier.dat
    Par arbas dans le forum MATLAB
    Réponses: 3
    Dernier message: 30/03/2012, 12h21
  2. Conversion impossible pixel en cm ???
    Par kgb1917 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 19/12/2008, 10h53
  3. [A-03] Conversion mdb vers mde impossible
    Par bigounet dans le forum Access
    Réponses: 4
    Dernier message: 01/11/2008, 23h09
  4. Conversion mat-file en .bin
    Par StitchP dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/04/2007, 16h39
  5. Réponses: 8
    Dernier message: 18/07/2006, 13h29

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