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

Traitement d'images Discussion :

CUDA traitement d'image


Sujet :

Traitement d'images

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut CUDA traitement d'image
    Bonjour,

    Je suis étudiant et je travaille sur la mise en place de méthode de traitement d'images parallélisée sur GeForce8800 GT grâce à CUDA.

    Cependant j'ai beaucoup de mal à trouver les renseignements dont j'ai besoin.

    Donc si vous connaissez CUDA pourriez vous m'aider.

  2. #2
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Tu parles du bar ? (le bar à cuda, ok, je suis dehors [-->]).

    Quel est le problème ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut


    Je cherche a implementer la transformée de Hough, donc je voudrait parcourir une image et pour chaque pixel je veut remplir un accumulateur.

    Je me suis basé sur l'exemple Sobel Filter du SDK pour parcourir l'image.

    Puis pour chaque pixel, donc pour chaque thread je lance une boucle qui couvre l'ensemble des angles, cependant quand je lance mon application les résulats rendu par ma methode change a chaque fois donc je ne trouve jamais les memes droite.

    Pour faire simple la methode fait 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     
    //imgOut l'accumulateur
    //imgIn image d'origine
    // nr et nc correspondent a la taille de l'image
     
     
    __global__ void 
    Hough(int* imgOut, unsigned char* imgIn, int nr, int nc, int Pitch,int rmax, int angle_max)
    {	
    	int t = 200;
    	int yc, xc;
    	yc = (int)(nr/2);
    	xc = (int)(nc/2);
    	double rr = 0.0;
    	int ra;
    	double conv = 3.1415926535/180.0;
     
     
    	unsigned char * houghImg= (unsigned char *) (((char *) imgIn)+blockIdx.x*Pitch);
     
     
    	for ( int i = threadIdx.x; i < nc; i += blockDim.x )
    	{
    		if(houghImg[i] >= t)
    		{
    		//si la valeur de l'image (sur laquelle a été effectuée une detection de contour puis une binarisation vaut 1
    			for(int alpha = 0 ; alpha < angle_max ; alpha++)
    			{
    				rr =(yc-blockIdx.x) * sin((double)(alpha*360/angle_max)*conv/2)+(i-xc) * cos((double)(alpha*360/angle_max)*conv/2);
    				if(rr<0.0) 
    				{
    					ra=(int)rr;
    				}
    				else 
    				{
    					ra=(int)rr+1;
    				}
    			        imgOut[alpha+((rmax+ra)*360)]++ ;	
    			}
    		}
    	}
    }
    Et donc une fois cette methode utiliser dans mon main comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //  ih hauteur de l'image
     
    Hough<<<ih, 384>>>(Outdata , odata, ih, iw, iw, rmax, angleMax);
    le resultat obtenu varie a chaque fois que ce lancement est effecuté

    ps:j'espere que tu pourras m'aider

  4. #4
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Il varie comment... Si tu pouvais mettre une image d'exemple, ça peut aider

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Voila le resultat lorsque je lance la recherche de droite deux fois de suite les droite sont totalement différentes

    Je comprend vraiment pas pourquoi.
    Images attachées Images attachées  

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    D'ailleurs j'ai un autre soucis celui ci étant d'ailleur plus mistérieux

    j'effectue le calcul suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rr =(double)(yc-(blockIdx.x))*(double)sinus + (double)(i-xc)*(double)cosinus;
    mais lorsque le calcul s'effectue
    je recupere le resultat et l'ensemble des parametres

    rr = 37480633
    alors que les parametres valent
    yc =256
    blockIdx.x = 331
    sinus = 0.08
    i = 242
    xc = 256
    cosinus = 0.9985

    Et donc la je comprend vraiment plus rien

    au secours

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par AricDestroy Voir le message
    rr = 37480633
    petit problème signed / unsigned ?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    non c pas ca parce que rr est défini comme un double normal donc y a aucune raison c'est juste mistérieux

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par AricDestroy Voir le message
    non c pas ca parce que rr est défini comme un double normal donc y a aucune raison c'est juste mistérieux
    je ne parlais pas de la déclaration mais de l'affichage (tag de printf).

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    En fait je récupere mes valeurs en affectant a des elements donnés de mon accumulateur les valeurs rechercher, et pour faire cela je cast mes valeurs en int.

    Du coup printf("%i ") devrait marcher

  11. #11
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    concernant ta première erreur...
    Combien de tirage aléatoire fais tu pour remplir tes accumulateurs ?
    Etant donné que tu n'as que très peu de points pour trouver les droites, il est nécessaire de faire un maximum de tirages.

  12. #12
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Tu cast comment ? Tu peux nous donner ce bout de code également ?

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    J'ai résolu le probleme de mes variables aux valeurs incohérentes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rr =((double)yc-(double)(blockIdx.x))*(double)sinus + (double)i-(double)xc)*(double)cosinus;
    Il ne voulait pas caster les resultats de yc - blockIdx.x en double il a fallu caster chaque variable pour obtenir un résultats cohérents


    En révanche je n'éffectue pas de tirage aléatoire, je regarde tout mes points et je calcul pour chaque point les coordonnées polaires des différentes droites.
    Le GPU est sensé accélérer le traitement en traitant en parallèle un grand nombre de points.

    Le probleme doit se trouver dans le fait que j'utilise blockIdx.x et i
    comme identifiant respectivement des lignes et des colonnes.
    Et je sais pas si c'est cohérent de voir les choses comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    unsigned char * houghImg= (unsigned char *) (((char *) 
    imgIn)+blockIdx.x*Pitch);
     
     
    	for ( int i = threadIdx.x; i < nc; i += (int)blockDim.x )
    {...}

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    D'ailleurs en augmentant le nombre de point j'obtient ce resultat.

    On peut voir que j'ai lancé trois fois de suite ma fonction et qu'elle trouve trois résultats différents sauf pour deux droite qui sont totalement fausse.

    Pourtant je me suis basé sur du code de transformée de Hough réalisé en séquentiel qui marche très bien.
    Images attachées Images attachées  

  15. #15
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Ton framework Multi-thread, il écraserait pas les variables locales, par hasard ?

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Excuse moi, mais qu'est ce que tu entend par frameWork Multi thread ????

    En tout cas mes variables locales ont l'air d'avoir des valeurs correct


  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Le probleme c'est le résultat final, ce qui m'intéresse surtout c'est de savoir comment on parcours une image et quel sont les variables sur lesquel on peut s'appuyer pour avec acces a la position du pixel en x et en y

    Si vous avez des exemples ca peut m'intéresser

    merci d'avance

  18. #18
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Moi, ce qui m'intéresserait surtout c'est de savoir pourquoi un algo deterministe donne des résultats différents a chaque execution.

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    je me pose la meme question, et justement les seules variables sur lesquelles je n'ai aucun controle sont la position en et celle en y.

    Je considère que id du thread et l'id du block correspondent a ces valeurs cependant si ce n'est pas le cas ça explique peut etre le pourquoi du comment

    J'ai des image 512*512 par exemple pour fixer la taille de la grill et des blocks je me suis appuyé sur un des exemple fourni par le SDK de CUDA 1.1 mais est ce que c'est cohérent je n'en suis pas sur

    Dans l'exemple ils fixent la taille d'un block a 384 sur une image a 512*512 mais j'ai du mal a comprendre pourquoi

    En effet en traitant des image 512*512 je pensais que le nombre de threads devait valoir 512*512 mais ce n'est visiblement pas le cas


    J'ai donc décider de fixer la taille d'un block a 512
    et la taille de la grille a 512 aussi ainsi je considère qu'un block correspond a une ligne mais ca ne fonctionne pas.

    Si quelqu'un peut m'expliquer, ca pourrait être cool

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    SVP

Discussions similaires

  1. Cuda pour le traitement d'image
    Par victor.racine dans le forum Images
    Réponses: 3
    Dernier message: 02/04/2010, 13h48
  2. Traitement d'images : quel langage?
    Par belasri dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 07/10/2005, 10h59
  3. commande c++ pour le traitement d'images
    Par mateo.14 dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2005, 11h46
  4. [lib] Traitement d'images
    Par Gogoye dans le forum Multimédia
    Réponses: 4
    Dernier message: 19/11/2004, 17h15
  5. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 17h42

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