[Matlab]Importare file .json tramite ciclo for

di il
4 risposte

[Matlab]Importare file .json tramite ciclo for

Ciao a tutti, mi presento sono Davide, studio ing Meccanica e sono alle prese con un problema derivante dall'acquisizione ed elaborazione di alcuni dati provenienti da un software di motion capture. Purtroppo sono alle prime armi con Matlab ed ho una grande serie di problemi
In sintesi dal software OpenPose tiro fuori dei file .json che mi restituiscono in workspace una 'struc' con all'interno delle sottomatrici che devo estrarre per poi analizzare i dati. Ho creato uno script con ciclo for il quale mi dovrebbe permettere di automatizzare il tutto poichè si tratta di un file j.son per frame acquisito e quindi una grande mole di dati da analizzare.
La mia domanda è come faccio ad automatizzare il tutto per permettermi di importare e decodificare i json in modo sequenziale e ottenere in workspace il salvataggio di ogni matrice estratta? Vi ringrazio anticipatamente.Di seguito lo script creato:

clc
clear all
files = dir('*.json');%crea struct con percorso e nome dei file *.json
for i=1:length(files)
eval(['importdata ' files(i).name]);%importa i file contenuti nella struct files.name
l=char(files.name)%restituisce un array di caratteri con i nomi dei file
m=string(l)%restituisce un vettore stringa con i nomi dei file

for n=1:length(m)
val=jsondecode (fileread(m(n))) %decodifica i file json creando una struct tramite il vettore stringa
orig = val.people.pose_keypoints_2d;% estrae la sottomatrice con i punti
a= reshape(orig,[3 25]);%riordina la matrice con i punti precedentemente estratti
end
end

4 Risposte

  • Re: [Matlab]Importare file .json tramite ciclo for

    La domanda non è chiara.
    Qual è il problema specifico?

    Prima scrivi:

    Ho creato uno script con ciclo for il quale mi dovrebbe permettere di automatizzare il tutto

    poi chiedi:

    La mia domanda è come faccio ad automatizzare il tutto per permettermi di importare e decodificare i json

    Quindi:
    [*] il codice che hai scritto funziona correttamente?
    [*] in caos contrario, qual è il problema?

    Hai provato ad eseguire il codice in modalità debug?

    A parte l'uso della funzione "eval" che è caldamente sconsigliato, cosa viene importato nel Workspace con l'esecuzione dell'istruzione "eval(['importdata ' files(i).name]);"?

    L'istruzione "val=jsondecode (fileread(m(n)))" legge correttamente il file?

    Stando al codice che hai pubblicato, sembra che tu riesca a leggere i dati nel ciclo for interno visto che poi li riordini (a= reshape(orig,[3 25]);).

    Quindi: qual è il problema?
  • Re: [Matlab]Importare file .json tramite ciclo for

    Ciao, grazie per la risposta, ed hai ragione dato che non sono stato chiaro. Rispondo ad ogni tua domanda

    Non ho eseguito il codice in modalità debug dato che non la conosco.

    L'istruzione "eval(['importdata ' files(i).name]); estrapola una colona della 'struct' "files" nella qualche sono presenti i nomi dei file *.json contenuti nella cartella di lavoro [video1,video2,video3,video4]

    L'iistruzione val=jsondecode (fileread(m(n))) che restituisce una 'struct' all'interno della quale è presente la sotto-matrice che devo estrarre con percorso 'val.people.pose_keypoints_2d' . Ciò che non riesco a fare è automatizzare il salvataggio delle strutture provenienti da questo comando e delle relative sotto-matrici nel workspace. Purtroppo il ciclo for sovrascrive ad ogni n-esima iterazione presentandomi in workspace solo 'val' dell'ultimo file elaborato.

    L'istruzione di reshape è applicata singolarmente solo per prova...proviene dal codice che avevo creato per elaborare un singolo file.

    Di seguito il codice che ho utilizzato per arrivare alla matrice 'a' da un singolo file.
    fname = 'video1.json' ;
    val = jsondecode (fileread (fname));
    orig = val.people.pose_keypoints_2d; %legge la struct e crea una nuova matrice
    a = reshape(orig,[3 25]); %ordina la matrice ogni 3 righe fa una colonna

    Lo scopo è poter caricare ed estrarre in sequenza la sottomatrice che mi interessa da tutti i file *.json che metto nella cartella di lavoro o in un determinato percorso.

    Scusate se sono poco chiaro ma per via della poca esperienza in questo ambito non riesco a spiegarmi bene
  • Re: [Matlab]Importare file .json tramite ciclo for

    Per quanto riguarda il debug, è impossibile pensare di poter scrivere un programma (in qualunque linguaggio) senza sapere come usarlo.

    https://it.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html

    Per quanto riguarda il resto, purtroppo non ho accesso ad una versione di MatLab che abbia la funzione "jsondecode" (introdotta nella R2016b).

    Stando al codice che hai pubblicato, non capisco a cosa serva l'istruzione "eval(['importdata ' files(i).name]);", mi sembra del tutto inutile.
    Ad ogni modo, se riesci a leggere correttamente il file json con la funzione "jsondecode", ad ogni iterazione del ciclo interno dovresti ottenere nella variabile "val" tutti i dati.
    Dovresti provare ad "esplorare" il contenuto della struttura "val" per verificare che contenga effettivamente tutti i dati.
    il fatto che, ad ogni iterazione venga sovrascritta, non è un problema.

    Se i dati che ti interessano sono solo quelli contenuti nel campo "people.pose_keypoints_2d" e se vuoi convertirli nella matrice "a", puoi salvarla, ad ogni iterazione, in una matrice a tre dimensioni: "b(:,:,n)=a"

    Nel caso le dimensioni della matrice "a" non siano sempre le stesse, puoi salvare la matrice "a" in un cellarray: "b{n}=a"

    A questo punto, nel Workspace avrai una matrice a tre dimensioni od un cellarray che potrai usare nel prosieguo del codice.

    Nel caso tu debba accedere anche ad altri campi della struttura "val" pupi automatizzare il processo usando la funzione "fieldnames" (https://www.mathworks.com/help/matlab/ref/fieldnames.html) per estrarre i nomi dei campi della struttura in un cellarray ed accedervi tramite un loop, specificando il nome del campo - memorizzato nel cellarray - tra parentesi:
    
    a.b=1
    a.c=2
    a.d=3
    
    f=fieldnames(a)
    
    for i=1:length(f)
       a.(f{i})
    end
    
  • Re: [Matlab]Importare file .json tramite ciclo for

    Grazie mille ask-raf ho risolto tutto grazie ai tuoi consigli. Adesso funziona tutto perfettamente, ho ripulito il codice e va molto bene. Per quanto riguarda la modalità debug , la uso sempre ma non sapevo fosse chiamata cosi.
Devi accedere o registrarti per scrivere nel forum
4 risposte