jueves, 7 de marzo de 2013

Actividad 5: Detección Círculos Radios Desconocidos

Para ésta entrada se nos encargó hacer la detección de círculos donde nosotros no conocemos el radio y buscamos que nuestro programa lo detecte.

A continuación les dejo el código el cuál esta incompleto, pero proximamente lo actualizaré.
def detect_circule(im):
imX = convolucion(im, 'imX')
imY = convolucion(im, 'imY')
radio = float(sys.argv[2])
#for radio in range(sys.argv[2], sys.argv[3]):
frecuencia, circule = centros(imX, imY, im, radio)
maximo = 0
suma = 0.0
for xy in frecuencia.keys():
suma += frecuencia[xy]
if frecuencia[xy] > maximo:
maximo = frecuencia[xy]
promedio = round(suma / len(frecuencia))
print promedio
umbral = maximo - promedio
for xy in frecuencia.keys():
if frecuencia[xy] < umbral:
frecuencia.pop(xy)
print '...'
print max(frecuencia.values())
print '...'
dibujar_circulos_centro(im,frecuencia,radio, circule)
im.save('salidaCirculo3.png')
def centros(imX, imY, img, r):
w, h = img.size
frecuencia = dict()
circulos = dict()
cX = imX.load()
cY = imY.load()
for x in range(w):
for y in range(h):
gX = cX[x,y][0]
gY = cY[x,y][0]
gradiente = math.sqrt(pow(gX, 2) + pow(gY, 2))
if abs(gradiente) > 0:
#Forma sin la necesidad de obtener theta
cos_theta = gX / gradiente
sin_theta = gY / gradiente
xc = int(round(x - r * cos_theta))
xy = int(round(y - r * sin_theta))
centro = (xc, xy)
#obteniendolo con theta
#theta = math.atan2(gY,gX)
#centro = (int( round(x - r * math.cos(theta))), int( round(y - r * math.sin(theta))))
if not centro in frecuencia:
frecuencia[centro] = 1
else:
frecuencia[centro] += 1
circulos[x,y] = centro
else:
circulos[x,y] = None
return frecuencia, circulos
def dibujar_circulos_centro(im, frecuencia, r, circle_matrix):
pix = im.load()
w, h = im.size
imagen = ImageDraw.Draw(im)
circulo = dict()
for i in frecuencia.keys():
circulo[i] = (250,250,0)
imagen.ellipse((i[0]-1, i[1]-1, i[0]+1, i[1]+1), fill=(0,255,0))
print i
imagen.text(i, str(i), fill=('red'))
for i in range(w):
for j in range(h):
if circle_matrix[i, j] in frecuencia:
try:
pix[circle_matrix[i,j]] = (255, 0, 0)
except:
pass
for posicion in circulo.keys():
i , j = posicion
for angulo in range(360):
x = i + r * math.cos(angulo)
y = j + r * math.sin(angulo)
try:
pix[x,y] = circulo[posicion]
except:
pass
return im
view raw gistfile1.py hosted with ❤ by GitHub
Resultados




martes, 5 de marzo de 2013

Actividad 5: Práctica con NS-2

Para esta entrada se nos encargó trabajar con ns-2, donde se realizará una pequeña demostración.

NS-2
Es un software libre que es un simulador de redes, empleado principalmente para investigación y aprendizaje, que permite al usuario simular diferentes tipos de protocolos.

Demostración
Para esta demostración lo que se hará es una topología con cuatros nodos, enlazados en forma de  estrella, donde también veremos el comportamiento de una cola en un nodo.

