Newsgroup: it.comp.lang.delphi
Titolo: Questa è difficile davvero!!!

Salve,
ero tentato di realizzare un programma con l'obiettivo di "scovare"
un'immagine prememorizzata all'interno dell'intera schermata del
monitor.....in pratica gli si darebbe un'immagine .bmp per esempio e lui
dovrebbe continuare a fare la scansione dello schermo fino a trovarla....e
restituire la coordinata in cui l'ha trovato.
Non ho la minima idea di come procedere a dirla tutta...so coem caricarlgi
un'immagine bmp ma non so in che modo potrei dire al programma: "considera
che lo scehrmo č un 1152*1024, carica in un .bmp l'attuale immagine definita
nel rettangolo con angolo in alto a sinitra 10,10 e in basso a destra 100,
20"....per far eun esempio. Poi confronterei l'immagine registrata e quella
catturata....e se corrispondono saprei che in quel momento c'č
quell'immagine.....
idee?
--
Giulio Pipitone (
www.fighters4web.com
 )
#sito per la lotta agli abusi in rete#

 monitor.....
Teoricamente non e' complicato: ti basta rappresentare il contenuto
dello schermo e dell'immagine come testo.  
Ogni pixel viene tradotto in uno o piu' caratteri (dipende dalla 
profondita', in bit, dei colori).
Ti basta, a quel punto, applicare un normale algoritmo di ricerca
dei testi (Knuth-Morris-Pratt o Boyer-Moore-Horspool) e la cosa
si risolve banalmente.  Probabilmente, sia il testo da cercare che
l'immagine risulteranno troppo lunghi perche' la ricerca abbia
delle buone performance, ma potresti tentare.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 dello schermo e dell'immagine come testo.  
<NOTA>
L'immagine ovviamente andrebbe cercata una riga alla volta...


 ...


...


 Maurizio Baldi

 Grazie ancora, ciao.
io li tratterei come semplici byte.
Ogni immagine č un blocco di byte.
Ora devi cercare se il secondo blocco di byte ( la seconda immagine ) č
contenuta nella prima.
Se le due immagini sono perfettamente identiche a livello di colori,
dimensioni ecc ecc, la cosa č semplice perchč basta una ricerca ed il gioco
č fatto.
Ora senza usare algoritmi esistenti ( cioč tentando di usare la testa per
capire come procedere ), una ricerca facile č una semplice scansione dei
byte del primo blocco ( corrispondente all'immagine dello schermo ).
Ad esempio supponiamo che ho questa stringa si byte:
130150125180456
e devo vedere se la stringa sottostante č contenuta:
1501
mi basta partire dal primo byte ( valore 1 ) e fare una scansione fino alla
fine della stringa di byte ( valore 6 )
La scansione deve controllare ( per ogni byte acquisito ) se il primo byte
della seconda stringa č uguale o meno.
Se lo č, allora č probabile ( oddio, in questo caso la probabilitŕ č molto
bassa ) che il resto dei byte corrispondono al blocco
di byte cercato.
Quindi si controlla il secondo byte. Se corrisponde si controlla il terzo e
cosě via fino all'ultimo ( a patto che tutti corrispondono )
Appena uno non corrisponde allora si continua la scansione dei byte
ripartendo con il confronto del primo byte della seconda stringa. Facile no
!!
Poi se vuoi ottimizzare la cosa, utilizza algoritmi ad hoc.
Inoltre, il formato BMP č talmente semplice che contiene giŕ la sequenza
esatta dei byte appartenenti all'immagine rappresentata. ( in pratica non
devi usare nessun algoritmo particolare per leggere i byte nella giusta
maniera, ma solo partire dal punto giusto visto che i primi byte sono
l'header del formato BMP e quindi contengono solo alcune informazioni
inerenti all'immagine stessa, ma non i pixel.
Non ho altro da aggiungere.
Buon lavoro.
Ciao ciao...
Antonio Tarolla

 fine della stringa di byte ( valore 6 )
Non conviene.  Per fare questo tipo di ricerche ci sono
algoritmi gia' studiati, che funzionano molto meglio
dell'analisi carattere x carattere.


>>Poi se vuoi ottimizzare la cosa, utilizza algoritmi ad hoc.<<<<
La ricerca che gli ho suggerito funziona e su questo non ci piove,
l'algoritmo ad hoc sarà certamente più funzionale, ma se lui non conosce
quello più lento e stupido, non saprà mai risolvere un problema dove
"l'algoritmo ad hoc", per pura iella
non c'è :-)))
Ti saluto...ciao !!
Antonio Tarolla

 >>>Poi se vuoi ottimizzare la cosa, utilizza algoritmi ad hoc.<<<<
"Ora senza usare algoritmi esistenti[...]"
E' questo quello a cui mi riferisco.
La ricerca carattere per carattere e' talmente banale che tutti
arrivano a comprendere come eseguirla.  E' pero' molto molto lenta
e se all'OP serve risolvere un problema preciso, fa bene a ricorrere
ad algoritmi precisi.  Usare un algoritmo non significa "prendere un
pezzo di codice ed incollarlo li'", significa innanzitutto capire
che cosa si vuol fare, per poi tradurlo in codice vero e proprio.


>> Idee ? <<<<<
io ci ho provato no !!
Ok Andrea, ti saluto.
Ciao ciao...
Antonio Tarolla

 pronto. 
Se una persona e' pigra di suo... non cambiera' certo perche' qualcuno gli
dice di pensare da solo ad un algoritmo invece di "incollare" roba gia'
fatta... sta a lui avere la voglia o l'interesse per approfondire la
questione. 
Questione di mentalita', secondo me... io sono pigro solo quando si tratta
di alzarmi dal letto! ;-) 
Vorrei finire con una frase, che mi e' rimasta impressa alle
superiori(sara' contenta la mia ex 
prof.sa
 di fisica... ma non credo
frequenti il ng!! ;D) : 
-- 
"Se ho potuto vedere più lontano degli altri,
  è perché stavo sulle spalle dei giganti"
    (Isaac Newton)

     (Isaac Newton)
