Geek-Press Geeky Blog about software development

14Aug/110

Shell Scripting

For the first time in 10 years of programming someone asked for a shell script to do a bunch of operations.

I had never done such thing but I tought it should be easy.

One thing that helped me a lot was this cheat sheet. Extremelly usefull for some basic operations.

Also I was faced with a problem: How to get a dump of a pg database that is on a remote machine?

Well, I found a nice approach thanks to www.stackoverflow.com website. So here is the a little sample on how to perform that:

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

Was this usefull or what?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?

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