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 cvMat vers unsigned char


Sujet :

OpenCV

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut Conversion de cvMat vers unsigned char
    bonjour à tous

    je suis un peu nouvelle sur opencv

    j'ai acheté une petite caméra icube (camera usb2) qui permet un trigger externe.

    Mais je dois coder la chose pour créer mon fichier vidéo à partir des données envoyées par le SDK accompagnant la caméra.

    Cette SDK propose la possibilité de coder une fonction callback lorsque les données de l'image sont lues.

    la fonction est signée comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyCallbackFunc(BYTE * pBuffer, long lBufferSize,PVOID pContext )
    étant BYTE défini dans le windef.h comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef unsigned char       BYTE;
    Donc j'aimerais savoir comment je dois faire pour convertir cette chaine pointée par ce pointeur char, vers le type cv::Mat afin d'enregistrer les données vers un fichier .avi à l'aide d'OpenCV

    j'espère que je suis claire dans ma question et que je trouverai des gens avec plus d'expérience que moi avec cette belle biblio!!!

    merci à tous !!!

    je viens de trouver un example de quelque chose qui fonctionnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void process_video_frame(const unsigned char* pixels,
                             int width, int height, int step)
    {
        cv::Mat img(height, width, CV_8UC3, pixels, step);
       }
    est-ce comme cela que je peux faire la conversion?

    merci bien à tous

  2. #2
    Membre régulier Avatar de GabrielD
    Homme Profil pro
    ingénieur de recherche
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur de recherche

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 88
    Points
    88
    Par défaut
    à priori ça devrait marcher d'après la doc.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    merci beaucoup de ton aide, je vais regarder tout ça!!!


  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    Salut
    je reviens vers toi car lorsque je fais la conversion et que j'affiche l'image obtenue j'obtiens une image toute grise.

    je fais ceci :
    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
     
    long CALLBACK MyCallbackFunc(BYTE * pBuffer, long lBufferSize,PVOID pContext )
    {
     
    	// NOUVEAU PROCESSUS
    	// utilisation de OpenCV pour traiter l'image
    	if(bGrabCallback==true)
    	{
    		cv::Mat imavi(480, 752, CV_8UC3, pBuffer);
     
    		// on affiche l'image
    		bGrabCallback=false;
    		cv::namedWindow("titi");
    		cv::imshow("titi",imavi);
    	}
    	return 42;
    }
    BYTE est un unsigned char

    Je pense que la conversion ne se passe pas bien et je ne sais pas comment faire

    si tu pouvais m'aider ou quelqu'un d'autre merci

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    Citation Envoyé par Garra Voir le message
    Salut
    je reviens vers toi car lorsque je fais la conversion et que j'affiche l'image obtenue j'obtiens une image toute grise.

    je fais ceci :
    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
     
    long CALLBACK MyCallbackFunc(BYTE * pBuffer, long lBufferSize,PVOID pContext )
    {
     
    	// NOUVEAU PROCESSUS
    	// utilisation de OpenCV pour traiter l'image
    	if(bGrabCallback==true)
    	{
    		cv::Mat imavi(480, 752, CV_8UC3, pBuffer);
     
    		// on affiche l'image
    		bGrabCallback=false;
    		cv::namedWindow("titi");
    		cv::imshow("titi",imavi);
    	}
    	return 42;
    }
    BYTE est un unsigned char
    et d'après ce que je lis dans la doc la data passé par la fonction callback est : Color- camera: 24bit/Pixel (RGB24 Data)

    Je pense que la conversion ne se passe pas bien et je ne sais pas comment faire

    si tu pouvais m'aider ou quelqu'un d'autre merci

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    Re-salut

    en fait je viens de me rendre compte de ceci, lorsque je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    cv::Mat mat = cv::Mat(480, 752, CV_8UC3, (void*) pBuffer); 
     
    cv::imwrite("titi.bmp", mat);
     
    // on affiche l'image
    cv::namedWindow("titi");
    cv::imshow("titi",mat);
    L'image titi.bmp est bien créée avec l'image reçue de la vidéo alors qu'à l'écran avec namedWindow et imshow j'ai une fenêtre toute grise!!

    Je suis déjà contente d'obtenir un .bmp mais j'aimerais comprendre

    merci de ton aide

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Quand tu veux utiliser les fonctions OpenCV pour les fenêtres, il te faut une boucle infinie avec un cv::waitKey dedans pour actualiser tout le coté GUI.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    Bonjour et merci

    tu as raison, je me suis rendue compte après que j'étais sur une fonction callback donc "infinie".
    Donc c'est pour cela que je ne voyais pas mon image qui était pourtant bien recupérée!!

    je te remercie encore et à tous ceux qui ont eu l'amabilité de repondre

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    salut

    je reviens à toi car j'ai un truc bizarre:

    j'ai ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (!g_writer.open(g_fichier_avi,CV_FOURCC('M','P','4','2'),18,cv::Size(752,480),true)) {
    Lorsque je lance en mode Debug tout marche nickel, mon fichier .avi est bien enregistré

    Par contre lorsque je lance en mode Release donc pointant vers les .dll d'Opencv pour le release, ça plante sur la ligne en rouge du mallloc.c

    je comprends bien qu'il s'agit d'un problème mémoire mais quoi??


    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
    void * __cdecl _malloc_base (size_t size)
    {
        void *res = NULL;
    
        //  validate size
        if (size <= _HEAP_MAXREQ) {
            for (;;) {
    
                //  allocate memory block
                res = _heap_alloc(size);
    
                //  if successful allocation, return pointer to memory
                //  if new handling turned off altogether, return NULL
    
                if (res != NULL)
                {
                    break;
                }
                if (_newmode == 0)
                {
                    errno = ENOMEM;
                    break;
                }
    
                //  call installed new handler
                if (!_callnewh(size))
                    break;


    Pour plus de précision le problème se trouve sur la dll opencv_highgui220.lib:
    car si je compile avec ceci (c'est à dire avec la version debug de la dll, opencv_highgui220d.lib), ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    opencv_core220.lib
    opencv_highgui220d.lib
    opencv_imgproc220.lib
    opencv_features2d220.lib
    est-ce que quelqu'un peut me dire pourquoi et qu'est-ce qui me manque?

    merci de tout aide qui pourrait m'aider à comprendre le problème

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    en fait je reviens car il s'agit d'un probleme de codec car en mode release le codec n'est pas trouvé...

    bizz

Discussions similaires

  1. Problème de conversion de QString en unsigned char
    Par fgtuio dans le forum Débuter
    Réponses: 2
    Dernier message: 07/07/2012, 01h00
  2. [ODBC] Conversion de SQLWCHAR * vers char *
    Par Abdelkaoui dans le forum C
    Réponses: 7
    Dernier message: 23/02/2008, 12h23
  3. pb conversion unsigned char vers char *
    Par FamiDoo dans le forum C
    Réponses: 11
    Dernier message: 24/08/2006, 18h11
  4. [Clé de registre] Conversion char* vers unsigned char*
    Par The Lord of Nesquik dans le forum C
    Réponses: 7
    Dernier message: 03/07/2006, 23h30
  5. vector<unsigned char> et unsigned char* : conversion ?
    Par zax-tfh dans le forum SL & STL
    Réponses: 5
    Dernier message: 15/01/2006, 10h43

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