di sicuro Newton non era un pigrone. Vabbè, ma alla mattina un po' anche lui
credo :-)))
Come ho scritto sopra, nel caso di Newton, lui ha condiviso, sfruttato (
ecco perchè stava sulle spalle dei giganti ) però ha anche ampliato :-)))
Ti saluto Davide.
Ciao.
Antonio Tarolla

 non sono) solo per dire "l'ho fatto io" ... non ha senso!
Non sono d'accordo. Secondo me è utilissimo che uno prima di utilizzare un
algoritmo pronto ci metta del suo, si sprema per vedere cosa *lui* è in
grado di fare.
Se tutti facessimo come dici sta tranquillo che non ci si evolverebbe più.
Un programmatore non deve saper fare un programma, deve bensì imparare a
programmare: ti assicuro che c'è molta differenza.
In definitiva io preferisco prima provare, implementare, sbattere la testa e
poi scoprire che c'è qualcuno che ha saputo fare meglio di me. Altrimenti
ognuno di noi si acquisti un buon libro di algoritmi e strutture dati e
faccia solo traduzione del codice già pronto.
Questione di idee.
Ciao! ;-)
--
- Carlo -
c.b...@libero.it

 qualcosa di bello e pronto, preferisco pensarci da solo.
Se fosse come dici, dovremmo buttare all'aria tutte le librerie
di componenti Delphi "belle e pronte", dovremmo bruciare 
tutti i libri sui "design patterns" e gli algoritmi.
Il lavoro fatto dagli altri, prima di te, e' prezioso (anche perche'
molto probabilmente lo hanno fatto meglio di come lo avresti fatto
tu).
Non puoi pensare per ogni nuovo problema di inventarti, di tuo,
la soluzione.  Non c'e' nessun problema nell'utilizzare un 
algoritmo inventato da qualcun altro.
Questo e' un principio che non si applica solo alla programmazione.
Lo studio degli algoritmi serve a darti una forma mentis, nella
stessa misura in cui lo studio dei teoremi in Analisi ti aiuta
a risolvere problemi analoghi.  Ma se nella pratica di tutti i 
giorni ti serve risolvere un problema preciso, magari anche in
poco tempo, allora sta tranquillo che quel materiale "bello e 
pronto" ti sara' di grande aiuto.  La regola generale dovrebbe
essere quella di ottimizzare il lavoro, usando pezzi prefabbricati,
non di reinventare tutte le volte la ruota.
Da parte mia ho concluso.


