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 :

cvKMean2 : erreur de paramètres


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Par défaut cvKMean2 : erreur de paramètres
    Salut,
    je suis actuellement en train d'essayer la fonction cvKMean2(...) mais je me heurte à de nombreux problèmes au niveau des paramètres...
    Je ne sais pas comment utiliser cette fonction et comment lui spécifier les paramètres (quelles sont les bonnes dimension, profondeur,...). Si quelqu'un a déja utilisé cette fonction pourrait-il me donner un petit coup de main, merci.

    Voila comment j'essai de l'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IplImage* samples; //j'utilise une image chargé pour les échantillons.
    // Faut-il qu'il plutot utilisé un CvMat? Quelle format doit-il avoir ?
    CvMat* clusters = cvCreateMat(nbCluster,1,CV_32SC1); // faut-il absolument le format CV_32SC1 ? 
    // ou d'autres sont-ils acceptables ? quelle profondeur pour quelle résultat ?
    cvKMeans2(samples,nbCluster,clusters,cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,maxIter[nbCluster],1.0));
    merci de votre aide...

  2. #2
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut
    est ce que ce code te donne une idée ?
    ( http://www.cs.indiana.edu/cgi-pub/ol...te/OpenCVHelp/ )

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #include "cxcore.h"
    #include "highgui.h"
     
    void main( int argc, char** argv )
    {
        #define MAX_CLUSTERS 5
        CvScalar color_tab[MAX_CLUSTERS];
        IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
        CvRNG rng = cvRNG(0xffffffff);
     
        color_tab[0] = CV_RGB(255,0,0);
        color_tab[1] = CV_RGB(0,255,0);
        color_tab[2] = CV_RGB(100,100,255);
        color_tab[3] = CV_RGB(255,0,255);
        color_tab[4] = CV_RGB(255,255,0);
     
        cvNamedWindow( "clusters", 1 );
     
        for(;;)
        {
            int k, cluster_count = cvRandInt(&rng)%MAX_CLUSTERS + 1;
            int i, sample_count = cvRandInt(&rng)%1000 + 1;
            CvMat* points = cvCreateMat( sample_count, 1, CV_32FC2 );
            CvMat* clusters = cvCreateMat( sample_count, 1, CV_32SC1 );
     
            /* generate random sample from multigaussian distribution */
            for( k = 0; k < cluster_count; k++ )
            {
                CvPoint center;
                CvMat point_chunk;
                center.x = cvRandInt(&rng)%img->width;
                center.y = cvRandInt(&rng)%img->height;
                cvGetRows( points, &point_chunk, k*sample_count/cluster_count,
                           k == cluster_count - 1 ? sample_count : (k+1)*sample_count/cluster_count );
                cvRandArr( &rng, &point_chunk, CV_RAND_NORMAL,
                           cvScalar(center.x,center.y,0,0),
                           cvScalar(img->width/6, img->height/6,0,0) );
            }
     
            /* shuffle samples */
            for( i = 0; i < sample_count/2; i++ )
            {
                CvPoint2D32f* pt1 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;
                CvPoint2D32f* pt2 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;
                CvPoint2D32f temp;
                CV_SWAP( *pt1, *pt2, temp );
            }
     
            cvKMeans2( points, cluster_count, clusters,
                       cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 ));
     
            cvZero( img );
     
            for( i = 0; i < sample_count; i++ )
            {
                CvPoint2D32f pt = ((CvPoint2D32f*)points->data.fl)[i];
                int cluster_idx = clusters->data.i[i];
                cvCircle( img, cvPointFrom32f(pt), 2, color_tab[cluster_idx], CV_FILLED );
            }
     
            cvReleaseMat( &points );
            cvReleaseMat( &clusters );
     
            cvShowImage( "clusters", img );
     
            int key = cvWaitKey(0);
            if( key == 27 ) // 'ESC'
                break;
        }
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Par défaut
    ben en fait c'est le code de l'aide de OpenCV, je l'ai regardé mais il n'explique pas malheureusement toutes les subtilités
    Il font un exemple pour quelque chose de simple mais quand on souhaite appliquer ca à une image ca devient compliqué.
    C'est pourquoi il me faudrait l'aide de quelqu'un qui a déjà utilisé cette fonction ?
    Mais je crois que ca va être dur à trouver...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Par défaut Réponse trouvée je crois
    voila je crois que après une journée dessus j'ai enfin trouvé, voila mon code pour une image en RVB (j'ai utilisé un wrapper C++ pour les accès aux images "W") :

    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
    44
    45
    46
    47
     
    cvNamedWindow("test acp");
    IplImage* srcCopy = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);
    cvCopyImage(src,srcCopy);
    CvMat* samples = cvCreateMat(nbElem,1,CV_32FC3);
    CvMat* clusters = cvCreateMat(nbElem,1,CV_32SC1);
    for(int k=0,j=0; j<msk->height; j++) {
    	for(int i=0; i<msk->width; i++) {
    		if(mskW[j][i]!=0) {
    			cvSet1D(samples,k,cvScalar(srcW[j][i].r,srcW[j][i].g,srcW[j][i].b));
    			k++;
    		}
    	}
    }
     
    cvSetZero(clusters);
    cvCopyImage(src,srcCopy);
    // Affichage avant
    cvShowImage("test acp",srcCopy);
    cvWaitKey();	
     
    // lancement du calcul du Kmean
    cvKMeans2(samples,2,clusters,cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,3,1.0));
     
    // Cas où séparation en 2 Clusters
    if(nbCluster==2) {
    	for(int k=0,j=0; j<msk->height; j++) {
    		for(int i=0; i<msk->width; i++) {
    			if(mskW[j][i]!=NOIR) {
    				CvScalar tmp = cvGet1D(clusters,k);
    				if(tmp.val[0]==0) {
    					srcCopyW[j][i].r = 255;
    					srcCopyW[j][i].g = 0;
    					srcCopyW[j][i].b = 0;
    				} else {
    					srcCopyW[j][i].r = 0;
    					srcCopyW[j][i].g = 255;
    					srcCopyW[j][i].b = 0;
    				}
    				k++;
    			}
    		}
    	}
    }
    // Affichage après
    cvShowImage("test acp",srcCopy);
    cvWaitKey();
    voila je pense que j'ai rien oublié

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

Discussions similaires

  1. Erreur de paramètre dans mon formulaire
    Par cdevl32 dans le forum Langage
    Réponses: 10
    Dernier message: 25/08/2009, 10h13
  2. Erreur sur paramètre const
    Par uriotcea dans le forum C++
    Réponses: 2
    Dernier message: 09/07/2009, 08h49
  3. ERREUR fonctions paramétrées
    Par basic83 dans le forum Débuter
    Réponses: 0
    Dernier message: 07/04/2008, 19h27
  4. Message d'erreur avec paramètre
    Par sir_gcc dans le forum JSF
    Réponses: 1
    Dernier message: 09/05/2007, 18h20
  5. Erreur de paramètre avec SQL sur Delphi
    Par ghan77 dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/01/2006, 13h30

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