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

MATLAB Discussion :

Entrer une structure comme argument de fonction


Sujet :

MATLAB

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2014
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2014
    Messages : 109
    Par défaut Entrer une structure comme argument de fonction
    Bonjour à tous !

    Le titre du sujet annonce assez clairement le problème que je rencontre.

    Contexte:
    J'ai réaliser des acquisition d'images. Pour chaque acquisition, j'enregistre entre 300 et 2000 images avec certains paramètres qui sont sauvegardées dans des dossiers différent. Le nom des images entre les dossiers n'est pas forcément homogène car il dépend du nombre d'images par seconde que j'ai utilisé pour l'acquisition. Je dois donc analyser plus de 15000 images.

    Mon répertoire à l'architecture suivante :
    dossier 1(contient 300 images --> 305 objets au total)
    dossier 2(contient 2000 images --> 2005 objets au total)
    dossier 3(contient 2000 images --> 2005 objets au total)
    ...

    Mon programme:
    Pour faire l'analyse de façon automatique j'ai basé la détection des objet contenu dans un répertoire avec la fonction dir. Mon code rassemble les instructions suivantes :
    1) Détections du nombre de dossier d'acquisition
    2) Réarrangement de l'ordre si nécessaire
    3) Je rentre dans chaque dossier d'acquisition
    4) je détecte le nombre d'objet
    5) Traitement du bruit et de l'intensité I0
    6)Je nettoie la liste de fichier en enlever les fichiers qui ne sont pas concernés par l'analyse
    7) Je trie la nouvelle avec une fonction (c'est ici que réside mon problème)
    8) Analyse des images

    Voilà le programme :
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
     
    %% Traitement des films de fluorescence Winsor 3
     
    clc
     
    %% Variables
    % Repertoire courant
    currentdir=pwd;
    % Repertoires
    data_dir='adresse repertoire1';
    dir_save='adresse repertoire2';
    eval(['cd ' data_dir])
    % Rapport de hauteur
    H1_s_H2=0.4;
    H1=275E-6;
    H2=1E-3-H1;
    % Frame rate
    fps=10;
    % Taille des images
    ImgX=576;
    ImgY=768;
    % Correction sur les images
    Cx=10;
    Cy=10;
    % Intensite (A) et puissance (mW)
    I=[1.1:0.1:1.3 1.35 1.4:0.1:2];
    P1=@(I)27.0238.*I.^2-19.6548.*I-8.54286; 
    P2=@(I)46.9185*I-42.6106;
    idx1=I<=1.6;
    idx2=I>1.6;
    P=[P1(I(idx1==1)) P2(I(idx2==1))];
    Pabs=P.*(1-exp(-beta*H1));
    % Echelle x2.5
    echelle=1000/303.346;
    % Calibration temperature
    T=@(x)-110*x.^3+258.3878*x.^2-239.1738.*x+112.6787;
    % Definition de la variable data_name
    A=dir;
    idx=zeros(1,length(A));
    for i=1:length(A)
        temp=A(i).name;
        temp2=length(temp)<9;
        idx(i)=idx(i)+temp2;
    end
    A=A(idx==0);
    dir_name=cell(1,length(A));
    for i=1:length(A)
        dir_name{i}=A(i).name;
    end
    disp(dir_name)
    str0=input('L''ordre est-il correct ?\n','s');
    if strcmp(str0,'non')
        str1=input('Premier index :');
        temp=dir_name{str1};
        str2=input('Second index :');
        dir_name{str1}=dir_name{str2};
        dir_name{str2}=temp;
        disp(dir_name)
        str0=input('L''ordre est-il correct ?\n','s');
        while strcmp(str0,'non')
            str1=input('Premier index :');
            temp=dir_name{str1};
            str2=input('Second index :');
            dir_name{str1}=dir_name{str2};
            dir_name{str2}=temp;
            disp(dir_name)
            str0=input('L''ordre est-il correct ?\n','s');
        end
    end
    % Stocakge des parametres
    parametres.H1_s_H2=H1_s_H2;
    parametres.Pabs=Pabs;
    parametres.echelle=echelle;
    parametres.T=T;
    %% Chargement des images et traitement ligne par ligne
    for i=1:length(dir_name)
        %% Acces au repertoire d'analyse
        eval(['cd ' dir_name{i}])
        disp(dir_name{i})
        %% Detection du nombre d'objet à analyser
        A=dir;
        idx=zeros(1,length(A));
        for j=1:length(A)
            temp=A(j).name;
            temp2=length(temp)<9;
            idx(j)=idx(j)+temp2;
        end
        A=A(idx==0);
        %% Definition de la cellule sauvegarde
        cell_save=cell(8,length(A));
        %% Stockage de data_num
        cell_save{1,i}=dir_name{i};
        %% Extraction du fichier data.mat de la liste
        idx=zeros(1,length(A));
        for j=1:length(A)
            temp=A(j).name;
            temp2=strcmp(temp,'data.mat');
            idx(j)=idx(j)+temp2;
        end
        A=A(find(idx==0));
        %% Bruit
        % Moyenne du bruit
        idx=zeros(1,length(A));
        for j=1:length(A)
           temp=A(j).name;
           temp2=strcmp(temp(1),'b');
           idx(j)=idx(j)+temp2;
        end
        B=A(idx==1);
        if length(B)>1
            bruit=cell(1,length(B));
            for j=1:length(B)
                temp=imread(B(j).name);
                bruit{j}=temp(Cx:end,Cy:end);
            end
            if mod(length(bruit),2)==0
                [L,C]=size(bruit{1});
                temp=uint8(zeros(L,C));
                for j=2:2:length(bruit)
                    temp=imadd(temp,imadd(bruit{j},bruit{j-1}));
                end
            else
                [L,C]=size(bruit{1});
                temp=uint8(zeros(L,C));
                for j=2:2:(length(bruit)-1)
                    temp=imadd(temp,imadd(bruit{j},bruit{j-1}));
                end
                temp=imadd(temp,bruit{end});
            end
            B_mean=temp./length(bruit);
        else
            bruit=B;
            B_mean=imread(B.name);
            B_mean=B_mean(Cx:end,Cy:end);
        end
        % Extraction du bruit de la liste de fichier
        A=A((length(bruit)+1):end);
        disp('Nettoyage de la liste de fichier terminer')
        % Stockage du bruit moyen
        cell_save{2,i}=B_mean;
        %% Definition de I0
        % I0= moyenne de l'image 1 a x fps
        if length(B)==1
            temp=A(1).name;
            I0=imread(temp);
        else
            temp=uint8(zeros(length(Cx:ImgX),length(Cy:ImgY)));
            for j=2:fps
                temp=imadd(temp,imadd(A(j).name,A(j-1).name));
            end
            I0=temp/fps;
        end
        % Stockage du I0 moyen
        cell_save{3,i}=I0;
        %% Triage de la liste de fichier
        A=triage(struct(A),fps);
        disp('Triage de la liste effectué')
        %% Traitement des images (bruit & I0)
        disp('Début du traitement')
        % Traitement
        A_traite=cell(1,length(A));
        for j=1:length(A)
            A_traite{j}=imsubtract(A(j).name,B_mean)/imsubtract(I0,B_mean);
        end
        % Stockage
        cell_save{4,i}=A_traite;
        %% Calcul de la temperature ligne par ligne
        % Calcul
        T_img=cell(ImgX,1);
        for j=1:ImgX
            for k=1:ImgY
                T_img{j,1}=T(A_traite(j,k));
            end
        end
        % Stockage de la temperature
        cell_save{5,i}=T_img;
        disp('Temperature calculée')
        %% Analyse de la temperature
        %%% Conversion de r en micron
        R_micron={ImgX,1};
        for j=1:length(R_micron)
            temp=1:ImgY;
            R_micron{j,1}=temp*echelle;
        end
        % Stockage
        cell_save{6,1}=R_micron;
        %%% Maximum ligne par ligne
        % Determination de Tmax
        T_max_ligne=cell(ImgX,1);
        for j=1:length(T_img)
            T_max_ligne{j,1}=max(T_img{j,1});
        end
        % Stockage
        cell_save{7,i}=T_max_ligne;
        %%% Position de Tmax en micron
        r_Tmax_micron=cell(length(ImgX,1));
        for j=1:length(r_Tmax_micron)
            temp=cell2mat(R_micron(j,1));
            idx=T_img{j,1}==T_max_ligne{j,1};
            r_Tmax_micron{j,1}=temp(idx);
        end
        disp('Analyse de la liste en cour terminée')
        %% Retour au repertoire parent
        eval('cd ..')
    end
    %% Sauvegarde
    resultats.parametres=parametres;
    resultats.cell_save=cell_save;
    eval(['cd ' dir_save])
    save('20160217','resultats')
    disp('Données sauvegardées')
    disp('Traitement des images terminé')
    Lorsque j'exécute le programme j'ai l'erreur suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error in Etude_dynamique_film_fluorescence_rhb (line 157)
        A=triage(A,fps);
    Voilà la fonction triage :
    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
     
    %% Fonction de triage de donnees
    function liste_triee=triage(liste,fps)
     
    if nargin <2
        fps=1;
    end
    if fps>25
        fps=25;
    end
    %% Selection des fichiers a ordonne
    temp=strcmp(liste(3).name,'Thumbs.db');
    if temp==1
        liste=liste(4:end);
    else
        liste=liste(3:end);
    end
    % Bruit
    % idx=zeros(1,length(liste));
    % for j=1:length(liste)
    %     temp=liste(j).name;
    %     temp2=strcmp(temp(1),'b');
    %     idx(j)=idx(j)+temp2;
    % end
    % liste=liste((max(find(idx==1))+1):end);
    %% Triage
    if fps==1
        temp2=zeros(length(liste),1);
        for i=1:length(liste)
            temp=liste(i).name;
            index=find(temp=='_');
            index2=find(temp=='.');
            temp2(i,1)=temp2(i,1)+str2double(temp(index+1:index2-1));
        end
        temp2=temp2';
        [S,I]=sort(temp2);
        temp3=liste(I);
    else
        temp2=zeros(length(liste),1);
        for i=1:length(liste)
            temp=liste(i).name;
            index=find(temp=='_');
            temp2(i,1)=temp2(i,1)+str2double(temp(index(1)+1:index(2)-1));
        end
        temp2=temp2';
        [S,I]=sort(temp2);
        temp3=liste(I);
        temp2=zeros(length(liste),1);
        for i=1:length(liste)
            temp=temp3(i).name;
            index=find(temp=='_');
            index2=find(temp=='.');
            temp2(i,1)=temp2(i,1)+str2double(temp(index(2)+1:index2-1));
        end
        temp2=temp2';
        ind=1;
        while ind<=length(temp3)
            [S,I]=sort(temp2(ind:(ind+(fps-1))));
            B=temp3(ind:(ind+(fps-1)));
            temp3(ind:(ind+(fps-1)))=B(I);
            ind=ind+fps;
        end
    end
    %% Liste de sortie
    liste_triee=temp3;
    end
    J'ai cherché un peu et visiblement il existe une fonction struct. Cependant je ne suis pas convaincu que cette fonction puisse m'aider à résoudre mon problème. Sinon la solution est d'intégré le code de la fonction de le programme principale. Mais bon j'aimerai résoudre cette erreur, pour me coucher mon bête.

    Et puis si jamais vous avez des suggestions pour diminuer le temps d’exécution de mon programme, je suis preneur.

    Je vous remercie d'avance pour votre aide.

    Beltharion

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Il nous faut le message d'erreur complet pour pouvoir t'aider efficacement.

    Sinon, pas besoin de eval pour changer de dossier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cd(fullfile(currentdir, data_dir))
    Tu n'es même pas obligé d'utiliser cd puisque tu peux faire directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A = dir(fullfile(currentdir, data_dir));

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2014
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2014
    Messages : 109
    Par défaut
    Il nous faut le message d'erreur complet pour pouvoir t'aider efficacement.
    Autant pour moi, voilà le message d'erreur complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Undefined function 'triage' for input arguments of type 'struct'.
     
    Error in Etude_dynamique_film_fluorescence_rhb (line 157)
        A=triage(A,fps);
    Merci pour les astuces

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    C'est sans aucun doute parce que MATLAB ne trouve pas la fonction à cause des changements de dossier avec cd dans le code.

    Ajoute le dossier contenant triage.m aux chemins connus de MATLAB avec addpath.
    Ou n'utilise plus cd comme je te l'ai proposé précédemment.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2014
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2014
    Messages : 109
    Par défaut
    C'est effectivement un problème de path. Je suis un peu aigri d'être passé à côté...

    Merci pour ton aide et pour les astuces !

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

Discussions similaires

  1. mettre une structure comme argument d'une fonction
    Par lahyouness dans le forum C++
    Réponses: 2
    Dernier message: 25/11/2014, 16h08
  2. Passer une class comme argument de fonction
    Par Pelote2012 dans le forum Développement Web avec .NET
    Réponses: 2
    Dernier message: 07/08/2014, 12h03
  3. Passage d'une structure en argument de fonction
    Par DDaviDD dans le forum Débuter
    Réponses: 2
    Dernier message: 19/05/2014, 07h26
  4. Utiliser une structure comme argument d'une fonction
    Par guilermo dans le forum Débuter
    Réponses: 7
    Dernier message: 15/10/2009, 10h05

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