schemi ?
e' proprio qui che o fraintendi il mio ragionamento.
Questione di mentalita'... se sto cercando una soluzione, mi documento
prima sull'argomento e vedo cosa e' stato gia' creato, lo studio, lo
analizzo e mi domando se possa essere migliorato (almeno nel mio campo di
applicazione).
Non me ne sto con le mani in mano ("a panzetta"? ;) che
espressione e'? :PP) aspettando un fantomatico genio che esca dagli
schemi. 
Stare sulle spalle dei giganti vuol dire proprio questo: poter vedere
oltre cio' che e' stato fatto (inventare qualcosa di nuovo) proprio
perche' si conosce cio' che e' stato gia' fatto. 
Altrimenti pensaci, nessuno dovrebbe andare a scuola... (spingendo il
ragionamento all'estremo...) 
Va beh, mi sa che stiamo entrando nel meraviglioso mondo dell' OT :P
Ciao & Buona Domenica! :)
Davide DG.

 dati e faccia solo traduzione del codice già pronto.
Non c'e' nulla di male in questo.  Il riuso del codice e' uno dei
principi cardine della programmazione orientata agli oggetti.
A parte che non credo a nessuno che mi dica, in un mondo come quello
dei programmatori Delphi in cui si ragiona per "cerco un componente
e lo uso"[1], che e' intenzionato, dapprima, a risolvere il problema
per conto proprio.
D'altronde, chi ragiona cosi', fa presto ad entrare in contraddizione,
basta che utilizzi la ListBox messa a disposizione da Delphi.
Deve cercare un elemento ? bene, usiamo la IndexOf.
Ma chi ti dice che dietro la ricerca non ci sia un algoritmo
particolare,
chi ti assicura che dietro qualsiasi metodo di qualsiasi componente non
ci sia il frutto dello studio di altre persone ?
Tu, d'altronde, ne conosci solo l'interfaccia.  E non venirmi a dire
che ti vai a studiare il sorgente, perche' Borland e' liberissima di
modificare l'algoritmo alla base della ricerca, senza intaccare la sua
interfaccia e senza dartene notizia.
------
[1]
"ho bisogno di un componentino che mi notifichi la connessione internet,
pensavo di aver risolto con il componente messo a disposizione da Piette
(scaricabile insieme alla sua conversione delle RAS) ma sembra che 
neppure quello faccia il suo dovere! :("
[Carlo Bertuccini, 17/09/2000]


 Da parte mia ho concluso
rimango dell'opinione che ci sono casi e casi.
La regola dei pezzi prefabbricati non è sempre valida.
Perchè ad esempio si costruiscono case o capannoni prefabbricati e case o
capannoni in mattoni ?
Eppure a montare un capannone prefabbricato ci vuole una, due giornate. Ma a
farlo in mattoni ci vogliono mesi e mesi !!
Perchè tutto ciò ?
Il prefabbricato costa meno, ci vuole meno tempo a montarlo eppure c'è chi
sceglie i mattoni.
Tutto ciò a cosa è imputabile ? Alle esigenze o sbaglio !!
Da parte mia ho concluso.
Ti saluto.
Antonio Tarolla

 La regola dei pezzi prefabbricati non è sempre valida.
La regola dei pezzi prefabbricati e' sempre valida quando si vuol
ottimizzare il lavoro, renderlo efficiente, sicuro e stabile.
Non sarebbe stata introdotta la programmazione orientata agli
"oggetti", se non fosse stato cosi'.
Ti saluto.


 O no ?
Pensare che tutti abbiano le stesse capacita' e che, se messi nelle
stesse condizioni, tutti raggiungano gli stessi obiettivi e' pura
utopia.  Tu sei sicuro che se avessi studiato la Fisica tanto quanto
Einstein, saresti riuscito a formulare (a 26 anni), la teoria della 
relativita' ?
Per rifarci al topic di questo thread: la soluzione alternativa e 
migliore a quella che suggerisci, esiste, non ha bisogno di essere
scoperta.


 interfaccia e senza dartene notizia.
bè, non so se entra proprio in contraddizione.
A noi non interessa se la Borland modifica l'algoritmo, ma al momento che la
Listbox della Borland non ci piace più, si provvede.
La Listbox sta li ed è tanto facile prenderla e metterla sulla form, non
vedo perchè non si debba farlo pensando invece un'altra soluzione.
Se a me sta bene la Listbox la uso, se non mi sta bene affari miei.
Dall'inizio del thread si è parlato di un problema di cui l'autore chiedeva
delle idee, dopo sta a lui seguire la strada che ritiene giusta e non mi
sembra giusto tagliare le gambe ad un ragionamento per giungere ad una
determinata soluzione che solo lui può stabilire se è conviniente o meno.
Facciamo un po' di supposizioni, forse giuste o forse sbagliate. Non so.
La documentazione che lui cerca è in inglese. Lui non lo conosce.
L'algoritmo esposto non è dei più facili e richiede tempo sia per
apprenderlo sia per tradurlo in codice.
A lui non interessa un algoritmo velocissimo.
Cosa fa ? Anzi, cosa faresti tu al suo posto ?
Vabbè, a parte impiccarsi, sceglieresti una strada che hai trovato ed è
funzionale, oppure cercheresti qualcuno bravo in inglese, qualcuno bravo con
gli algoritmi e qualcuno esperto di Delphi e poi magari ti accorgi che
quanto hai ottenuto è un ottimo lavoro ma non era necessario ?
Ed i costi dei 3 "impiegati" dove li mettiamo ? ( lasciando stare il tempo
speso )
Comunque Andrea io non sono dell'opinione che non si devono usare soluzioni
esistenti, ma saper scegliere quale conviene usare, comprendendo fra queste
anche una propria. ( se c'è ovviamente )
Insomma scartare una propria idea perchè si pensa che non è all'altezza di
qualcosa che già esiste, penso sia un po' troppo azzardato.
Ok, ti saluto.
Antonio Tarolla

 la via migliore da seguire.
potrebbe non esserlo, ma se a me va bene allora lo è.
Comunque da questo messaggio in poi non rispondo più visto che ormai siamo
proprio OT e poi sembra di stare in chat :-))
( botta e risposta )
Ti saluto.
Antonio Tarolla

 interfaccia e senza dartene notizia.
