Codebits 2012

Codebits VI

 

Aqui está. O evento mais esperado do ano em Portugal! A sexta edição do Codebits está a começar a aquecer os motores.

Para aqueles que não conhecem o Codebits eu vou escrever um pouco acerca do evento.

O Codebits é um evento organizado pela SAPO.PT e acreditem eles trabalham mesmo no duro para que este evento seja concretizavel. O evento além de ser gratuito, eles disponibilizam comida e bebida, oferecem um monte de brindes, montes de palestras e apresentações e os stands dos parceiros costumam ter novidades excelentes.

Este é o maior e mais geek evento técnologico em Portugal e o tempo que passamos la vale mesmo a pena.

Este ano o evento vai ser realizado no mesmo lugar que no ano passado mas ao que parece vai sofrer algumas alterações que tudo aponta que seja para melhor! Por exemplo em vez de uma parede preta a dividir o palco principal do restante espaço do evento vão colocar uma cortinha semi-transparente de modo a que se possa sempre saber o que se passa no palco.

Como em todos os anos vai existir o concurso de programação de 24Horas em que são mostrados sempre projectos incriveis e tem prémios excelentes (eu ate dispensava os prémios, a minha participação é sempre a lutar pelo trofeu do codebits que a meu parecer deve ser um prestigio enorme poder leva-lo para casa!

Como é normal apenas 800 geeks vão poder participar e serão escolhidos através de uma pré-seleção, por isso mantenham-se atentos ao site!

Alterar o tamanho de todos os componentes numa java.awt.Frame em Java

Quando estamos demasiado habituados a uma linguagem de programação por vezes automatizamos alguns procedimentos…

Eu vinha de um background em C# e agora estou a fazer umas tarefas em JAVA e deparei logo com algumas diferenças “subtis”.

Tarefa: Alterar o tamanho de todos os componentes e respectivas fontes dentro de uma dialog composta por uma java.awt.Frame.

Depois de algumas tentativas aqui esta o código com que consegui obter resultados:

protected void changeContent(Container parent) 
{
    for (Component comp : parent.getComponents()) 
    {
        changeFont(comp);
        comp.setMaximumSize( new java.awt.Dimension(comp.getWidth()*2, comp.getHeight()*2) );
        comp.setPreferredSize( new java.awt.Dimension(comp.getWidth()*2, comp.getHeight()*2) );
        comp.setSize( comp.getWidth()*2, comp.getHeight()*2);
        if (comp instanceof Container) 
        {
            changeContent((Container)comp);
        }
    }
}
protected void changeFont(Component comp) 
{
    AffineTransform at = AffineTransform.getScaleInstance(2, 2);
    if (comp.getFont() != null)
    {
        Font font = comp.getFont().deriveFont(at);
        comp.setFont(font);
    }
}

 

No meu caso, estas duas pequenas funções resolveram os meus problemas. Como é obvio no constructor do formulário coloquei no parametro do ChangeContent() o objecto que representava a Frame.

Arduino + WebCam = Volumetria

Um dos projectos que tenho trabalhado ocasionalmente nos ultimos meses foi arranjar maneira de medir volumes com material “low-cost”!

Pensei no desafio e comecei a meter mãos ao trabalho e consegui resultados surpreendentes a usar um webcam comum e um arduino com um sensor.

Para começar vamos falar do hardware:

– Arduino + Sharp Distance Sensor GP2Y0A02 (20-150cm)  : Devo dizer que pensei que era o mais simples mas falhei redondamente.

Para conseguir resultados aceitaveis (cerca de 1 centimetro de desvio em distancias perto do limite do sensor) tive de seguir um conjunto de procedimentos manhosos isto porque o sensor tende a retornar montes de ruido e assim não temos resultados precisos.

Primeiro faço 10 leituras do valor e determino a media, seguindamente determinamos o limite superior e inferior de valores a partir desta primeira media, exluimos os valores que ultrapassam este valor capturamos mais uns 10 valores e fazemos a media de tudo.

Devo dizer que isto resultou muito bem

 

float GetAverage(float * _values, uint8_t size)
{
	float avg = 0;
	for(int i = 0; i< size; i++)
	{
		avg += _values[i];
	}
	avg = avg / size;

	float setMax = avg * 1.15;
	float setMin = avg * 0.85;
	float precisionAvg;
	int counter = 0;
	for(int i = 0; i < size; i++)
	{
		if((setMin < _values[i]) && (_values[i] < setMax))
		{
			precisionAvg += _values[i];
			counter++;
		}
	}
	return precisionAvg / counter;
}

Para conseguir volumetria usei a biblioteca Emgu e uns quantos filtros para conseguir encontrar os contornos do objecto com base numa mascara. Ou seja temos de ter uma mascara do ambiente de fundo para poder fazer a exclusão do que ja la estava e ficarmos apenas com o novo objecto na imagem. Usamos uns quantos truques de image processing, uns calculos trigonometricos e voilá aqui esta o resultado  

Smart Defrag

Durante uma semana andei as voltas no meu portatil no escritório a tentar desfragmentar o disco, todos os dias a noite fazia uma tentativa e por e simplesmente não melhorava nada e a cor vermelha no desfragmentador do disco dominava o gráfico.

Hoje decidi procurar ferramentas para fazer desfragmentação e encontrei uma que me pareceu apelativa

Smart Defrag 2:

Até agora os prós nesta aplicação são:

-consome poucos recursos
-é pequena
-extremamente rápida
-eficiente
-freeware

Os contras:
-Temos de ter em atenção na instalação para não instalar tralha que não necessitamos!

Relativamente à utilização, é uma aplicação muito simples, poucas opções mas mesmo assim as poucas que tem são capazes e cobrir todas as necessidade

O Smart Defrag permite-nos fazer 3 tipos de desfragmentação:

– Desgragmentação
-Desfragmentação com Optimização Rápida
-Desfragmentação com Optimização Completa

Basicamente isto permite escolher a velocidade da desfragmentação e a sua eficiência. Um aspecto muito curioso neste software é que ele analisa quais os ficheiros e pastas mais usados e move-os para as localização mais rápidas do disco.

Também é de salientar que existe a possibilidade de manter a desfragmentação constantemente a correr em background e também a possibilidade de fazer desfragmentação no boot de modo a que ficheiros que geralmente ficam lockados no arranque do sistema!
A partir de hoje este programa vai ser um software obrigatório para instalar nas minhas maquinas!

Podem fazer o download aqui

meo|kinect @ codebits 2011

Mais uma vez o SAPO Codebits 2011 foi bestial, o unico senão foi a minha apresentação de projecto que teve de passar por “pequenas” dificulades.

Bom vou então falar do pojecto e depois da desastrosa apresentação

Meo|Kinect

Um dia antes do concurso vi na pagina do codebits o seguinte post e no post logo a seguir a falarem que estaria la uma equipa da Microsft para dar o suporte necessário!

ora bem: 1+1= meo|Kinect

O objectivo estava decidido,  fazer um interface entre o kinect e a meo box usando um pc no meio para fazer a comunicação entre os dois dispositivos

Desde o primeiro dia o Gonçalo Basto (um os membro da minha equipa), estava a fazer uns widgets para a meo box de modo a que pudéssemos explorar ainda mais o uso do kinect. Falamos várias vezes com o pessoal da PT Inovação, Microsoft,  sapo.labs teams e gradualmente fomos nos apercebendo que teríamos de mudar de ideias e que a apresentação no Main Stage estava um pouco comprometida. Disseram que não era impossível fazer a apresentação com uma box no palco, e que isso iria dar algum trabalho a organização. E as ultimas palavras que nos deram foi:
– Mantém-te em contacto connosco que nos vamos ver o que podemos fazer, entretanto falem com a organização.

Perdemos bastante tempo de desenvolvimento com estas questões burocráticas.

Mesmo assim conseguimos desenvolver o interface de gestos usando hotspot que iriam enviar comandos para a box. O tempo para terminar o pojecto estava a terminar mas conseguimos ir testar os resultados finais no equipamento de demonstração da PT Inovação.

Foi um sucesso, mas apenas faltavam 4 horas para a apresentação e nada estava feito para nos no palco.

Fomos para o palco para testar tudo 1 hora antes das apresentações e só nessa altura mandaram alguém ir buscar um router a meo com um cabo de rede e uma box. Montaram tudo mas mesmo assim não estava a funcionar.

Falei com o  Celso sobre as nossas dificuldades e ele disseque era tarde demais para resolver problemas destes. Eu disse-lhe que andava desde quinta-feira a tentar resolver este problema e expliquei a nossa situação. Ele agarrou no telefone e disse que ia ver o que era possível fazer…mas que não prometia nada.

 

Estava desesperado….O resto da nossa equipa desmotivada, pensei em desistir, mas alguém da organização apareceu e disse que iriam fazer com que fosse possível apresentar a nossa aplicação.

O Miguel Vicente da Microsoft, a quem a nossa equipa agradece por toda a atenção, esteve sempre a dar-nos bons conselhos e a dizer para não desistir-mos, a PT Inovação estava muito interessada que a apresentação fosse feita e de repente, fez luz e as coisas começaram a acontecer.

A organização moveu o nosso projecto para o ultimo da lista a ser apresentado para dar mais um tempo extra, a PT Inovação enviou um membro da equipa deles para fazer o setup no palco, e ficamos no chão a frente do palco a configurar todo o hardware e a rede para que tudo funciona-se na apresentação, apesar de não estar nada testado e não sabermos se as coisas iriam funcionar.

Acabamos o setup quando faltavam 5 minutos para a nossa vez no palco, o nosso “porta-voz” estava muito nervoso e nos não acreditávamos que tudo pudesse funcionar mas FUNCIONOU!!!, contudo o nosso orador estava sobre uma pressão enorme acreditando que tudo ia falhar diante aquelas 800 pessoas e acabou por não conseguir fazer o melhor discurso na apresentação… bloqueou e só disse palha para encher os 90 segundos… A apresentação que preparamos acerca de fazer da TV Interactiva um novo conceito, falar acerca do reconhecimento de gestos e voz, um novo mercado possível, etc tudo foi deixado de lado e ficamos a ouvir apenas: “como podem ver eu vou-me mexendo e tal, e entrei num menu… isto é porreiro porque até da para fazer exercício…”

A apresentação foi um fracasso, embora tudo estivesse funcional.

Quero então agradecer a toda a organização do codebits que fizeram o impossível acontecer, a equipa da PT Inovação por nos terem dado uma valiosa ajuda (não é todos os dias que metemos um dos top developers de Portugal em MediaRoom, no chão a configurar DNS’s), ao Migue Vicente por toda a motivação que nos deu, a para a minha equipa que apesar de grande pressão até se portou bem.

Mais tarde irei publicar aqui o projecto, incluindo vídeos dele a funcionar.

Foi um excelente codebits e um desafio brutal.

Codebits 2011 is comming…

O maior evento para nerds, techies e geeks esta a chegar novamente.

Faltam apenas 2 dias para começar o codebits!

Sim, vai haver um concurso de 48 horas de programação
Sim, vai haver um quiz
Sim, vão haver livros da O’Reilly
Sim, vai haver montes de comida e bebida
Sim, vão haver arduinos
Sim, vai haver Tacos Nucleares
Sim, CODEBITS FTW!

e não, não devemos dormir!

Estejam atentos…!

Shell Scripting

Pela primeira vez em 10 anos de programação, pediram-me para codar um script shell para fazer um monte de operações

Nunca tinha feito antes mas passado algumas paginas de pesquisa percebi que era bastante simples até.

Uma das coisas que me ajudou muito foi esta cheat sheet. Extremamente útil para saber como fazer as operações mais básicas.

Também encontrei um problema no meio disto tudo: Como fazer dump de uma base de dados pg que esta numa maquina remota através de shell scripting?

Bom, encontrei uma boa maneira de seguir em frente graças ao site  www.stackoverflow.com. Portanto aqui esta um pequeno exemplo de como é possível fazer isso:

ssh $USERNAME@$HOSTNAME "pg_dump -f /dev/stdout -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql err=$? if [ $err -ne 0 ]; then   echo "Dump failed with error code ${err}!" fi

Então é pratico ou não?

A Primeira Demo

Ok, aqui fica a minha primeira demonstração… É so uma coisa simples, basicamente tenho 2 views uma com o VideoStream RGB e outra com o DepthFieldStream.

É um exemplo bastante semelhante ao tutorial do Channel9 com alguma alterações pelo meio. Por exemplo não estou a usar apenas 3 distancias chave para desenhar as cores, em vez disso implementei a coloração em escala de cinzentos dependendo da distancia, assim da um efeito mais agradavel

Aqui esta o video:

Kinect + Emgu

Descupem lá a inactividade nos ultimos tempos. mas ter um trabalho a tempo inteiro e ter namorada as vezes deixa-nos sem tempo.

Comecei a brincar com Computer Vision e Kinect, não fiz grande coisa e desconhecia por completo como CV funciona e depois de ler um um pouco soube que o Emgu é um grande wrapper para a biblioteca do OpenCV.
De facto é possivel fazer reconhecimento facial sem grandes stresses.
Vamos la meter as mãos à obra neste biblioteca
Para este exemplo precisamos de:
e para tornar as coisas ainda mais faceis Coding4Fun Kinect Toolkit
Este ultima dll é excelent para passar os dados raw do kinect para bitmaps
Recomendo vivamente a lerem a documentação do Emgu, pode ser tricky para usar.
Então vamos começar por criar um novo windows project, depois vamos inserir todas as referencias
Adicionamo o Microsoft.Research.Kinect que pode ser encontrado nas referencias .NET. Depois é Coding4Fun dll, e todas as dlls necessarias para o Emgu.
Como podem ver o Emgu tem montes de referencias na pasta bin e devem colocar tambem as unmanage libraries como a
cvextern.dll, opencv_calib3d220 e por ai a fora… Como já referi, leiam a documentação do emgu…
Na vista de design adicionei o controlo EmguCV.UI.ImageBox e chamei-o de imageBox1.
No codigo adicionei isto:
using Emgu.CV;
using Emgu.CV.UI;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV.CvEnum;
using Microsoft.Research.Kinect.Nui;
using Coding4Fun.Kinect.WinForm;
Estes são os usings que necessitam
e para isto tudo funcionar precisam destes objectos
Kinect.Nui.Runtime,
Emgu.CV.Image
e visto que vamos tentar detectar caras usando o algoritmo HaarCascade vamos usar o objecto HaarCascade.
O algortimo HaarCascade necessita de um ficheiro xml para aprender os padrões de moo a reconhecer caras, existem montes de ficheiros desses na internet e podem criar o vosso proprio ficheiro usando este  guia como exemplo (Existem muitos mais guias acerca deste topico)
ok então…
haar = new HaarCascade("haarcascade_frontalface_alt_tree.xml");

vai pupolar o objecto haar com o ficheiro xml

Bom agora vamos inicializar o kinect. Para isto apenas necessitamos da camera RGBpor isso vamos usar r RuntimeOption.UseColor.
Precisamos tambem de criar  evento VideoFrameReady para conseguir capturar a imagem e de seguia abrimos um VideoStream
Para quem não esta familiarizado com o metodo VideoStream.Open,  ele suporta 4 parametros: ImageStreamType, poolSize (o valor minimo é  2, isto vai funcionar como backbuffer para gravar dados em memoria), ImageResolution e finalmente ImageType:
kinect.Initialize(RuntimeOptions.UseColor);
kinect.VideoFrameReady += new EventHandler(kinect_VideoFrameReady);
kinect.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
e pronto, o constructor deve ter este aspecto:
public Form1()
{
      InitializeComponent();
      haar = new HaarCascade("haarcascade_frontalface_alt_tree.xml");
      kinect.Initialize(RuntimeOptions.UseColor);
      kinect.VideoFrameReady += new EventHandler(kinect_VideoFrameReady);
      kinect.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
}

Agora que ja temos o event hanler do VideoFrameReady, ele vai receber no ImageFreameReayEventArgs todos os dados relevantes acerca da imagem. A primeira tarefa vai ser converter a imagem capturada num bitmap e converte-la outra vez para uma imagem do Emgu, de modo a podermos processa-la

 

 

 Image kinImage = new Image(e.ImageFrame.ToBitmap());
Ok ja temos uma image RGB no emgu e agora temos de converte-la para uma imagem em escala de cinzentos de modo a que o processamento do Emgu seja feito com melhor performance
Image grayframe = nextFrame.Convert();
e usamos o haarcascade para detectar todas as faces num determinado frame
 grayframe.DetectHaarCascade(
                                    haar, 1.4, 4,
                                    HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                    new Size(grayframe.Width / 8, grayframe.Height / 8)
                                    )[0];
…desenhamos um rectangulo a volta de cada face
  foreach (var face in faces)
{                         
    nextFrame.Draw(face.rect, new Bgr(0, double.MaxValue, 0), 3);                    
}
e finalmente desenhamos a imagem na imageBox1
imageBox1.Image = nextFrame;
para quem não gosta de ter trabalho aqui esta a source completa para fazer copy/paste:
void kinect_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
      {
            Image kinImage = new Image(e.ImageFrame.ToBitmap());
            using (Image; nextFrame = kinImage)
            {
                if (nextFrame != null)
                {
                    // there's only one channel (greyscale), hence the zero index
                    Image grayframe = nextFrame.Convert();
                    var faces =
                            grayframe.DetectHaarCascade(
                                    haar, 1.4, 4,
                                    HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                    new Size(grayframe.Width / 14, grayframe.Height / 14)
                                    )[0];
                    foreach (var face in faces)
                    {
                        nextFrame.Draw(face.rect, new Bgr(0, double.MaxValue, 0), 3);
                    }
                    imageBox1.Image = nextFrame;
                }
            }
        }
Como podem ver é codigo facil 😀
podem fazer o download do ficheiro .cs
Aqui esta uma demo deste codigo a funcionar, peço desculpa pelo framerate baixo, o software de captura que usei é muito mau, tambem a luminusidade não é a melhor mas são 2 a manha e a minha namorada ja dorme no sofa ao meu lado por isso é melhor não meter mais luz a menos que queira levar com o rolo da massa.
No entanto é um excente proof-of-concept pois mesmo com má iluminação funcionou :)
Em excelentes condições de luminusidade a detecção de faces funciona na perfeição

Kinect SDK + EmguCV

Acho que é melhor começar pelo basico

Vamos la tentar fazer login na aplicação atráves de detecção de faces :)

Hoje vou começa a criar alguns controlos para brincar com o kinect. O primeiro vai ser um controlo para login, acho que vai ficar brutal sobretudo se fizer reconhecimento facial e reconhecimento de voz para inserir a password.

Mais tarde irei colocar codigo sobre estes controlos :)