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

C Discussion :

Je ne retrouve pas mon image !


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 79
    Points : 24
    Points
    24
    Par défaut Je ne retrouve pas mon image !
    Bonjour à tous. J'utilise une carte matrox Pulsar sur laquelle est reliée une camera Sony. Des fonctions de programmation en c et c++ sont fournies avec la carte afin de pouvoir la piloter. Actuellement, j'acquiert une image (576*768, sur 256 niveaux de gris ), et je la sauvegarde. Seulement, je souhaiterais effectuer un traitement sur cette image avant de l'enregistrer. Voilà pour la cadre. Rentrons maintenant dans le détail :

    Pour acquérir une image, je dois réservé un espace mémoire grâce à une fonction de la carte ('MBufAlloc()') qui me renvoie l'adresse du tampon (nommé MilImage). Ce que je souhaiterais faire, c'est parcourir l'ensemble des (576*768) octets à partir de &Milimage et leur affecter une valeur (entre 0 et 255). Ensuite, il existe une fonction ('MBufsave()') qui permet directement de sauvegarder l'image du tampon dans un fichier .raw.

    Voici mon problème : lorsque je parcours les octets à partir de &MilImage, le PC interrompt le traitement à cause d'une violation d'accès à l'adresse '....'. Or j'effectue une simple boucle du genre :

    unsigned char *px;

    px = &Milimage + 0x138e; (pour passer l'entete)
    for(i=0;i<10000;i++)
    {
    *px = 255; //Par exemple
    px++;
    }

    Même dans ce cas où je ne lis que 10000 éléments, le pc plante (il ne plante pas avec 1000 par contre). Or, on est bien loin des 576*768 !
    A vrai dire, lorsque je parcours en boucle infinie, le PC s'arrete au bout du 60665ème octet.

    Quelqu'un a-t-il une idée de la raison pour laquelle mon prog ne marche pas ?

    Merci pour votre aide.

    Benjamin

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    px = &Milimage + 0x138e; (pour passer l'entete)
    D'après ton texte, Milimage est un pointeur, donc il faudrait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    px = Milimage + 0x138e; (pour passer l'entete)
    Jc

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 79
    Points : 24
    Points
    24
    Par défaut
    Je tente, je vous dis ça tout de suite...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 79
    Points : 24
    Points
    24
    Par défaut
    J'ai tenu compte de votre remarque, mais ça ne marche pas. Mais j'ai oublié de vous préciser quelque chose. MilImage est déclaré en tant que MIL_ID (propre à matrox donc). MilImage est en fait un 'Buffer Identifier' qui contient la valeur '0x1b' soit '27' une fois que le Buffer est réservé. Dans la fonction MBufAlloc(), on spécifie en argument le pointeur du buffer soit &MilImage.

    C'est d'ailleurs un mystère pour moi, ils sont forts chez matrox : On déclare MilImage, sans lui affecter de valeur, ensuite on le passe en argument dans une fonction, et le voilà, avec une valeur et une adresse. Magique non ?

    Bref, je ne sais pas où est ma zone mémoire. Une idée ?

    A mon avis, mon problème vient du fait que je lis les octets à partir de l'adresse de l'identifiant (MilImage), et le Buffer proprement idt doit être ailleurs.... Mais où ?!

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu n'as pas une fonction du genre MBufLock() ou MButDeref() ? Enfin, un nom de ce style pour récupérer l'adresse effective des données...

    Ou bien, une fonction qui te permet de récupérer le contenu dans un buffer personnel...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par BenjaminLustrement
    Bref, je ne sais pas où est ma zone mémoire. Une idée ?
    Ben je pense que ta zone mémoire se trouve sur ta carte graphique et n'est accessible que par le processeur graphique.
    Donc si tu veux accéder à cette mémoire il faut forcément passer par leur driver. Il existe certainement un driver permettant de copier une zone graphique dans la mémoire "centrale" et inversement.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  7. #7
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par BenjaminLustrement
    Même dans ce cas où je ne lis que 10000 éléments, le pc plante (il ne plante pas avec 1000 par contre). Or, on est bien loin des 576*768 !
    A vrai dire, lorsque je parcours en boucle infinie, le PC s'arrete au bout du 60665ème octet.
    Esce que ce que tu as est coerant?
    Corespond a l'image? (une partie)
    Prenez le temps d'aller vite...

    Programme sous Windows, en C avec Code::Blocks, en Java JRE 1.6. avec Eclipse, en PHP/HTML/CSS avec Dreamweaver CS5 ou NotePad++ et en VBA sous avec Access 2010, Excel 2010, Word 2010 et Outlook 2010.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 79
    Points : 24
    Points
    24
    Par défaut
    Ok ! C'est bon. J'ai trouvé ma solution en écrivant mon dernier message, et en effet, ça correspond à ce que vous dites. Il existe une fonction MBufGet() qui permet de récupérer l'ensemble du tampon et de le mettre dans un tableau qu'on a défini. J'ai donc fait un malloc pour avoir une zone mémoire de la taille nécéssaire, et ça marche nickel. Pour info, il existe bien sur la fonction inverse, qui permet de remplir le tampon à partir d'un tableau.

    Je pense aussi que la zone ram est sur la CG.

    Merci à vous tous !!!

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Bonjour, j'avais le meme probleme que toi et j'avais vu cette fonction MbufGet mais j'arrive toujours pas a acceder a mes pixels. Pourtant je pense que mon malloc est ok ... Dites moi ce que vous en pensez :
    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
     
    char* MyImage=NULL;
     
    //Memory allocation
    MyImage=(long*)malloc(width*height*sizeof(long));
    if(MyImage==NULL) exit(1);
     
    //Transform MIL_ID type to long*
    MbufGet(Source,&MyImage);
     
    MyImage[20+width*2]=255; // Modification of 1 pixel.
     
    //Transform long* to MIL_ID type
    MbufPut(ResultImage,&MyImage);
     
    free(MyImage);
    J'ai essayer de remplacer mon tableau de long par un tableau de char, ca n'a rien change.

    P.S.: Je suis desole pour le fait qu'il n'y ai pas d'accent mais je suis sur un clavier japonais et j'ai aucune idee de la facon dont on les fait.

    EDIT: ca venait de l'allocation fallait faire sizeof(long*), mais en fait c'est peut etre plus unsigned char parcque ca fait des choses bizarre avec long.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Transform MIL_ID type to long*
    MbufGet(Source,MyImage);
    MyImage est un pointeur tu n'as pas a mettre le & devant son nom est son adresse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(*MyImage==NULL) exit(1);
    Si tu veux tester le contenu de ton pointeur sur ta zone allouée dynamiquement je pense qu'il faut mettre une étoile devant parce que là tu testes si l'adresse de ton pointeur pointe sur NULL.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par WindSpirit Voir le message
    [CODE]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(*MyImage==NULL) exit(1);
    Si tu veux tester le contenu de ton pointeur sur ta zone allouée dynamiquement je pense qu'il faut mettre une étoile devant parce que là tu testes si l'adresse de ton pointeur pointe sur NULL.
    Oui, mais comme elle est initialisé à NULL et que le malloc est censé renvoyé l'adresse de l'endroit alloué, si c'est toujours NULL c'est qu'il ne c'est rien passé. Non ?

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

Discussions similaires

  1. je ne retrouve pas mon controle dans mon GroupBox
    Par jeandadaf dans le forum VB.NET
    Réponses: 4
    Dernier message: 08/11/2009, 11h38
  2. j'vois pas mon image !
    Par Laskar dans le forum Débuter
    Réponses: 3
    Dernier message: 27/09/2009, 06h20
  3. [NEWBIE]Je ne retrouve pas mon disque externe
    Par grinder59 dans le forum Administration système
    Réponses: 4
    Dernier message: 05/09/2007, 16h41
  4. Réponses: 1
    Dernier message: 10/01/2007, 23h37
  5. Je ne retrouve pas mon fichier de sauvegarde!!
    Par arasium dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2006, 14h05

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