Ecco, altro periodo fuori luogo al momento giusto. Bravo. Ora aspetto una
tua risposta fuori luogo.


 scoperta.
E giunse la sentenza dell'uomo del non progresso. Fortunatamente non tutti
la pensano come te. Fortunatamente non tutti sono come te.


 bambino in preda ad un capriccio.
Io non ti sto affatto offendendo.
Ripeto che non c'e' nulla di male nel cercare codice gia' pronto, e'
un atteggiamento che condivido.
Ormai ho imparato a conoscerti anch'io e so che giudichi fuori luogo e
insensato tutto cio' a cui non sai ribattere :)


 Fortunatamente non tutti sono come te.
E certo, altrimenti avremmo tutti ragione ;)


 qualcosa che già esiste, penso sia un po' troppo azzardato.
Ribadisco il mio pensiero, sperando questa volta di farmi capire:
Quando una soluzione migliore della propria esiste, e' stupido non
utilizzarla per fossilizzarsi sulla propria.  Le soluzioni si scartano,
quando ci sono soluzioni migliori.


 risultato migliore.
Non costano di piu', sono piu' veloci e convenienti.
Se non conosci gli algoritmi che ho consigliato, ti suggerisco di 
reperire un po' di documentazione e studiarla.  Se non consoci cio'
a cui stai ribattendo e' inutile continuare a discutere.


 E certo, altrimenti avremmo tutti ragione ;)
Ribadisco: fai il comico e non il programmatore: ti viene sicuramente
meglio.


 si sceglia la
Oxford?


 meglio.
ARIROTFL ! ....


 Oxford?
Stupidland ?


 insensato tutto cio' a cui non sai ribattere :)
Certo, allora condividerai che è inutile continuare a dibattere con me.
Perfavore, quindi, evita di rispondere ai miei messaggi. E perfavore evita
di ribattere con frasi tipo "E ti lascio andare in giro per il ng a dire
falsità?". Hai ragione, Laforgia. Sono 2 anni che continui a fare *plonk* ai
miei messaggi ma i frutti non li vedo.
Addio


 miei messaggi ma i frutti non li vedo.
ROTFL... patetico...
