problemi di cross processing

Ciao a tutti, sto realizzando il solito robot e ho un problemino a interfacciare roborealm a processing. roborealm è un programma di computer vision da niubbi molto facile da settare e gestire completamente gui. Con questo posso salvare un file in txt in cui salvare la variabile di x del punto in cui si detecta un uomo nella webcam. Questo file appare cosi: COGX 39293489382901923903920910921...... la variabile è di tre cifre. (non capisco con questo codice come faccia gia a riconoscere le linee di 3 cifre da solo)

String[] lines = loadStrings("vision.txt");
int time = lines.length - 1;
int got = Integer.parseInt(lines[time]);
println(got);
if got > 300 println("hi")

con questo codice ottengo stampato l'ultimo valore salvato nel file gia trasformato in int, se questo supera 300 stampa "hi". Ho di certo raggiunto un ottimo risultato ma..

il mio problema è che il rilevamento che mi serve è sempre l'ultimo per poter beccare l'uomo in tempo reale....per questo ho scritto int time = lines.length - 1; se faccio partire processing con roborealm spento tutto bene, mi manda sempre l'ultimo valore...se accendo roborealm processing crasha e dice: numberFormatException : for input string ""

se scrivo: int got = Integer.parseInt(lines[lines.length]): mi da errore: Arrayindexoutofbound: e un numero.. se scrivo: int got = Integer.parseInt(lines[lines.length - il numero che ottengo nell'errore]): funziona anche con roborealm acceso, ma al primo rilevamento di un uomo in cui roborealm salva processing crasha di nuovo....

è una settimana che sbatto la testa su come trasformare una string in un int per poter poi computare (per esempio far girare il robot nella direzione dell'uomo presente) adesso che ci sono riuscito non posso testare perchè c'è questo problema....aiutoooo :-[ :-[ :-[ :-[ :-/ :-/ :-/

in piu' la tesi si avvicina inesorabilmente e la computer vision è una cosa che avrei voluto inserire...anzi che voglio inserire a tutti i costi nel progetto...

io questo post più che "problemi con il crossprocessing" lo chiamerei "problemi con il crossPOSTING" visto che ti questo se ne parlava giù da un'altra parte.

Apparte tutto. Quel codice da dove viene? L'applicativo che apre il file e manda i dati ad arduino come lo stai scrivendo? C, C++, C#, Java? Non sembra difficile.. si tratta di aprire un file e parsare le stringhe.

Ciao Uccio!!! Grazie della risposta. Non volevo duplicare il post, piu' che altro li si parla di spedire piu' variabili, io qui devo ottenere sempre l'ultima presente nel file.

Roborealm è un applicativo di computer vision che puo' salvare un file con dentro le variabili che acquisisce dal flusso video analizzato.

Le 3 righe di codice le ho scritte leggendo gli esempi di processing.org Il mio problema è che se scrivo semplicemente: println(lines); mi fa vedere tutte le righe del file dalla prima all'ultima. e posso vedere in tempo reale i valori di x del punto dove vengo riconosciuto all'interno della webcam, ma questo è solo un flusso di dati...stampati. io avrei bisogno di ottenere l'ultimo valore senza che mi dia gli errori che ho postato piu' su.

Capire gli errori! I messaggi di errori sono vostri amici.

numberFormatException : for input string "" Significa che ha una stringa vuota e non riesce a convertira in un numero. L'errore dovrebbe avere anche il numero di riga dove è andato in errore, ma guardando il codice posso dirti subito che può essere capitato solo in un punto(a meno di stranezze di processing): int got = Integer.parseInt(lines[time]);

Probabilmente lines[time] è una stringa vuota.

Se ho capito bene tu hai un programma che scrive in un file as intervalli e attraverso processing leggi questo file ad intervalli. Il problema potrebbe essere che O il file è vuoto O il file finisce con un acapo e quindi l'ultima riga è vuota O cerchi di leggere il file quando l'altro programma ci sta scrivendo, non so come gestisce le eccezioni processing però.

MEtti delle tracce nel codice così lo scopri.

Chiedendo di stampare lines e basta, parte dalla prima riga e arriva fino all'ultima, poi si ferma. Se roborealm è aperto e salva dei rilevamenti, questi possono vedersi in tempo reale stampati in processing. Penso che non si tratti quindi di un problema di file occupato dal salvataggio, ma piu' che altro un mio errore nel codice.

Se lo script funziona con un file fatto da te ma va in errore quando il file è generato da questo roborealm, il problema potrebbe essere in qualcosa di imprevisto nel file generato.

Quello che hai postato è tutto il codice che esegui? a che riga ti va in errore? Prova a fare un print di lines.length per vedere quante righe legge.

Ragazzi!! Ce l’ho fatta!!! ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D
Allora, ho modificato come Roborealm crea il file con il seguente setup:
Comando: write_variables
text file
Append data to end of file (no)
first row is column names (no)
Row delimiter: CRLF
Column delimiter: semicolon
text qualifier: doublequote

con questo setting spedisco due variabili:
Cog_x cioè la x del center of gravity
e image_width che mi fixa il funzionamento di tutto


(la linea bianca è COG_X)
In questo modo Roborealm scrive nella prima riga il valore 480 e il valore di rilevamento suddivisi da un puntoevirgola. Il nocciolo era che se non rileva nulla la linea dove dovrebbe scrivere il valore NON ESISTE. Questo era il problema che avevo prima cioè che se non c’erano rilevamenti il file era vuoto. Richiedevo di leggermi la riga [line.length - 1] e ottenevo probabilmente un valore negativo o illegibile, visto che line.length in quel momento era 0.

Per risolvere questo problema ho fatto in modo che roborealm mandi sempre il valore 480 e se ottiene rilevamenti mandi anche i valori rilevati (i due valori sono suddivisi da un “;” sulla stessa riga[0]). Semplicemente dopo sottraggo 480 e ottengo il rilevamento effettivo. Se il valore è 0 vuol dire che non ci sono rilevamenti e processing non da piu’ errore ;D ;D

String[] lines = loadStrings("file.txt"); // leggo la stringa del file
int[] nums = int(split(lines[0], ';')); // la splitto in due int
int detect = nums[0] + nums[1] - 480; // se nums[1] non c'è il risultato è lo stesso accettabile
if (detect > 0) {   // se c'è qualche rilevamento
if (detect > 0 && detect < 270) { // se è nel quadrante sinistro
   println("z"); // spedisci una z ad arduino
   }
if (detect > 370) { // se è nel quadrante destro
   println("v); // spedisci una v ad arduino
}
}

in questo codice di base spedisco una z se l’oggetto è a sinistra del robot e una v se l’oggetto è a destra del robot. Purtroppo questo sistema si basa sulla motion detection, quindi non posso ottenere un valore affidabile se il robot è in movimento, per questo motivo pensavo di utilizzare quest’app per principalmente per permettere al robot di capire dov’è un uomo in movimento potersi girare in quella direzione e magari generare una citazione (con il sintetizzatore vocale TTS lib , ibreria processing). Poi se avete qualche consiglio per fare un sistema piu’ carino di mandare due lettere sono apertissimo a sviluppare la cosa!!!

Questo lo definirei il mio Hello World alla computer vision

Forte.

Cmq il codice bastava farlo così senza aggiungere altri valori:

String[] lines = loadStrings("vision.txt");
if (lines.length > 0){
int time = lines.length - 1;
int got = Int(lines[time]);
}

Ma sei un figo! Devi assolutamente scrivere un tutorial su questa cosa! Bellissimo!

se ho capito bene tu riesci a capire se ci sono oggetti in movimento intorno a una telecamera giusto?

Ciao Uranio, ho controllato. No come lo hai pensato tu non funziona perchè se non rileva nulla non scrive la linea, quindi la tua if da errore. A parte che scritta cosi' non leggerebbe mai il valore, perchè è tutto scritto nella prima riga (e in un array la prima riga è [0]). Si Calamaro devo dire che è anche piuttosto preciso, ma solo se la telecamera è ferma.

Pensavo che dovessi prendere sempre l'ultima riga. Bo, vabbe, alla fine basta che funzioni.

che spettacolo, complimenti davvero :D