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

  1. Bacana hein Danilo?
    Valeu pelos agradecimentos.
    Abraço.

    Posted on 05-Dec-06 at 8:21 am | Permalink
  2. Cara bem legal a sua idéia, tenta vender a sua idéia para a Nokia, que quase não tem touchscreen em seus aparelhos. :)

    Sobre o programa mais legal ainda :) pois com poucas linhas de código você conseguiu fazer algo realmente impressionante.

    Eu realmente acho que você deve tentar investir nessa idéia, pois é promissora.

    Até mais.

    Posted on 05-Dec-06 at 11:35 am | Permalink
  3. Danilo Cesar

    Valeu Rico! =)

    Pois é Luciano… Realmente faltam smartphones da Nokia com touchscreen.

    Quanto à vender a idéia: Já devem existir protótipos para esta idéia. Mas como eu disse, os celulares (e mesmo nossas webcams) não estão preparadas para isso. Mas é uma questão de tempo.

    Quero ver se eu consigo uma webcam emprestada de alguém para jogar este script em uma máquina desktop e ver como que fica…. Creio que com algumas optimizadas e uns hacks com a libX já é possível controlar o mouse sem problemas…

    []’s
    Danilo

    Posted on 06-Dec-06 at 11:39 pm | Permalink
  4. Olá,

    Fico feliz em ver experimentos com o pys60. Publique ele no pys60 snippets, e ajude a divulgar ainda a mais a linguagem nos telefones symbian.

    A nokia realmente apesar do suporte do symbian, deixou os touchscreen com stylus de fora (teoricamente agora que ela matou a serie 90, já que o 7700 e o 7710 sao series “60 com stylus), o que ao meu ver não é de todo mal (e olha que trabalho com o 770, justamente bolando formas de não usar a stylus de tão chato que é digitar coisas com ela) e utilizou touchscreen somente em um aparelho chines com reconhecimento de escrita para aquela lingua.

    agora uma pergunta : como seria o click nesse seu approach?

    Abs!

    Marcelo Eduardo,

    http://www.marceloeduardo.com

    Posted on 11-Dec-06 at 4:57 pm | Permalink
  5. Danilo Cesar

    Olá Marcelo,

    Foi um prazer ver seu post aqui, visto que acompanho seus textos desde os tempos do javafree.
    Então, tinha duas idéias mas não tinha equipamento para tal.

    Coloquei ante-ontem no snippets, por sinal achei q tinha visto o código de lá. Por sinal, aprendi a mecher com a camera atrás do snippet.

    Quanto a uma solução para o click:
    A primeira é bluetooth. Exelente, mas queimaria a bateria do celular rapidamente e como naqueles fones bluetooth, exigiria ficar recarregando. O que não é bacana.
    A segunda opção seria colocar na ponta da caneta um led vermelho. Uma solução bem mais simples, mas dependeria do ambiente. A parte boa é que a bateria destes “chaveiros” duram uma eternidade… =)

    Alguma outra idéia?

    []’s

    Danilo Cesar

    Posted on 11-Dec-06 at 9:00 pm | Permalink
  6. Muy buena idea, hace un tiempo habiamos visto algun que otro mouse con semejanzas.
    Tiempo adelante vimos al juego Mosquitos (italiano) en donde el background era lo que nuestra camara estaba mirando.

    Yo tuve hace un tiempo un Nokia 6600, y me arrepiento de haberlo vendido.
    Hoy dia poseo un Sony P910i, y te digo que con algunos tips no le gana por mucho a dicho Nokia.

    Te invito a que visites nuestra pagina, sos bienvenido.

    Posted on 15-Dec-06 at 3:15 am | Permalink
  7. behael

    Err, uhmm isso ja existe :(. Tanto por motion detection quanto por localizacao do sinal sonoro na tela. Por som, temos uma touchscreen sem telas resistiva ou infra-vermelho, quando vc toca na tela, tres detetores sonoros triangulam o sinal e o software responsavel faz o click nessa area, ou move o cursor ou qualquer outra coisa.

    Posted on 18-Dec-06 at 6:26 pm | Permalink
  8. Danilo Cesar

    Sim Behael, acho que todos sabemos que isto é um motion-detect… =)

    Mas o que não existe é uma implementação para motion-detect funcional feita usando apenas o celular que pudesse substituir o teclado por exemplo. É ai que eu queria chegar.
    Agora esse por som eu não conhecia. Seria interessante que você nos deixasse um link sobre o assunto =)

    []’s

    Posted on 18-Dec-06 at 10:36 pm | Permalink
  9. muy bueno. simple, sencillo, genial ;-)
    toda una inspiración para hacer más cosas con el pys60

    Posted on 30-Jun-07 at 4:19 pm | Permalink
  10. FxIII

    Hi just two question:
    why did you gray scale through file saving?
    may save in z: which is a ram filesystem may be better?
    greyscaling image by calculate a mean (weighted) isn’t better?
    why did you not use camera.start_finder(finder_callback)?
    once you are using a low res image with the same finder_calback’s size

    ciao belli
    Fabio dall’italia con furore :>

    Posted on 26-Aug-07 at 1:18 pm | Permalink
  11. Eduardo

    Fala Danilo, tem muito tempo esse seu post, mas esse seu codigo me ajudou a resolver um problema para encontrar padroes de cores no celular usando a camera. Como nosso amigo ja comentou acima, usei a função que faz o blit da imagem da camera pelo start_finder, ao invés de usar o blit direto da imagem salva no canvas. Dessa forma a aplicação rodou bastante bem para o celular que estou testando( nokia 6600 ).
    Uma pergunda(ja feita anteriormente): Porque usar o grayscale salvando a imagem? Parabéns pelo trabalho simples e eficiente!

    Posted on 22-Jul-08 at 6:05 pm | Permalink
  12. Danilo Cesar

    E ae Eduardo, valeu o comentário…

    Bom, não leve a programação muito em conta. Este foi meu primeiro contato de verdade com Python. A aquisição da imagem eu segui um tutorial na net, então era a única forma que eu conhecia.

    Sem dúvida seu método é melhor, mas talvez salvar no Z também deixe o programa mais rápido.
    Quanto ao grayscale teve um motivo: Operações em uma única banda de cor é mais rápida do que em 3.

    Posted on 23-Jul-08 at 2:11 am | Permalink
  13. Hi,

    I developed a script based on your code above, but it uses finder instead of take_photo. Have a look at http://www.maulanakurniawan.com/files/camera-finder.py

    Thanks

    Posted on 31-Jan-09 at 4:13 am | Permalink
  14. hasan

    can you put .py file on this page bcoz when i tried to run this code on my 6630, it gives me indendent code problem

    Posted on 29-Jan-10 at 7:26 pm | Permalink

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*