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

  1. ##############################################
  2. # Produzido por Danilo Cesar [http://www.danilocesar.com]
  3. # Inspirado por:  http://www.bigbold.com/snippets/posts/show/636
  4. # Agradecimento a Enrico Batista
  5. ##############################################
  6. from appuifw import *
  7. from graphics import Image
  8. import camera, e32
  9. #import miso    # don’t dim the light
  10.  
  11. app.body = c = Canvas()
  12.  
  13. running = 1
  14. def quit():
  15.     global running
  16.     running = 0
  17.  
  18. app.exit_key_handler=quit
  19. app.title = u“O controle”
  20. app.screen = ‘full’   # or ‘normal’, ‘large’
  21.  
  22. def getdata(im, bpp=24):
  23.     import struct, zlib
  24.     im.save(‘D:\\pixels.png’, bpp=bpp, compression=‘no’)
  25.     f = open(‘D:\\pixels.png’, ‘rb’)
  26.     f.seek(8 +8+13+4)
  27.     chunk = []
  28.     while 1:
  29.         n = struct.unpack(‘>L’, f.read(4))[0]
  30.         if n==0: break  # ‘IEND’ chunk
  31.         f.read(4) # ‘IDAT’
  32.         chunk.append(f.read(n))
  33.         f.read(4)   # CRC
  34.     f.close()
  35.     return zlib.decompress(.join(chunk))  # ‘\x00′ prefix each line
  36.  
  37.  
  38. X = 80
  39. Y = 60
  40. while running:
  41.     if X < 0: X = 0
  42.     if Y< 0: Y = 0
  43.     if X > 160 - 30: X = 160 - 30
  44.     if Y > 120 - 30: Y = 120-30
  45.     im = camera.take_photo(‘RGB’, (160,120))
  46.     im.rectangle([(X,Y),(X+30,Y+30)], 0xff0000)   # red outline
  47.     # check hot spot whether active
  48.     box = Image.new((30,30), ‘L’)  # gray scale
  49.     box.blit(im, (X,Y,X+30,Y+30))
  50.     data = getdata(box, 8)
  51.  
  52.     # check black
  53.     for i in range(len(data)):
  54.         if ord(data[i]) < 30 and ord(data[i]) > 0:
  55.             X += i%31 - 15
  56.             Y += int(i/31) - 15
  57.             break
  58.         # Posso passar de 3 em 3 pixels. O código fica mais rápido e a perda
  59.         # de precisão é insignificante
  60.         i = i + 2
  61.  
  62.     c.blit(im, (0,0), (8,12))   # show camera
  63.  
  64.     #miso.reset_inactivity_time()
  65.  

Comments (12) left to “Smartphones: aonde podemos parar?”

  1. Enrico Batista wrote:

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

  2. Luciano Pacheco wrote:

    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.

  3. Danilo Cesar wrote:

    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

  4. Marcelo wrote:

    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

  5. Danilo Cesar wrote:

    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

  6. Braian D'Aleo wrote:

    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.

  7. behael wrote:

    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.

  8. Danilo Cesar wrote:

    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

  9. juantomas wrote:

    muy bueno. simple, sencillo, genial ;-)
    toda una inspiración para hacer más cosas con el pys60

  10. FxIII wrote:

    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 :>

  11. Eduardo wrote:

    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!

  12. Danilo Cesar wrote:

    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.

Post a Comment

*Required
*Required (Never published)