Básico:
Creamos le objeto simulador, definimos los diferentes colores de flujo de información y abrimos NAM.
set ns [new Simulator]
$ns color 1 Blue
$ns color 2 Red
set nf [open out.nam w]
$ns namtrace-all $nf
view raw gistfile1.tcl hosted with ❤ by GitHub
Definimos el finish, que nos dice que es lo hará una vez terminado.
proc finish {} {
global ns nf
$ns flush-trace
close $nf
exec nam out.nam &
exit 0
}
view raw gistfile1.txt hosted with ❤ by GitHub
Topología
Definimos nuestra topología que en nuestro caso será de cuatro nodos.
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
view raw gistfile1.tcl hosted with ❤ by GitHub
Creamos los enlaces de como conectaremos lo nodos, donde estamos diciendo que n0 y n1 estará conectado con n2 en duplex y n2 con n3, tanto así diciendo su orientación y el tamaño de su ancho de banda.
$ns duplex-link $n0 $n2 2Mb 10ms DropTail
$ns duplex-link $n1 $n2 2Mb 10ms DropTail
$ns duplex-link $n2 $n3 1.7Mb 20ms DropTail
view raw gistfile1.tcl hosted with ❤ by GitHub
$ns duplex-link-op $n0 $n2 orient right-down
$ns duplex-link-op $n1 $n2 orient right-up
$ns duplex-link-op $n2 $n3 orient right
view raw gistfile1.tcl hosted with ❤ by GitHub
Agentes y Eventos:
Creamos trea agentes uno TCP asigando a n0, otro FTP y otra en UDP  a n1 y uno nulo que será el n3, asignando también el tamaño del paquete y el tiempo de intervalo que se estará mandando.
set tcp [new Agent/TCP]
$tcp set class_ 2
$ns attach-agent $n0 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n3 $sink
$ns connect $tcp $sink
$tcp set fid_ 1
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ftp set type_ FTP
set udp [new Agent/UDP]
$ns attach-agent $n1 $udp
set null [new Agent/Null]
$ns attach-agent $n3 $null
$ns connect $udp $null
$udp set fid_ 2
set cbr [new Application/Traffic/CBR]
$cbr attach-agent $udp
$cbr set type_ CBR
$cbr set packet_size_ 1000
$cbr set rate_ 1mb
$cbr set random_ false
view raw gistfile1.tcl hosted with ❤ by GitHub
Ahora asignamos en que tiempo empiezan a mandarse los paquetes y cuando se detienen.
$ns at 0.1 "$cbr start"
$ns at 1.0 "$ftp start"
$ns at 4.0 "$ftp stop"
$ns at 4.5 "$cbr stop"
view raw gistfile1.tcl hosted with ❤ by GitHub
Resultado:


Video:
Referencia:
http://nile.wpi.edu/NS/
http://www.isi.edu/nsnam/ns/ns-build.html

Tarea 4: Detección de Círculos

Para esta entrada, se nos encargó que detectáramos los círculos de una imagen, lo primero que se hizo fue descubrir cuales son los centros del círculo, para después resaltar el borde del círculo, para poder obtener el círculo necesitamos un radio, así que éste nosotros lo fuimos proporcionando.

Para el proceso de la imagen se empleo nuevamente la transformada de Hough, la diferencia es que le agregaremos unas fórmulas para obtener el centro del círculo.

Fórmula del gradiente:

