Skip to content

Smartphones: aonde podemos parar?

Tive o prazer de ter em minhas mãos um Nokia 6681 a alguns dias atrás, e tive uma idéia:

Imagine uma touchscreen. Agora imagine uma touchscreen sem uma touch-screen =).
Imagine poder “simular” uma touchscreen no ar usando apenas a camera do seu celular.

Pode ser um brinquedo muito interessante não?

Pensando nisso fiz um pequeno aplicativo em Python (pyS60) que localiza um objeto e segue-o. Como se fosse um mouse pointer seguindo uma caneta.

Este aplicativo na verdade é apenas uma prova de conceito demonstrando que pode ser feito. Quando tivermos celulares melhores, algo como 1GHz (O 6681 possui um processador de 220Mhz), e cameras próprias para este tipo de aplicação, talvez tenhamos softwares e smartphones com este conceito em funcionamento.
Seria muito bacana ver soluções assim aplicadas em desktops 3D.

Segue um vídeo de demonstração do aplicativo. Como disse, é apenas uma prova de conceito. Python ainda não é uma linguagem muito rápida quando estamos em celulares. Mas é muito mais fácil programar e testar do que se fosse feito em native symbian, e ainda por cima posso programar em linux =).

Leitores de RSS podem ver o vídeo aqui

Código fonte


##############################################
# Produzido por Danilo Cesar [http://www.danilocesar.com]
# Inspirado por: http://www.bigbold.com/snippets/posts/show/636
# Agradecimento a Enrico Batista
##############################################
from appuifw import *
from graphics import Image
import camera, e32
#import miso # don't dim the light

app.body = c = Canvas()

running = 1
def quit():
global running
running = 0

app.exit_key_handler=quit
app.title = u"O controle"
app.screen = 'full' # or 'normal', 'large'

def getdata(im, bpp=24):
import struct, zlib
im.save('D:\\pixels.png', bpp=bpp, compression='no')
f = open('D:\\pixels.png', 'rb')
f.seek(8 +8+13+4)
chunk = []
while 1:
n = struct.unpack('>L', f.read(4))[0]
if n==0: break # 'IEND' chunk
f.read(4) # 'IDAT'
chunk.append(f.read(n))
f.read(4) # CRC
f.close()
return zlib.decompress(''.join(chunk)) # '\x00' prefix each line

X = 80
Y = 60
while running:
if X < 0: X = 0 if Y< 0: Y = 0 if X > 160 - 30: X = 160 - 30
if Y > 120 - 30: Y = 120-30
im = camera.take_photo('RGB', (160,120))
im.rectangle([(X,Y),(X+30,Y+30)], 0xff0000) # red outline
# check hot spot whether active
box = Image.new((30,30), 'L') # gray scale
box.blit(im, (X,Y,X+30,Y+30))
data = getdata(box, 8)

# check black
for i in range(len(data)):
if ord(data[i]) < 30 and ord(data[i]) > 0:
X += i%31 - 15
Y += int(i/31) - 15
break
# Posso passar de 3 em 3 pixels. O código fica mais rápido e a perda
# de precisão é insignificante
i = i + 2

c.blit(im, (0,0), (8,12)) # show camera

#miso.reset_inactivity_time()

14 Comments