Páginas

domingo, 4 de novembro de 2012

PreviewTattoo [Visualizando sua futura Tatuagem com o Kinect]

Essa idéia veio de uma postagem no facebook de um primo que é tatuador, ele me explicou que quando é a primeira tatuagem de uma pessoa, ela fica sempre muito indecisa quanto ao seu tamanho, ou de como ela ficaria em seu corpo. Aproveitando uma disciplina da faculdade aproveitei para fazer um experimento usando Kinect, que possui o recurso de mapeamento do corpo, o que facilitou e muito o meu trabalho. No post anterior (aqui) explico de um modo rápido e prático a comunicação entre o Kinect e as bibliotecas com o processing.

No meu caso utilizei o SimpleOpenNI, por conta do mapeamento do corpo e algumas vantagens da biblioteca em si.

Então o meu primeiro passo foi detectar o esqueleto que o Kinect interpretava através da SONI. E entender como funcionava esse mapeamento.





Logo após foi identificar como eu poderia acessar cada ponto desse (Esqueleto gerado pelo Kinect), segue abaixo a lista dos nomes referente a cada ponto do corpo (como os nomes são o que realmente representam só que em inglês não vou colocar a tradução).


SimpleOpenNI.SKEL_HEAD
SimpleOpenNI.SKEL_NECK
SimpleOpenNI.SKEL_LEFT_SHOULDER
SimpleOpenNI.SKEL_LEFT_ELBOW
SimpleOpenNI.SKEL_LEFT_HAND
SimpleOpenNI.SKEL_RIGHT_SHOULDER
SimpleOpenNI.SKEL_RIGHT_ELBOW
SimpleOpenNI.SKEL_RIGHT_HAND
SimpleOpenNI.SKEL_TORSO
SimpleOpenNI.SKEL_LEFT_HIP
SimpleOpenNI.SKEL_LEFT_KNEE
SimpleOpenNI.SKEL_LEFT_FOOT
SimpleOpenNI.SKEL_RIGHT_HIP
SimpleOpenNI.SKEL_RIGHT_KNEE
SimpleOpenNI.SKEL_RIGHT_FOOT

Agora com os ponto detectados, pensei a princípio em colocar uma imagem para seguir um ponto do esqueleto (mão esquerda). Usei minha prima como modelo em um teste da aplicação. Segue abaixo algumas fotos:









Após detectar a parte do corpo e colocar a imagem para seguir a mesma, veio a parte mais complicada que foi dimensionar a imagem ao local exato que a pessoa escolher. Resolvi escolher colocar uma imagem entre os ombros e abaixo da cabeça.

A imagem que pensei em colocar foi a logo do Superman,  e aplicar a distância para dimensionar a imagem, ou seja se a pessoa estiver próxima a imagem amplia, se distante ela aumenta.

Fiz alguns testes primeiro com a câmera depth:


E para finalizar coloquei a câmera RGB e com a ajuda do Eduardo, tirei mais alguns prints. Agora já temos uma visualização real de como ficaria uma possível tatuagem neste local.


Breve postarei o video. Até a próxima!

Kinect + Processing [OSX - Montain Lion]

Neste post vou mostrar como instalar e rodar o Kinect no Mac usando o Processing.

Requisitos:

XCode: 
    Vamos precisar do Command Line Tools, para isso abra o seu XCode e, clique em xcode > Open Developer Tool > More Developer Tools, você será direcionado para o site da Apple na parte de desenvolvimento, basta fazer o login como desenvolvedor e baixar o pacote Command Line Tools.

XQuartz 2.7.2

MacPorts

CMake

Após todos esses programas instalados corretamente, é necessário baixar algumas bibliotecas:

Libtool - (Mais informações aqui)
    Abra o Terminal do Mac (Aplicativos > Utilitários > Terminal) e execute os comandos seguintes:
su - (Aperte "enter" e digite sua senha de administrador)
sudo port install libtool (Aperte "enter").

Após o termino reinicie seu Mac

LibUSB - (Mais informações aqui)
    Abra o Terminal do Mac e digite o comando abaixo:
sudo port install libusb +universal

Após o termino reinicie seu Mac

