Geek-Press Geeky Blog about software development

18Nov/120

Codebits VI e o projecto PNSCodebits VI and the project PNS

Mais um codebits se passou!

Mais um ano cheio de coisas boas, boas talks, bons projetos, bons brindes.....

Este ano trouxe comigo o André Gil, Claudia Frutuoso e o Gonçalo Basto para fazer um projeto engraçado.

O Projeto chama-se PNS - Personal Notification System.

O conceito é simples, um device que pode ser adicionado a qualquer peça de vestuário ou acessório que permite uma ponte de comunicação entre o utilizador e o seu telemóvel via bluetooth.

Este device permite então interagir com o telemóvel sem ter de o retirar do bolso, o que pode ser útil durante a nossa sessão de jogging, uma reunião enquanto conduzimos ou até mesmo numa situação em que expor o nosso telemóvel em publico pode não ser a nossa intenção.

 

Desse modo podemos programar padrões em leds RGB que nos permitem identificar o que estamos a receber no nosso telemóvel: por exemplo um twitt, um post no facebook dirigido a nos, um SMS, uma chamada de uma determinada pessoa. Podemos também programar cada botão para executar uma ação no telemóvel. Assim podemos, rejeitar ou encaminhar uma chamada, enviar uma mensagem de volta a quem nos ligou a dizer que não podemos atender de momento, enviar um twitt ou post no foursquare com a nossa localização geográfica, podemos até programar um botão para verificar o estado do tempo na internet e mostrar numa sequencia de leds como estará o tempo.

O limite entre as coisas podemos fazer com este dispositivo e um smartphone é a imaginação.

Para que este serviço possa ser usado tanto por utilizadores avançados como basicos, por trás deve existir um pagina de uma comunidade de utilizadores onde seria possível colocar code snippets onde o utilizador pode fazer download desses snippets para o telemóvel e depois assigna-los ao nosso dispositivo.

Para a realização deste projeto usamos um telemóvel android, um arduino Uno, um modulo bluetooth e uma webapp feita com Ink.

Como é óbvio um dispositivo com estas características tem de ser pequeno e de fácil modularização e a versão final do nosso prototipo era tudo menos pequeno mas funcional!

Se estiverem interessados em saber mais acerca deste projeto não hesitem em contactar-me 🙂

 

Another Codebits happened!

Another year full of good things, good talks, good projects, good gifts .....

This year brought me André Gil, Claudia Frutuoso and Gonçalo Basto to make a funny project.

The project is called PNS - Personal Notification System.

The concept is simple, a device that can be added to any garment or accessory that allows a communication bridge between the user and your mobile phone via bluetooth.

This device allows you to interact with your phone without removing it from your pocket, which can be helpful during our jogging session, a meeting, while driving or even in a situation where expose our phone in public is not our intention.

Thus we can set patterns for RGB LEDs that allow us to identify what we are receiving in our mobile phone:  for example a twit, a post on facebook directed at us, a SMS, a call from a certain person. We can also program each button to perform an action on your phone. We can reject or forward a call, send a message back to whoever called us to say that we can't currently talk, send a twitt or foursquare  post with our geographical location, we can even program a button to check the status of the weather on the internet and show a sequence of LEDs as the weather will be.

The boundary between the things we can do with this device and a smartphone is your imagination.

This device can be used by both advanced or basic users,  there is a page like a user community where you could add your code snippets where you can  share to the others or download them to your phone and then assign them to our device .

To carry out this project we used a android phone, an Arduino Uno and a bluetooth module as well as a webapp created using Ink.

Obviously a device with these features has to be small and easy to customize and the final version of our prototype was anything but small although functional!

28Aug/120

Mais um projecto que já rola!Another project is already rolling out

A uns meses atrás o Nuno Ferro convidou-me a ajuda-lo a participar num projecto interessante.

A ideia é fazer uma plataforma de aluguer de bicicletas em que as bicicletas estão colocadas em diversos pontos de uma determinada localidade com auxilio de uns devices engraçados que permitem apenas aos utilizadores com um cartão, devidamente carregado com saldo, levantar as bicicletas para darem as suas passeatas.

