lire une image pgm

lire une image pgm - C++ - Programmation

Marsh Posté le 13-06-2003 à 21:02:58    

Salut tout le monde, j'ai besoin d'un p'tit coup de pouce.
Je cherche à écrire un source qui lit une image pgm (format : 240 col x 640 lign, 255 niv de gris) et écris chaque pixel dans un tableau de la même taille. Le tableau contient alors 240 x 640 octets.
Qqn pourrait-il m'aider svp ??
 
Celui qui me permet de me décoincer de mon problème, je lui raconte la blague des deux mouches...
 
Merci.
 

Reply

Marsh Posté le 13-06-2003 à 21:02:58   

Reply

Marsh Posté le 13-06-2003 à 21:55:21    

Sinon google est pas down ??? hmm
le pgm c trivial surout en format ascii alors bon ...
bouge ton luc :P

Reply

Marsh Posté le 13-06-2003 à 21:55:30    

une petite recherche avec google permet de trouver des trucs épatants : 'read pgm image format'
=> http://dmsun4.bath.ac.uk/resource/pgm.htm

Reply

Marsh Posté le 13-06-2003 à 21:58:18    

keske je disais :D

Reply

Marsh Posté le 14-06-2003 à 03:44:40    

Mais c'est grandiose !! Merci... :pt1cable:

Reply

Marsh Posté le 14-06-2003 à 09:26:52    

c'est de la merde ce code!! d'habitude les mecs font du pseudo C++ avec des FILE*, la y a des fstream et qeu du scanf/strcmp
 
si je m'ecoutais, je vous démolirais chaque ligne de ce code
 
 
edit: j'attends de toi de tout réécrire en pur C ou en pur C++


Message édité par Taz le 14-06-2003 à 09:28:55
Reply

Marsh Posté le 14-06-2003 à 10:52:37    

++Taz a écrit :


 
edit: j'attends de toi de tout réécrire en pur C ou en pur C++


 
Toi, tu dois être prof dans la vie ?  :lol:


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 14-06-2003 à 13:27:55    

Tetragrammaton IHVH a écrit :


 
Toi, tu dois être prof dans la vie ?  :lol:  

non grincheux

Reply

Marsh Posté le 14-06-2003 à 13:53:30    

Si ++Taz était pas là j'aurais posté le code que j'utilise...mias là il risque de me taper... [:ddr555]

Reply

Marsh Posté le 14-06-2003 à 13:58:13    

au point ou en est  :whistle:

Reply

Marsh Posté le 14-06-2003 à 13:58:13   

Reply

Marsh Posté le 14-06-2003 à 14:02:27    

++Taz a écrit :

au point ou en est  :whistle:  


J'ai regardé, en fait je l'ai même pas chez moi... [:skeye]

Reply

Marsh Posté le 14-06-2003 à 14:08:02    

[:samduloft]
 
 
edit: sutout qu'en bon C++, le code est tres tres concis. si j'ai le temps, je traduit bien le code de ton lien (file moi un lien vers une image teste)


Message édité par Taz le 14-06-2003 à 14:12:30
Reply

Marsh Posté le 14-06-2003 à 14:22:29    

la lib de notre prof pour les tp d'images de maitrise info
j'ai pas la doc mais c'est compréhensible
 
http://iksv.net/.limace

Reply

Marsh Posté le 14-06-2003 à 14:23:46    

Une image 126*131 exportée en pgm (par Paint Shop)
http://perso.numericable.fr/~raimopau/macoch.pgm
(cochon corse)

Reply

Marsh Posté le 14-06-2003 à 14:47:11    

sans doute pété de bugs, aucune vérification d'erreur, ça vaut ce que ça vaut
 

Code :
  1. #include <iostream>
  2. #include <sstream>
  3. #include <fstream>
  4. #include <string>
  5. #include <algorithm>
  6. #include <iterator>
  7. #include <vector>
  8. #include <stdexcept>
  9. using namespace std;
  10. struct PGMImage
  11. {
  12.   unsigned width;
  13.   unsigned height;
  14.   unsigned maxvalue;
  15.   unsigned char *pt;
  16.   class BadFile
  17.     : public exception
  18.   {};
  19.   ~PGMImage()
  20.   {
  21.     delete[] pt;
  22.   }
  23.   PGMImage(const char * name)
  24.     : width(0),
  25.       height(0),
  26.       maxvalue(0),
  27.       pt(0)
  28.   {
  29.     ifstream file(name, ios::binary);
  30.     if(file.fail())
  31.       {
  32. throw BadFile();
  33.       }
  34.     string line;
  35.     // 1ere ligne
  36.     getline(file, line);
  37.     bool binary = true;
  38.     if(line=="P5" )
  39.       {
  40. binary=true;
  41.       }
  42.     else if(line=="P2" )
  43.       {
  44. binary=false;
  45.       }
  46.     else
  47.       {
  48. throw BadFile();
  49.       }
  50.     // on saut le commentaire eventuel
  51.     getline(file, line);
  52.     if(line[0]=='#')
  53.       {
  54. getline(file, line);
  55.       }
  56.     // on obtient les dimensions
  57.     istringstream is(line);
  58.     is >> this->width >> this->height;
  59.     // la valeur max
  60.     file >> this->maxvalue;
  61.     // on lis les données
  62.     this->pt=new unsigned char [this->width*this->height];
  63.     if (binary)
  64.       {
  65. //We need to read a binary PGM file
  66. file.read(reinterpret_cast<char *>(this->pt), this->width * this->height);
  67.       }
  68.     else
  69.       {
  70. //We need to read in an ASCII file   
  71. copy(istream_iterator<unsigned>(file),
  72.      istream_iterator<unsigned>(),
  73.      this->pt);
  74.       }
  75.   }
  76. };
  77. int main()
  78. {
  79.   PGMImage i("macoch.pgm" );
  80.   cout << i.width << ' ' << i.height << ' ' << i.maxvalue << "\n\n\n";
  81.   cout.write(reinterpret_cast<char *>(i.pt), i.width * i.height);
  82. }