[https://files.nyu.edu/jb4457/public/files/research/bristol/hough-report.pdf]

Theta:
[https://files.nyu.edu/jb4457/public/files/research/bristol/hough-report.pdf]

Obtener centro de x & y:

donde x & y son los puntos de circunsferencia del círculo y a & b el centro del círculo, como nosotros buscamos encontrar a & b, despejamos en la ecuación teniendo la siguiente fórmula:

Código:
A continuación les dejo el código.
from PIL import Image, ImageDraw
import sys, math
def centros(imgX, imgY, img, radio):
w, h = im.size
frecuencia = dict()
circulos = dict()
for i in range(w):
for j in range(h):
gx = imgX[i,j][0]
gy = imgY[i,j][0]
gradiente = math.sqrt(pow(gx, 2) + pow(gy, 2))
if abs(gradiente) > 0:
theta = math.atan2(gy,gx)
cx = int(round(i - radio * math.cos(theta)))
cy = int(round(j - radio * math.cos(theta)))
centro = (cx, cy)
if not centro in frecuencia:
frecuencia[centro] = 1
else:
frecuencia[centro] += 1
circulos[i,j] = centro
else:
circulos[i,j] = None
return frecuencia, circulos
def circulos(img, frecuencia, circulo):
pix = img.load()
imagen = ImageDraw.Draw(img)
for i in frecuencia.keys():
imagen.ellipse((i[0]-1, i[1]-1, i[0]+1, i[1]+1), fill=(0,255,0))
return img
def detect_circule():
img = Image.open(sys.argv[1])
imgX = convolucion(img, 'x')
imgY = convolucion(img, 'y')
radio = float(sys.argv[2])
frecuencia, circule = centros(imgX, imgY, img, radio)
circulos(img, frecuencia, radio, circule)
img.save('circulosSalida.png')
def main():
detect_circule()
main()
view raw gistfile1.py hosted with ❤ by GitHub
Resultado:
[radio = 60]

Notas:
El código ésta incompleto, por problemas nocturnos (dormido) y solo podemos distinguir los puntos que se obtienen, pronto lo actualizaré.

Referencias:
https://files.nyu.edu/jb4457/public/files/research/bristol/hough-report.pdf

domingo, 3 de marzo de 2013

Actividad 4: Catálogo de Hardware y Sofware

Para esta entrada lo que se nos encargó fue buscar sobre posibles hardware y software que podamos emplear en nuestro proyecto, para recordar un poco, nuestro proyecto trata del uso de nuestro dispositivo móvil con el automóvil.

Catálogo
En nuestro sistema tendremos una comunicación de dispositivo móvil  -  automóvil - servidor - dispositivo móvil.

Hardware 
Dispositivo Móvil con NFC: Como se mencionó este será uno de los componentes principales ya que permitirá la comunicación con el automóvil, al igual servirá como nuestro computador. El dispositivo móvil a usarse tendrá que contar con tecnología nfc, los posibles equipos a emplearse son: samsung nexus, motorola irarz.

[http://www.muycomputer.com/wp-content/uploads/2011/10/SamsungNexusPrime-1.jpg]

[http://img1.mlstatic.com/nuevo-motorola-i-razr-hd-xt925-4g-eex_MLM-O-3570602044_122012.jpg]


Automóvil: Al igual que el punto anterior es otro de los componentes principales ya que en éste, será el medio donde se llevarán acabo los hechos. A diferencia del anterior no se especifica alguno, pero se podría trabajar de una mejor forma con un Enzo Ferrari, Lamborghini Murcielago, McLaren P1, entre otros autos sencillos.
[http://cdn.webadictos.net/media/2008/02/carro-vectores.jpg]


Arduino: El arduino será nuestro componen que servirá como el medio que se comunicará con los demás dispositivos electrónicos, éste será el que procese la información y la distribuya con los demás.
[https://dlnmh9ip6v2uc.cloudfront.net/images/products/1/1/0/2/1/11021-01a.jpg]

  • Arduino Ethernet: Es un shield que se adapta al arduino uno y sirve para poder poner al arduino en modo de cliente o servidor y tener comunicación en la web. Éste nos puede servir para hacer pruebas o en dado caso emplearlo como versión beta en la comunicación del auto con el servidor.
[https://dlnmh9ip6v2uc.cloudfront.net/images/products/9/0/2/6/09026-01c.jpg]


Adafruit PN532 NFC/RFID Controller Shield for Arduino: Este componente, será el que emplearemos como receptor de NFC, que es el que leerá el dispositivo móvil y dará acceso al usuario al automóvil para después realizar otras acciones.
Costo: $39.95
Tienda: Adafruit

[http://www.adafruit.com/images/large/ID789_LRG.jpg]


Adafruit Ultimate GPS Logger Shield: Este componente, será el encargado de enviar las coordenadas del automóvil que emplearemos para su ubicación en dado caso que el usuario lo requiera, como al no saber donde está, al igual si fue robado, dar su ubicación.
Costo: $49.95
Tienda: Adafruit

[http://www.adafruit.com/images/large/1272_LRG.jpg]


Cellular Shield with SM5100B: Este componente nos servirá como medio de comunicación al servidor,  ya que su función será mandar parámetros como los del gps, entre otros al usuario.
Costo: $99.95
Tienda: Sparkfun

[https://dlnmh9ip6v2uc.cloudfront.net/images/products/9/6/0/7/09607-04.jpg]


Software / Lenguaje de Programación.
En nuestro sistema el posible software a emplearse serán o posible lenguaje de programación a desarrollarse será:


  • Java: Que es el lenguaje de programación de Android que se programará la aplicación del dispositivo móvil.
  • Processing: Que es el lenguaje de programación de Arduino, que emplearemos como componente hardware que hará la comunicación entre los demás componentes electrónicos.
  • PHP: Que es el lenguaje de programación a emplearse del lado del servidor y que éste servirá para hacer algunas consultas al igual que guardar historial o información de las acciones o acciones predefinidas por el usuario.