Aqui esta o resultadoA few months ago Nuno Ferro has invited me to collaborate with him in an interesting project.

The main idea is a rental platform for bikes that are spread in a certain location. With the help of some funny devices the user with a card, that should have funds, can take a bike for a ride.

Here is the result.... (this is in portuguese... sorry)

19Jun/120

Arduino + WebCam = VolumetriaArduino + WebCam = Volumetry

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

 One of the projects I have worked occasionally in recent months was finding a way to measure materials volumes with "low-cost"!

I thought about the challenge and started to get down to work and got amazing results using an ordinary webcam and a sensor with an Arduino.

To begin with let's talk about hardware:

- Arduino + Distance Sensor Sharp GP2Y0A02 (20-150cm): I must say I thought it was the easiest but failed miserably.

To achieve acceptable results (about 1 cm of deviation in distances near the limit of the sensor) I have had to follow a set of procedures that's tricky because the sensor tends to return lots of noise and so we do not have accurate results.

First I do 10 readings and determine the average value, then determine the upper and lower limit values ​​from this first average, capture another 10 and make the average ​​of all the values.

I must say it worked really well

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;
}

To achieve volumetric measuring I used Emgu library and a few filters  to find the contours of the object based on a mask. In other words we must have a mask from the background in order to make the exclusion of what it already was there and just stay with the new object in the image. We use a few tricks of image processing, some trigonometric calculations and voila here is the result

 

14Nov/110

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.

SAPO Codebits 2011 was great, as always, but I found my project presentation a "little bit" compromised by some evil events

First of all I will talk about the project itself and then I'll talk about the disastrous presentation.

Meo|Kinect

Probably you don't know what "Meo" is unless you're at Portugal.
Meo is a triple play service provided by Portugal Telecom (the main telco in Portugal). It gives you IPTV, broadband ADSL from 6 to 200Mbps and Voice Service.

To watch IPTV the hardware required is a Router Thomson and a Scientific Atlanta’s KMM3000 IPTV Set or similar model!
These boxes contain a WinCE as base OS with Microsoft MediaRoom. Microsoft MediaRoom is a extremelly closed software with a lot of license policies around it. Only the service providers and special licenced developers have access to the MediaRoom SDK so basically this is a Black Box.

 

It is possible to send commands that are remote like keys to the box with telnet and send  post via an http a request to open applications.

 

Now that you are more aware of what is the Meo Service I can go on and explain what was my concept:
One day before the contest on the codebits webpage there was a post mentioning that there would be a team helping to develop for this boxes and giving full support, also I saw that a microsoft team would be there too to help on Kinect based projects.

1+1= meo|Kinect

So I was interested in interfacing the kinect gestures with the meo box using a PC in the middle!

 

Since day one Gonçalo Basto (one of my team members) was doing some widgets for the box in order to explore the kinect use in the box with interactive widgets. We talked several times with PT Inovação, Microsoft,  sapo.labs teams and our ideias should be partially changed and the presentation on the main stage seemed a "little bit" compromised. They said that it wouldn't be  impossible but would require some work from the organization to do it. "Keep in touch we will try to handle that, also try to talk with the organization".

We put a lot of efford on that part reducing the development time and the solutions were getting delayed time after time.

We got the interface recognizing the gestures using hotspots on the computer screen that would send nice and clean commands to the box and time to end the project was near at the end when I finally went to test it on a test environment with all the required hardware and network configurations.

It was a success. But we were only 4 hours away from the presentation and nothing was done on stage.

We went there to test the main stage environment 1 hour before and they sent someone to put a network cable on the router and do the magic but it wasn't working at all

I talked with Celso about our issues and he said... "that's too late for such things" and I replied that we passed 3 days trying to get someone to help us. Celso grabbed his cellphone and said "I'll see what I can do for you although I can't promise you nothing it's less than a 1 hour for the presentations"...

 