Para o Kinect existe várias bibliotecas, algumas delas (OpenNI + Osceleton e  OpenKinect), eu utilizei todas essas e preferi a SimpleOpenNi por conta de algumas funcionalidades, suporte e pela facilidade de instalar (que é somente importa-la no próprio Processing). 





Ela contém vários exemplos práticos, desde a detecção de movimentos, quanto ao mapeamento do esqueleto, boa diversão.

quinta-feira, 5 de abril de 2012

Várias fotos simulando uma foto em 3D

    Depois de ter passado a semana brincando com  diversas fotos, a idéia agora é simular uma foto 3D.
    Toda imagem 3D utiliza uma técnica para “enganar” o cérebro e fazer com que percebamos profundidade em imagens bidimensionais. Somos capazes de enxergar o mundo em 3D porque, basicamente, temos dois olhos. Como eles estão a alguns centímetros de distância um do outro, nosso cérebro capta as imagens projetadas nas retinas e "funde" em uma imagem única, com a sensação de três dimensões.
    Para juntar diversas fotos usei um aplicativo do Android chamado "Camera 3D". Após tirar as fotos você utiliza o acelerometro do aparelho e a foto vai mudando de acordo com o angulo do aparelho (é bem divertido e ele ja exporta para gif). Algumas fotos do aplicativo "Camera 3D" no Google Play.



    Sendo assim fui em busca da minha foto 3D. A primeira idéia foi tirar varias fotos de algo que se movia, pensei no ventilador…



    E assim conclui o movimento do ventilador, tirando as fotos...


     Não ficou muito legal, então olhei para o azulejo e resolvi jogar um pouco de água nele e ir mudando o celular de posição, diferente do ventilador eu que tinha que ficar parado, assim consegui montar divertido.


    Resultado Final. (gif)

  


sexta-feira, 16 de março de 2012

Soma de imagens com iluminações diferentes utilizando o Processing


Hoje vou apresentar a experiencia de somar duas imagens com iluminação diferentes e juntá-las formando uma imagem só. Let's Go!

Primeiro montei um cenário para tirar as fotos da caveira com as luzes nos seguintes sentidos:

Esquerda

Direita

Direita e Esquerda - Juntas

Obs: O motivo de tirar uma terceira foto foi realizar a comparação da soma entre as fotos da direita e esquerda, com a foto das duas luzes ligadas ao mesmo tempo.

Depois das fotos capturadas, vamos ao processing para juntá-las.


Primeiro vamos carregar as imagens que serão ser somadas e depois criar uma terceira imagem que será o resultado da soma. Depois é só percorrer todos os pixels da imagem no for e retornar a soma das imagens.



Resultado:





Note que não deu muito certo pois a foto "estourou". Isso aconteceu pois as fotos que eu tirei foi de um celular que não possui o modo M ( Manual), neste modo automático ele muda as propriedades das cores para ela tentar ficar um pouco mais amigável. Para não deixar a foto "estourada" vamos fazer com que o nosso código pegue somente as melhores cores: Vermelho, Verde e Azul (RGB). Então como solução nós vamos seguir os seguintes passos.

Depois de colocar o if para nos dizer, se o melhor vemelho é da foto direta ou esquerda e assim em diante, vamos dar um update na nova foto criada. 

Resultado:





Caso você pegue os piores, a foto ficará da seguinte maneira.



Agradecimento: Mayana Vera pela doação do Zé.












quinta-feira, 1 de março de 2012

Utilizando convolução no Processing


Antes de começarmos convolução é uma operação que representa a função de transformação a ser aplicada em uma determinada imagem. Essa combinação serve para aplicar os valos dos brilhos de uma imagem em um certo local, assim detectando as bordas de uma imagem.

Nesse exemplo iremos percorer a imagem e depois aplicar a matriz de Sobel (3x3):

Após a matriz de sobel ser declarada, iremos aplicar a convolução na imagem para a detecção das bordas. As bordas podem ser definidas como a região que faz fronteira entre determinadas cores:

Assim depois que a imagem é carregada em forma de array por conta do processing, fica simples trabalhar em matriz. Agora a matriz é percorrida e logo depois é aplicado o kernel de Sobel realizando a deteção das bordas.

Resultado Final: