Newsgroup: it.comp.programmare
Titolo: algoritmo

Ciao a tutti
sto cercando di realizzare, con una webcam, un inseguitore per il mio
telescopio e siccome riesco a gestirla via sw volevo sapere se qualcuno
di voi conosce un algoritmo che mi consenta di determinare lo
spostamento di immagine tra un frame ed il successivo.
mi serve sapere se l'immagine si è sposta in alto, in basso, a destra o
a sinistra.
se la cosa può semplificare la mia immagine è quasi tutta nera tranne la
proiezione di stelle o pianeti che mi illumina da un solo pixel fino a
qualche decina di pixel.
ringrazio veramente chinque possa aiutarmi.
cioa e grazie ancora
zorro

spostamento di immagine tra un frame ed il successivo.
Potresti fare cosi'... e' un sistema laido, pero': analizzi il primo frame
alla ricerca di un punto di repere, per esempio una stella luminosa con un
alone buio di raggio N pixels a coordinate X, Y.
E a questo punto, se sai che nell'intervallo di tempo T il campo si sposta
di al piu' (N-P) pixels, con P = margine di sicurezza :-), basta che tu in
un quadrato (X-N,Y-N),(X+N,Y+N) cerchi la stella. La troverai per forza se
le ipotesi sono soddisfatte, e la troverai a coordinate X',Y'.
A questo punto sai che il frame si e' spostato (ma non sai se ha ruotato),
di (X'-X, Y'-Y).
Avendo un secondo punto di repere, puoi determinare anche la rotazione.
Leonardo vile & macellaio
-- 
".signature": bad command or file name

per prima cosa grazie per aver risposto
cosa significa punto di repere?
come faccio a trovare la stella all'interno del frame? (forse potrei trovare
tutti i pixel con intensità superiore ad X) e poi come faccio, una volta
analizzato il secondo frame a confrontare i pixel con luminosità superiore ad
X rispetto al primo?
mettiamo che ho 20 pixel interessati dalla luce della stella, mi sembra
difficile determinare se tutti e 20 si siano spostati a DX, SX, Alto o Basso
ti ringrazio ancora
ciao


ti ringrazio ancora
Dovresti avere un punto con, piu' o meno, lo stesso valore per la funzione
intensity(). Solo che nel primo frame ce l'hai a coordinate (A,B), mentre,
nel secondo frame, ce l'avrai a coordinate (C,D).
Se campioni abbastanza spesso (dipende dalla ampiezza di campo che hai sul
telescopio), per risparmiare CPU puoi esaminare una zona non molto grande,
centrata su (A,B):
	K = intensity(A,B)
 
	(qualche tempo dopo...)
	C = 0
	D = 0
	REMark Z e' il massimo errore sull'intensita' (sperimentare)
	REMark si puo' partire da 100000 e andare a scendere.
	Z = MAXERR
	REMark d e' il massimo numero di pixels "sperati" per questo
	REMark spostamento. Corrisponde a max(C-A, D-B). E per stare
	REMark sicuri... se in dieci minuti la stella si sposta di 7
	REMark pixels ed e' larga 5, meglio mettere d = 7 + 5 = 12.
	d = 10
	FOR x = A - d TO A + d
		FOR y = B - d TO B + d
			i = intensity(x,y)
			IF (ABS(K-i) < Z)
				Z = ABS(K-i)
				C = x
				D = y
			END IF
		END FOR
	END FOR
	IF (Z = MAXERR)
		PRINT "Impossibile individuare la stella"
	ELSE
		PRINT "La stella e' ora in " + C + ", " + D
		PRINT "La differenza sul CCD e' di " + Z
	END IF
Leonardo


 wrote in message
3B9CBFAD...@hotmail.com...

Ciao Zorro,
se l'immagine non cambia molto tra i due frames
il metodo più semplice sarebbe quello di calcolarti i momenti rispetto agli
assi.
m_ x= sommatoria ( pixel * (distanza dall'asse y))
m_ y= sommatoria ( pixel * (distanza dall'asse x))
Se m_x aumenta è probabile una rotazione a destra,
Se m_y aumenta è probabile una rotazione in alto,
ecc...
Difficilmente però otterrai dei valori confrontabili tra frames
successivi, perchè basta un minimo cambiamento nell'immagine
e le variazioni dei momenti perdono di significato.
Metti che aumenta l'umidità dell'aria, quindi aumenta anche l'alone
intorno ai corpi luminosi, i momenti non sono più confrontabili
pechè il cambiamento non dipende solo dallo spostamento.
Per ridurre questo problema secondo me ti conviene fare due cose:
1) Applicare un filtro del tipo edge-detection.
2) Riferirti alla posizione del baricentro.
-> (2) La posizione del baricentro la trovi dividendo i momenti
            per la somma di tutti i pixel.
            Facendo così riduci l'influenza delle variazioni di luminosità
complessive.
            Nel senso che se tutta l'immagine aumenta o diminuisce di
luminosità
            in maniera uniforme la posizione del baricentro non ne risente.
            Però c'è da dire che l'alone è proporzionale al contorno ed
all'intensità dell'oggetto luminoso
            quindi in generale il baricentro tende a spostarsi verso gli
oggetti più grossi.
            Ovviamente se gli aloni diminuiscono avverrà il contrario.
-> (1) Gli algoritmi di edge-detection servono a trovare i contorni degli
oggetti
            all'interno di una immagine. Ce ne sono una quantità enorme,
anche molto
            complessi, basta fare una ricerca su internet per vedere quanti
links si trovano.
            I più semplici però sono molto facili da implementare e si
basano sull'idea di sostituire
            la luminosità del punto con il gradiente dei punti che lo
circondano.
            Esempio semplicissimo:
                  x x x      p è il pixel che stai studiando
  -1 -1   0    B =0
O[3][3]=   x p x      i vari x sono i pixel che lo circondano
  F[3][3]=     -1   0  1     D =1
                  x x x      ti costruisci un filtro così: =>
0  1   1
            dove
            O             è una sottomatrice della tua immagine originale
                            che ha al centro ( O[1][1] ) il pixel che stai
studiando.
                            Ovviamente ti conviene utilizzare l'originale,
questo è un'esempio.
            F             è la matrice del filtro
            B             è il bias
            D             un numero per cui dividere il risultato.
           Lo si applica creando una nuova immagine con i pixel calcolati
come
            nuovo_pixel= ( sommatoria ( O[i][j]*F[i][j] ) / D ) +B
Puoi anche decidere ( e secondo me ti conviene ) di scartare tutti i
risultati sotto una certa entità.
Ci sono decine, anzi centinaia, di variazioni.
Questa è la forma piu semplice e di edge-detection ( forse
edge-enhancement ),
però i risultati sono sorprendenti.
Puoi provarli con PaintShopPro, che ti mette a disposizione
un tool per crearti i filtri espressi in questa forma.
Io sono rimasto sorpreso del risultato di un'algoritmo così semplice.
Riassumendo:
1) Scegli  i valori ottimali del filtro per il tuo tipo di immagine.
2) Deriva una nuova immagine applicando il filtro all'originale.
3) Calcola i momenti.
4) Calcola la posizione del baricentro.
5) Frequenta il newsgroup comp.graphics.algorithms, ci sono dei mostri !!!
6) Fammi sapere se funziona.
Ciao Alessandro.