I was desperate....the team wasn't motivated, I was thinking about giving up, and someone from the organization told me, "we will make that happen"

Miguel Vicente from Microsoft, which I most send kudos to him, was always giving us good advices and telling to not give up, PT Inovação Team was really interested in make that happen too. And suddenly magic things started to happen.

The organization moved our project to the last one on the list so we could win some time, PT Inovação sent a guy to do the set up, and we where literally laid down in front of the stage configuring all the necessary component to make the presentation... even if it was untested.

We finished all the set 5 minutes before our turn on stage and our presentation guys was insecure has I have never saw him. We didn't believe that it would work on stage and IT DID WORK, but our orator was under a lot of pressure believing that it would never work and he was speechless.... all the presentation we trained, all the talk about making Interactive TV a new concept, the speech recognition features, the new market that could be possible to gain with such features... all was left behind and all we heard about it was: "As you can see I can go to the menus, and do some workout as I do it!"

The presentation was a failures dispite the demo worked after all.

I give my sincere thanks to all the Codebits organization to make the impossible happen, to PT Inovação for giving us a big help and for having one of the top techs on MediaRoom in Portugal laid on the ground in front of 800 persons just to help to configure the DNS hosts, to Miguel Vicente for all the motivation he gave us, and to my team that was under a great pressure due to all our missfortune events.

Soon I will publish more about this project including videos of it working.

It was a great codebits and a great challenge.

26Jul/110

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

If you want any piece of code please just comment and I'll post it here 😉

Ok, so here is my first demo... Simple stuff, basically I have 2 views, one with the RGB VideoStream and another with the DepthFieldStream.

Pretty similar to the one of the Channel9 tutorial with some  minor changes like I'm not using 3 diferent distance keys to draw the colors and implemented a grayscale colouring depending on the distance.... so it becomes a very smooth...

Here's a vid about it

Tagged as: No Comments
26Jul/117

Kinect + Emgu

Sorry about the inactivity but having and a daytime job and girlfriend sometimes leaves us without time.

Started to play with Computer Vision and Kinect, didn't done a big thing but I was completly unaware of how CV works and after reading a while about it I hear that Emgu is a great wrapper for openCV library.
In fact you can do some face detection without any worries at all.
So let's do a hands-on on this library
For this example you need
Microsoft Kinect SDK
Emgu Wrapper
and to make things even more easier Coding4Fun Kinect Toolkit
This last one is great for helping to pass the kinect raw data to bitmaps
I strongly recommend to read the Emgu documentation before using it... it may be tricky
So let's start by creating a new windows project, after that it's time to add the references.
Add the Microsoft.Research.Kinect reference that can be found on the .NET references and then the Coding4Fun dll, and all the dlls needed for Emgu.
As you can see Emgu as lots of references and on the bin folder you should add the unmanaged libraries like
cvextern.dll, opencv_calib3d220 and so on... As I said before check the Emgu documentation to know what to do...
On the design view I added a EmguCV.UI.ImageBox and called it imageBox1.
On the code I added
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;
This is all the using you will need to a simple a Face Detection.
To make this work we will need 3 objects
Kinect.Nui.Runtime,
Emgu.CV.Image
and since the face detection will use the HaarCascade Algorithm we will use the HaarCascade object provided by Emgu
HaarCascade algorith need an xml file from where it will learn the patterns to recognize a face, there are a lot of files for face detection over the internet and you can create your own following this guide as an example (there are lot's of other guides covering this topic)
so
haar = new HaarCascade("haarcascade_frontalface_alt_tree.xml");

will populate the the haarCascade object with that file.

Then it's time to initialize the kinect. For now I will only need the RGB camera so I will use the RuntimeOption.UseColor.
We also need to create the event VideoFrameReady in order to get the frames we are working with and finally open the VideoStream.
For those who are not familiar with VideoStream.Open, it will support 4 parameters, the ImageStreamType, poolSize (the minimun value is 2, this will work as a backbuffer for storing data in memory), the ImageResolution and finaly the ImageType:
kinect.Initialize(RuntimeOptions.UseColor);
kinect.VideoFrameReady += new EventHandler(kinect_VideoFrameReady);
kinect.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
and this is it... the complete constructor should look like this:
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);
}
Now when there is a VideoFrameReady the event will be fired and call kinect_VideoFrameReady method. it will receive the sender and an ImageFrameReadyEventArgs where you can find the image data generated by the sdk
The first task will be convert the captured image to a bitmap and convert it again to a Emgu image so it can be processed
 Image kinImage = new Image(e.ImageFrame.ToBitmap());
this does the trick!
then using the Emgu colored image we will process that nasty face detection
So we will convert the the Colored Emgu Image to a Grayscale one (better for image processing):
   Image grayframe = nextFrame.Convert();
and then we will retrieve all the faces detected on that frame using the haarCascade:
 grayframe.DetectHaarCascade(
                                    haar, 1.4, 4,
                                    HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                    new Size(grayframe.Width / 8, grayframe.Height / 8)
                                    )[0];
and finally for each face detected we will get the face rectangle and draw it over the initial image,
  foreach (var face in faces)
                    {                         
nextFrame.Draw(face.rect, new Bgr(0, double.MaxValue, 0), 3);                    
 }
and finally set the image to the imagebox1.
imageBox1.Image = nextFrame;
for the lazy ones here is who like to copy paste without understanding the code (can't figure why they do it) here it goees:
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;
                }
            }
        }
So as you can see easy code 😀
you can download the .cs file with all the code needed to do it
Here is a small demo of how it works, i'm sorry about the low framerate (my capture software sucks) and bad light conditions but it's already 2am and my girlfriend is sleeping next to me so it's better to don't have more light.
But it's nice too see that it still can detect my face in such bad lightning conditions 🙂
with good lightning, the detection occurs flawlessly

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:
Microsoft Kinect SDK
Emgu Wrapper
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

Tagged as: , 7 Comments
26Jul/113

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 🙂

I guess that it's better to start with the basics

Let's try to login in our application with face recognition 🙂

Today I will start creating some controls to play with kinect. The first one will be a Login Control and I thought it will be great if I create a face recognition for use, and speech recognition to insert the password.

Later on I will post some code and the control code be aware 🙂

Tagged as: , 3 Comments
21Jul/110

Power Supply Adapter has arrivedCarregado do Kinect chegou…

Almost miss the carrier delivery but I managed to get the power supply today so it's time to start downloading the sdk and development IDE

Por pouco que não apanhava o homem das encomendas, mas consegui por fim o transformador para o kinect... Esta na hora de começar a fazer o download do Kinect SDK e sacar um IDE

Filed under: My Projects No Comments
21Jul/110

RequirementsRequisitos

As I believe, if you're reading this blog probably you are interested in develop over kinect or you're already doing it.

For those who are interested in start to code on kinect, please follow this link to Kinect SDK QuickStart Series.
But that will not be enough... so I sugest you also download the Coding4Fun Kinect Toolkit. There you will be able to find all the starting resources you need.
It will take some time to get the Enviromnent running but it's worthy.

Acredito que, se estão a ler esta pagina, provavemente estão interessados em desenvolver aplicações para o kinect, ou então ja o estão a fazer...

Para os interessados aconselho a verem este link - Kinect SDK QuickStart Series.

Mas só isso não é o suficiente... por isso sugiro que façam download do  Coding4Fun Kinect Toolkit. Assim teram todos os recursos necessarios para começar a brincar com o "bicho"

Vai demorar um pouco até o ambiente de desenvolvimento estar pronto mas vale a pena.

Filed under: My Projects No Comments
21Jul/110

Still WaitingA eterna espera…

Right now I am anxiously waiting for the Kinect Power Supply Adapter to arrive and put the hand on...Neste momento estou desesperadamente a espera que o transformador do kinect chegue....

Tagged as: No Comments