si tant est que ça marche


Message édité par Taz le 14-06-2003 à 14:47:32
Reply

Marsh Posté le 14-06-2003 à 15:00:34    

Faudra que je pense à regarde ce code de plus près... :)

Reply

Marsh Posté le 14-06-2003 à 15:06:45    

skeye a écrit :

Faudra que je pense à regarde ce code de plus près... :)  

à le vérifier (chez moi ça à l'air de fonctionner, mais je m'avance pas) et à la compléter aussi

Reply

Marsh Posté le 14-06-2003 à 15:12:34    

Bon, merci pour toutes vos réponses...
 
Une petite précision : le source doit être écrit en C pur (pas de C++) et doit être super concis, lecture des données uniquement (pas de traitement de l'entête), pas besoin de détecter la taille de l'image (on la connaît c'est 640 x 240), donc en fait, il me faudrait un source qui fasse ça uniquement (pas de fioritures...). Le prog doit s'éxecuter le plus vite possible (sert en fait à l'asservissement d'une table robotique 2D). Une fois l'image stockée dans un tableau, je dois lui faire subir qques opérations, le tout en moins de 16 ms...
 
J'suis pas vraiment une brute en C (vous l'aurez constaté), donc merci encore pour vos coups de pouce...

Reply

Marsh Posté le 14-06-2003 à 15:14:43    

t'es chaint bordel, c'est la dernireè fois qu'on me prendra ç ecrire un truc!!!!!!!!!!!!    [:klemix]    [:klemix]    [:klemix]

Reply

Marsh Posté le 14-06-2003 à 15:20:28    

En fait, je vais crrément vous expliquer le but du prog que je dois écrire, histoire de récupérer les bonnes idées éventuelles...
 
Voilà, il s'agit d'asservir une table robotique 2D à l'aide d'un traitement d'image. La table n'a pas de capteurs de position, c'est une caméra extérieure (qui film une image solidaire à la table) qui fait office de capteur.
 
L'image représente deux lignes (d'épaisseur inconnue) qui se coupent en un point dont on veut détecter la position. Le ligne se coupent à angle droit plus ou moins 10 degrés.
Je voudrais que le prog en C récupère les coordonnées du point d'intersection.
Idée : Traiter l'image avecune convolution par un filtre de Sobel, la seuiller et régression linéaire sur les points obtenus. On obtiendrait alors deux équations de droites dont le point d'intersection se trouve facilement...
 
Voilà, mais le hic, c'est que ces belles phrases ne me font pas du tout avancer puisque je n'ai aucune idée de la manière de coder ce bordel...
 
Je suis preneur pour toute suggestion...  :hello:  

Reply

Marsh Posté le 14-06-2003 à 15:21:43    

1) mets toi au boulot
2/ sinon voir 1

Reply

Marsh Posté le 14-06-2003 à 15:30:25    

GustyFotz a écrit :

En fait, je vais crrément vous expliquer le but du prog que je dois écrire, histoire de récupérer les bonnes idées éventuelles...
 
Voilà, il s'agit d'asservir une table robotique 2D à l'aide d'un traitement d'image. La table n'a pas de capteurs de position, c'est une caméra extérieure (qui film une image solidaire à la table) qui fait office de capteur.
 
L'image représente deux lignes (d'épaisseur inconnue) qui se coupent en un point dont on veut détecter la position. Le ligne se coupent à angle droit plus ou moins 10 degrés.
Je voudrais que le prog en C récupère les coordonnées du point d'intersection.
Idée : Traiter l'image avecune convolution par un filtre de Sobel, la seuiller et régression linéaire sur les points obtenus. On obtiendrait alors deux équations de droites dont le point d'intersection se trouve facilement...
 
Voilà, mais le hic, c'est que ces belles phrases ne me font pas du tout avancer puisque je n'ai aucune idée de la manière de coder ce bordel...
 
Je suis preneur pour toute suggestion...  :hello:  
 


Commence par tes entrées/sorties de pgm, c'est simple...
Après il y a bcp de docs sur le net sur sobel, le seuillage, etc...à-partir d'une image discrète...

Reply

Marsh Posté le 14-06-2003 à 17:57:02    

Le filtre de Sobel NxN c'etsune bete matrice carré correspondant à la derivée seconde d'une image discréte. Le seuillage c'est un bete test  :
Si pixel(x,y) < Seuil alors Pixel(x,y) = 0 sinon = 255.
 
Ensuite pour determiner tes points d'intersections je te conseille la Transformée de Hough plutôt que la reg linéaire ...
Cette transformée pass du repére x,y a celui r,theta. Puis tu decompte le spoints de meme r et theta.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed