|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 57 ![]() |
Bonjour, tout est dans le titre !!
Je souhaiterais charger une par une la séquence d'images intitulées "File001.png", "File002.png", ..... "File00X.png", puis effectuer sur chacune des calculs de comparaison avec une autre image fixe "banque_de_france.png". Je sais charger une image, mais je ne sais pas comment charger une séquence d'images, alors bien sûr avec une boucle comme je l'ai ébauchée dans le code ci-dessous, mais comment dépatouiller le truc?? ![]() Code :
Votre aide de pro de l'informatique me serait fort utile !! |
||
|
|
00
|
|
|
#2 | ||
|
Membre éclairé
![]() Inscription : décembre 2008 Messages : 236 ![]() |
Tu pourrais déjà utiliser l'API C++ d'OpenCV :
Code :
|
||
|
|
20
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 57 ![]() |
merci pour votre aide gracieuse !!
![]() je vais voir tout ça !! j'allume mon neurone ! |
|
|
00
|
|
|
#4 | ||
|
Candidat au titre de Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 57 ![]() |
RE !!!! Malaheureusement ce programme compile, mais l'image ne s'affiche pas !!!
Code :
NB: Voici comment sont stockées mes images: file-00001.jpg file-00002.jpg file-00003.jpg L'emplacement est bon, car j'arrive à charger et à afficher img1 qui se trouve au même endroit !!! IL ne peut donc y avoir que 2 erreurs possibles: - soit votre code est déficient (peu probable étant donné votre talent!) - soit le "nom à numéros " file-0000x n'est pas reconnu. Quel format de nom dois-je donner à mes images? merci !! |
||
|
|
00
|
|
|
#5 |
|
Membre expérimenté
![]() Léo GaspardLycéen Inscription : janvier 2012 Messages : 342 ![]() |
Le nom à numéro est mal reconnu. Tu as oublié un "-" dans ta façon de former le nom de fichier.
En plus, tu n'inclus pas les 0. Bref, les fichiers que tu essaies d'ouvrir actuellement sont file0.jpg, file1.jpg, et file2.jpg . |
|
|
00
|
|
|
#6 |
|
Membre éclairé
![]() Inscription : décembre 2008 Messages : 236 ![]() |
J'ai voulu éditer mon message pour prévenir que le stringstream allait contenir des noms de fichier du type "fileN.jpg" au lieu de "file000N.jpg", j'aurais peut-être dû.
Si c'est gênant, il suffit de formater un peu : Code :
ss << "file-" << setfill('0') << setw(4) << i << ".jpg"; http://www.cplusplus.com/reference/i...ators/setfill/ http://www.cplusplus.com/reference/i...pulators/setw/ PS : Si le reste du programme est codé avec l'API C d'OpenCV (IplImage* au lieu de cv::Mat, typiquement) alors oublie ce que j'ai dit et n'utilise pas cv::Mat ni le reste de l'API C++ ; ce serait plus source de conflits qu'autre chose. |
|
|
00
|
|
|
#7 | ||
|
Candidat au titre de Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 57 ![]() |
Merci pour toutes ces informations !
J'ai toujours une erreur malgré tout, la voici: J'ai simplifier l'appellation des img2[]: file1.jpg file2.jpg file3.jpg Exception non gérée à 0x5093dfc3 dans TestOpenCV.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x0053857d. Code :
Votre aide me serait fort utile...
|
||
|
|
00
|
|
|
#8 | ||
|
Candidat au titre de Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 57 ![]() |
Sinon avec ce code ci-dessous, j'obtiens une image mais elle est totalement bruitée ! Peut être que le stringstream ne fonctionne pas bien...
Code :
|
||
|
|
00
|
|
|
#9 | ||||
![]() ![]() |
Salut,
Il serait peut etre bon que tu comprennes ce que Ekleog t'a fait faire, et pourquoi, car le stringstream n'a strictement rien à voir dans l'histoire Il faut savoir que, lorsque tu travailles avec des valeur de type "fichier" ou ".jpg", ce sera, le plus souvent, considéré comme un const char * ou, pour être précis, comme un pointeur sur une valeur de type char. Or, un pointeur n'est jamais qu'une valeur numérique "classique" dont la seule particularité est de représenter l'adresse mémoire à laquelle on va trouver une donnée du type indiqué. Et donc, lorsque tu écrivais ton code sous la forme de Code :
Tu auras compris que cela ne correspond absolument pas à ce que tu veux faire en réalité Non, ce que tu veux faire, c'est concaténer une chaine avec la représentation sous forme de chaine de caractères d'un valeur numérique et avec une deuxième chaine de caractères!!! Le problème principal, c'est que, en informatique, le caractère '1' ne vaut pas 1 :En effet, le char a cette particularité de représenter deux choses tout à fait différentes : d'une part, un "symbole (éventuellement) affichable", déterminé par sa position dans ce que l'on pourrait appeler une "table de conversion" et d'autre part une valeur numérique "classique" dont la valeur est, comme tout valeur numérique, limitée en fonction du nombre de bits qui permettent de la représenter. Comme le type char est (généralement Et, d'après la table couremment utilisée (la table ASCII), la valeur associée au symbole du chiffre '1' est en réalité 49 (soit 0x31, en hexadécimal). Il faut donc faire en sorte de convertir la valeur numérique que tu utilise comme compteur pour ta boucle en (suite de ) caractère(s) susceptible d'être utilisé(e) pour la concaténation avec une chaine de caractères. Les classes *stringstream sont, justement, des classes dont le but est de permettre la conversion de "n'importe quoi" (par exemple des chaines ou des valeurs numériques) en chaine de caractères et / ou inversement. Ainsi, quand cob écrit le code Code :
Et c'est, justement, ce qu'il nous faut Ce qui est fait de la chaine ainsi obtenue par la suite n'a strictement plus rien à voir avec la fameuse classe stringstream!!!! Elle a rempli son office exactement de la manière que l'on attendait d'elle, le reste va dépendre de la fonction qui va utiliser cette chaine de caractères pour aller charger le fichier correspondant Si donc les fichiers sont "bruités" comme tu sembles le dire, c'est, de toute évidence qu'il y a "un os" au niveau du chargement du fichier!!! Je ne connais pas suffisamment OpenCV pour dire quoi que ce soit, mais j'envisage deux sources potentielles à ce problème:
__________________
en bas de page |
||||
|
|
00
|
|
|
#10 | ||
|
Candidat au titre de Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 57 ![]() |
Merci pour votre aide !!
Le problème ne vient pas de mes images, j'arrive à les charger dans la mesure où j'écris simplement *cvLoadImage("file1.jpg"); Mais cela ne marche plus si j'utilise stringstream: - soit avec le code ascii de "1" = 49 - soit directement en écrivant "1" Code :
|
||
|
|
00
|
|
|
#11 | ||
![]() ![]() |
Attention!!!
Sauf erreur de ma part, cvLoadImage demande sans doute un const char * (une chaine de caractère "C style", or, la fonction str() de la classe stringstream renvoie... une std::string(une chaine de caractères "C++"). si c'est le cas, tu peux récupérer une "chaine C style" au départ d'une std::string grâce à la fonction membre c_str() Le code deviendrait alors proche de Code :
la classe stringstream dispose d'une fonction membre str() qui renvoie une std::string et présente la signature suivante: std::string const stringstream::str() constNous appelons donc la fonction membre c_str() de la classe std::string depuis la std::string que renvoie la fonction str() du stringstream. c_str() est la fonction de std::string qui renvoie une chaine de caractères "C style" et qui présente, quand à elle, la signature suivante: const char* string::c_str() const;
__________________
en bas de page |
||
|
|
00
|
|
|
#12 | ||
|
Candidat au titre de Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 57 ![]() |
Merci bien !!
En effet cela fonctionne ! Voici le code: Code :
|
||
|
|
00
|
|
|
#13 | ||
|
Candidat au titre de Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 57 ![]() |
Il y a, en réalité, une autre manière bien plus noble de charger une séquence d'images, la voici:
Code :
Ce code reconnaît automatiquement les fichiers à (aux) emplacements donné(s) en entrée du programme par l'utilisateur. Il est donc souhaitable de lancer l'application avec la console de l'ordinateur. |
||
|
|
00
|
|
|
#14 | |||
![]() ![]() |
Citation:
Il y aurait beaucoup à dire sur ce morceau de code ![]() D'abord, c'est du pur code C, or, nous sommes dans la section C++... Ensuite, ne t'en déplaise, cette manière de travailler présente un obstacle majeur : L'utilisateur dispose d'une liste de noms bien définis et souhaites, justement générer les noms de fichiers de manière automatique, alors qu'il devrait se "palucher" le fait de les écrire tous à la main avec ta solution (en outre, ce n'est peut etre qu'un détail, mais: que se passe-t-il si l'utilisateur décide de faire charger plus de 579 images, et, dans l'autre sens, tu t'imagine l'utilisateur se palucher l'écriture à la main de 579 noms de fichier (avec leur chemin d'accès, là où seule une partie du nom change de manière clairement définie et reproductible
__________________
en bas de page |
|||
|
|
00
|
|
|
#15 |
|
Membre expérimenté
![]() Léo GaspardLycéen Inscription : janvier 2012 Messages : 342 ![]() |
D'où le commentaire sur les wildcards ...
|
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() Jean-Bernard Inscription : mars 2007 Messages : 817 ![]() |
Bof, la liste des fichiers peut être générée par un petit script dont c'est la tâche. Ca évite de trop se casser la tête en C++ pour faire ça et surtout ça permet de changer facilement le formatage du nom sans avoir à recompiler.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com