collapse

* Links de Robótica

* Posts Recentes

Ligar Células de Lithium por Hugu
[Hoje às 02:00]


Encomenda Colectiva N3-2016[@Mouser - Aberta a pedidos!] por Hugu
[Hoje às 01:53]


Printer 3D barata por xmatias
[Ontem às 03:56]


Servidor por almamater
[09 de Dezembro de 2016, 21:39]


mysql server error por andre_f_carvalho
[09 de Dezembro de 2016, 18:56]


Cortar plástico ABS por msr
[05 de Dezembro de 2016, 17:27]


MOVIDO: FPV Drone Racing? por metRo_
[05 de Dezembro de 2016, 10:49]


Módulo gsm por dio123
[04 de Dezembro de 2016, 23:06]


Procuro resistências 220 Ohm de 1% por brunus
[02 de Dezembro de 2016, 15:50]


Package de cond 10uF 35V smd? por KammutierSpule
[02 de Dezembro de 2016, 11:19]

Autor Tópico: Face tracker (aka weekend project)  (Lida 6336 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Marvin

  • Mini Robot
  • *
  • Mensagens: 677
    • The scientist and the geek
Face tracker (aka weekend project)
« em: 15 de Março de 2010, 01:27 »
Boas,

Tenho andado a trabalhar num projecto que basicamente detecta um rosto numa imagem da webcam e centra-o na imagem movendo a webcam.

Para isto utilizei 2 servos, 1 arduino, 1 webcam (ma qualidade) e 1 laptop. A nivel de software, apliquei o algoritmo de Haarcascade usando funções da biblioteca openCV (Emgu CV para C#) e a biblioteca que tenho andado a desenvolver de C# (arduinocomm).

A parte mais complicada foi mover os servos nos angulos correctos para seguir a cara, apliquei o teorema de pitagoras num plano 3d o que não é 100% eficaz pois a camara salta um bocado até chegar a cara, mas "gets the work done"...

O sketch da arduino limita-se a fazer o parse da informação enviada pelo servidor e enviar os controlos para os 2 servos.

Isto ainda esta numa fase inicial e tem alguns bugs, devido a qualidade da camara ele detecta alguns "fantasmas" o que faz a camera mover-se sem motivo aparente.

Aqui ficam as primeiras imagens:

Getto style servo base



Aplicação do lado do servidor




Podem ver os videos no blog, mas assim que puder faço upload para o youtube para colocar aqui.

Link para o blog http://blog.skundu.net/?p=162

Criticas e sugestões são muito bem-vindas!

 
« Última modificação: 15 de Março de 2010, 01:30 por Marvin »
Dronetech BlogThe Scientist and the Geek

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.707
Re: Face tracker (aka weekend project)
« Responder #1 em: 15 de Março de 2010, 10:32 »
Nos próximos tempos também irei começar a trabalhar com a biblioteca openCV.
Está engraçado, tenho que pesar é na maneira como fazes o posicionamento da camera e depois posto aqui qualquer coisa.

Offline Marvin

  • Mini Robot
  • *
  • Mensagens: 677
    • The scientist and the geek
Re: Face tracker (aka weekend project)
« Responder #2 em: 16 de Março de 2010, 10:27 »
Nos próximos tempos também irei começar a trabalhar com a biblioteca openCV.
Está engraçado, tenho que pesar é na maneira como fazes o posicionamento da camera e depois posto aqui qualquer coisa.

A biblioteca openCV é um mundo, tem praticamente de tudo para processamento de imagem, utiliza-la as vezes é que não é facil devido a documentação fraca em alguns metodos. Estou de momento a optimizar alguns metodos (especialmente a tentar acelarar o processo de encontrar a face).

Obrigado pela ajuda, pois de facto o posicionamento da camera é que me esta a dar mais trabalho.



Dronetech BlogThe Scientist and the Geek

Offline delphi

  • Mini Robot
  • *
  • Mensagens: 217
Re: Face tracker (aka weekend project)
« Responder #3 em: 16 de Março de 2010, 11:33 »
Olá,

Citar
posicionamento da camera é que me esta a dar mais trabalho

Referes-te a movimentos bruscos ou à camera mover-se sem motivo?

Sugiro que seja o arduino a calcular a nova posição dos servos e apenas receber a localização "destino", porque assim fica toda a lógica do movimento no arduino, e sem alterares o código do programa no PC, consegues fazer novas alterações nos movimentos.

Experimenta fazer uma deslocação dos servos utilizando uma média ponderada para atingir a posição final. Ao calculares os novos valores o movimento fica mais suave, e por ex. caso tenhas uma deslocação rápida que volte ao tempo -1 a camera mal se deslocará.
www.saborapalco.com - Companhia de Teatro Amador
www.megavaquinha.com - Uma mega aposta no euromilhões de um grupo de mega amigos

Offline Marvin

  • Mini Robot
  • *
  • Mensagens: 677
    • The scientist and the geek
Re: Face tracker (aka weekend project)
« Responder #4 em: 16 de Março de 2010, 11:51 »
Olá,

Citar
posicionamento da camera é que me esta a dar mais trabalho

Referes-te a movimentos bruscos ou à camera mover-se sem motivo?

Sugiro que seja o arduino a calcular a nova posição dos servos e apenas receber a localização "destino", porque assim fica toda a lógica do movimento no arduino, e sem alterares o código do programa no PC, consegues fazer novas alterações nos movimentos.

Experimenta fazer uma deslocação dos servos utilizando uma média ponderada para atingir a posição final. Ao calculares os novos valores o movimento fica mais suave, e por ex. caso tenhas uma deslocação rápida que volte ao tempo -1 a camera mal se deslocará.

Refiro-me aos movimentos bruscos, os movimentos sem motivo devem-se maioritariamente a "fantasmas" derivados da qualidade da camara. Com a minha webcam HD do portatil isto não acontece.

Em relação ao movimentos bruscos, a tua sugestão da media ponderada parece-me bastante boa. Alias até se podia aplicar algumas regras de probalidade para "prever" o movimento seguinte.

Agora tenho é duvidas no que dizes de colocar a logica de movimento na arduino. Eu de momento estou a passar para a arduino o angulo em que o servo tem de estar, baseado no calculo do angulo em que o rectangulo da face se encontra. Para alem de guardar a posição n-1 (que não estou a fazer mas irei) não estou bem a ver que mais posso colocar na arduino.

Obrigado pelas sugestões
Dronetech BlogThe Scientist and the Geek

Offline delphi

  • Mini Robot
  • *
  • Mensagens: 217
Re: Face tracker (aka weekend project)
« Responder #5 em: 16 de Março de 2010, 12:14 »
Estou a referir-me ao cálculo para fazer o smooth dos servos, para evitar esses movimentos bruscos.

A aplicação deve continuar a fazer o que está a fazer: indicar a posição desejada, e o arduino, com base na posição actual dos servos, calcula quais os próximos passos dos servos até estes chegarem à posição desejada.

Por ex., podes agora, para o teu objectivo, não querer os movimentos bruscos, mas daqui a uns tempos podes queres aplicar em algo que tenha de ter uma resposta rápida, ou ainda mais lenta. Se for o arduino a calcular quantos passos os servos devem dar até atingir a posição desejada (menos passos logo mais rápido e vice-versa), não tens de alterar a aplicação do pc, não é o processador do pc que fica ocupado com essa tarefa, mas sim o arduino.

Por ex. é para o servo ir para os 90º, e actualmente está nos 30. O servo pode ir logo para os 90º ou pode ir andando (a passos de 10º) até chegar aos 90º. Os "tamanho" dos passos pode estar guardada na memória, bem como o tempo de cada passo,... Entretanto, pode chegar uma nova informação e a indicar que agora a posição final são os 30º novamente. Se já vai nos 70º, começa a dar os passos para "trás" e assim sucessivamente.

Penso que desta forma também podes evitar os alguns movimentos "fantasmas".
www.saborapalco.com - Companhia de Teatro Amador
www.megavaquinha.com - Uma mega aposta no euromilhões de um grupo de mega amigos

Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 109
Re: Face tracker (aka weekend project)
« Responder #6 em: 16 de Março de 2010, 12:15 »
Boas,

Tenho andado a trabalhar num projecto que basicamente detecta um rosto numa imagem da webcam e centra-o na imagem movendo a webcam.

Para isto utilizei 2 servos, 1 arduino, 1 webcam (ma qualidade) e 1 laptop. A nivel de software, apliquei o algoritmo de Haarcascade usando funções da biblioteca openCV (Emgu CV para C#) e a biblioteca que tenho andado a desenvolver de C# (arduinocomm).

Ola.
Também estou a tentar trabalhar com o openCV, mas a ideia é reconhecer mais do que rostos, ou seja, reconhecer alguns objectos distintos, de forma a ajudar um veículo a localizar-se no espaço. 
Tal como dizes, não é uma ferramenta fácil, e por isso não tenho conseguido ir para além dos ficheiros HAAR que se encontram na net.

Já fiz algumas experiências com o reconhecimento do olho humano, e posteriormente, o cálculo da direcção do olhar, com o objectivo de ajudar uma pessoa tetraplégica a conduzir o rato num ecrã. Foram testes preliminares, mas com a referida biblioteca (onde curiosamente também usava um sistema pan&tilt para “apontar” a câmara ao olho, embora só no momento da inicialização), já foi possível alcançar alguns resultados. Entretanto, e pelas piores razões, abandonei esse projecto…

Outra ideia que também já experimentei, foi uma espécie de detector de movimento que fazia a câmara mover-se para a zona onde o movimento foi detectado (na imagem), e um pormenor que fez alguma diferença no meu caso foi “desligar” a analise da imagem até a câmara atingir a posição da ordem inicial, e só depois voltar a analisar a nova imagem. Pelo menos no meu caso, isto resultou num movimento mas suave em sem tantos soluços.

A verdade é que a qualidade da câmara é muito importante para o resultado final.

Agora gostava de conseguir criar os tais ficheiros HAAR para vários objectos específicos, mas para além da necessidade de fotografar o objecto em causa um sem número de vezes, ainda não consegui perceber muito bem como se faz o resto do processo. Se alguém me puder ajudar, agradeço

Offline Marvin

  • Mini Robot
  • *
  • Mensagens: 677
    • The scientist and the geek
Re: Face tracker (aka weekend project)
« Responder #7 em: 16 de Março de 2010, 12:57 »
Obrigado Delphi. Já percebi a tua logica, isso parece-me interessante. Vou tentar colocar em pratica assim que tiver um pouco mais de tempo.

Boas Ricardo.

Eu já ando de volta do opencv ha uns tempos e tambem tento reconhecer outros tipos de objectos para alem dos comuns. Ha uns tempos encontrei este link http://note.sonots.com/SciSoftware/haartraining.html e tenho tentado aplicar os passos. Claro está que isto requer bastante tempo de treino e muitas imagens. Eu consegui criar uns ficheiros que + - reconheciam o que eu queria.

Em relação a não detecção da face enquanto o servo esta a mover, estou a trabalhar nisso na classe arduinocomm que estou a desenvolver ou seja, um objecto servo so envia dados para a arduino quando ela enviar informação a dizer que já parou. Vou aplicar depois ao processamento da imagem essa variavel. Vou ver se com isso e com a proposta do Delphi resolvo o problema.

Já agora, esse trabalho com o movimento do olho é de louvar, em especial com a razão indicada.

Dronetech BlogThe Scientist and the Geek

Offline delphi

  • Mini Robot
  • *
  • Mensagens: 217
Re: Face tracker (aka weekend project)
« Responder #8 em: 16 de Março de 2010, 14:25 »
Há uns anos, em Delphi, e ainda não conhecia o poder do arduino, andei a fazer umas experiências com o objectivo de:

- fazer um sistema de vigilância, com webcams e servos
- criar uma ferramenta, para quem está acamado, conseguir controlar um rato com o movimento da cabeça.

No sistema de vigilância, uma das dificuldade foi logo essa: quando mexia a camera, a posição do objecto mudava e não podia enviar logo esse novo destino para os servos (os servos ficavam endiabrados :) ) , entretanto como era passatempo... não passou disso mesmo.

A ferramenta para quem está acamado, era mais especificamente para pessoas tetraplégicas. O objectivo era de poder controlar um rato, para pelo menos, conseguir mudar de canal,  diminuir/aumentar o som, ... de uma placa de captura de tv ligada ao pc. Assim a pessoa podia, dentro do possível, ser mais autónoma.

No entanto, com o arduino, a ideia começou a passar mais para: e fazer isso sem nenhum pc? Se for o arduino a fazer o processamento da análise das imagens?
Existem umas cameras que comunicam via RX/TX e assim podem comunicar com o arduino. http://gizmologi.st/code/c328r-camera-library/

Outra ideia, para o mesmo âmbito de pessoas (mas já fora deste tópico), era o de desenvolver algum interface(s) , onde a base de programação do arduino seria igual, mas o hardware de input é que era diferente (webcam, sensores de pressão, ...). De forma que o utilizador conseguisse comandar a televisão, ou qualquer outro aparelho que tenha como input um comando por infravermelhos. Se houver alguém interessado em desenvolver qualquer coisa do género abre-se outro tópico e especifica-se melhor.

Se puder ajudar em alguma coisa neste teu projecto, está à vontade.
« Última modificação: 16 de Março de 2010, 14:31 por delphi »
www.saborapalco.com - Companhia de Teatro Amador
www.megavaquinha.com - Uma mega aposta no euromilhões de um grupo de mega amigos

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 8.990
  • Helpdesk do sitio
Re: Face tracker (aka weekend project)
« Responder #9 em: 16 de Março de 2010, 14:46 »
A ideia é boa, mas se queres manter isso num sistema embebido numa aplicação, pensa antes num arm-7 ou mesmo um arm-9 a correr linux, o arduino é um simples micro-controlador de 8 bits, não tem capacidade de processamento para fazer reconhecimento de imagens e mesmo trabalhar com imagens de uma camera já é uma grande carga de trabalho para o arduino.
Imagina, só uma imagem com uma resolução de 800*600 e com 8bits por cor, são 800*600*(3*8), são 11520000 bits, ou seja 144Kbytes se não me engano, bem mais memória que um arduino tem, e isto é só uma imagem, imagina 25 ou 30 por segundo mais todo o processamento necessário
Avr fanboy

Offline delphi

  • Mini Robot
  • *
  • Mensagens: 217
Re: Face tracker (aka weekend project)
« Responder #10 em: 16 de Março de 2010, 14:58 »
Pois, mas se calhar por mais uns $$$ mais vale, por ex., um EEE 4G, que além de ter mais hardware, a parte de programação torna-se muito mais mais fácil.

Quanto à limitação do arduino não sei se o Mega não dará já para fazer algum deste processamento.

No entanto, pelo que tenho lido, neste tipo de processamento de imagens, geralmente aplica-se um filtro para ficar a preto/branco e depois obter os contornos, e as dimensões da imagem a ser analisada é muito mais pequeno (320x280 ou ainda mais pequena). Claro que depende do tipo de aplicação que se pretende.
www.saborapalco.com - Companhia de Teatro Amador
www.megavaquinha.com - Uma mega aposta no euromilhões de um grupo de mega amigos

Offline Marvin

  • Mini Robot
  • *
  • Mensagens: 677
    • The scientist and the geek
Re: Face tracker (aka weekend project)
« Responder #11 em: 16 de Março de 2010, 15:17 »
Há uns anos, em Delphi, e ainda não conhecia o poder do arduino, andei a fazer umas experiências com o objectivo de:

- fazer um sistema de vigilância, com webcams e servos
- criar uma ferramenta, para quem está acamado, conseguir controlar um rato com o movimento da cabeça.



E interessante mas o meu interesse pela robotica começou exactamente com a ideia de criar um robot com uma webcam que patrulha-se uma zona, detecta-se a pessoa, compara-se a cara com a BD e envia-se de imediato um alarme caso o intruso não estivesse na "guest list" ;) Claro está que o conceito é facil de assimilar mas a implementação nem por isso. O meu primeiro obstaculo foi o processamento de imagem numa arduino, pois tal como o Senso mencionou, é praticamente impossivel. O melhor que se pode fazer é enviar a imagem para um servidor central e este então guiar o robot... o servidor central pode ser um laptop tipo Dell 9.

Então comecei a desenvolver esta camera que nos segue para testar as aguas, e aqui estou eu... Penso que a arduino pode ser usada para controlar o chassi da aplicação, isto é, sensores, servos, motores, agora o processamento de imagem tem de ser passado para uma coisa mais potente. Ando a "namorar" uma coisas destas ha imenso tempo http://beagleboard.org/

Em relação a ferramenta para quem esta acamado, a ideia que tive logo foi um hack do comando da wii... vi ha pouco tempo um tipo que fez uma coisa desse genero podes checkar aqui http://johnnylee.net/projects/wii/ . Se quiseres abrir um topico para isto e começar a trabalhar nisto estou disponivel para ajudar no que puder.

Dronetech BlogThe Scientist and the Geek

Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 109
Re: Face tracker (aka weekend project)
« Responder #12 em: 16 de Março de 2010, 15:22 »
A ferramenta para quem está acamado, era mais especificamente para pessoas tetraplégicas. O objectivo era de poder controlar um rato, para pelo menos, conseguir mudar de canal,  diminuir/aumentar o som, ... de uma placa de captura de tv ligada ao pc. Assim a pessoa podia, dentro do possível, ser mais autónoma.

(..)

Outra ideia, para o mesmo âmbito de pessoas (mas já fora deste tópico), era o de desenvolver algum interface(s) , onde a base de programação do arduino seria igual, mas o hardware de input é que era diferente (webcam, sensores de pressão, ...). De forma que o utilizador conseguisse comandar a televisão, ou qualquer outro aparelho que tenha como input um comando por infravermelhos. Se houver alguém interessado em desenvolver qualquer coisa do género abre-se outro tópico e especifica-se melhor.


Também acho uma boa ideia criar um tópico sobre isto!

A “investigação” e as experiências que fiz nessa área tinham um objectivo bem definido. O meu pai sofreu um grave acidente de mota e ficou tetraplégico (e inicialmente, entubado, ou seja sem qualquer meio de comunicação) e a difícil realidade com que nós, família, nos vimos confrontados foi com a total incapacidade do hospital de apontar alternativas e soluções para a comunicação entre o doente e os outros. Existem soluções comercias, mas os valores são astronómicos, e o próprio hospital não sabe lidar com essas soluções.

A certa altura cheguei mesmo a montar uma estrutura em alumínio com rodas, um touchscreen de 17’’, um mini-pc, e a tal câmara acoplada com o arduino a controlar os servos.
O problema é que antes mesmo de testar um dos protótipos mas evoluídos (o que de já de si foi uma complicação para convencer o hospital a colaborar…), o meu pai faleceu.

Compreensivelmente, mas também um pouco egoisticamente, o projecto ficou a um canto…

Embora existam mil e uma experiências por esse mundo fora, acho que em Portugal as coisas não estão assim tão desenvolvidas.
O problema poderá ser que o âmbito deste projecto não estar assim tão ligado à robótica que é o objecto principal deste fórum, mas se os administradores do fórum acharem por bem, poderia ser um tema muito interessante para a colaboração de todos.

Peço desculpa ao Marvin por este “off-topic”, mas compreendem que este é um assunto que não me deixa indiferente…

Quanto ao tutorial do Haarcascade, por acaso já tinha por lá passado, mas assustei-me logo quando li a frase  “…used 5000 positive frontal face patterns, and 5000 positive frontal face patterns were derived from 1000 original faces…” ?

Mas vou ganhar coragem e investir mais um pouco!

Offline Marvin

  • Mini Robot
  • *
  • Mensagens: 677
    • The scientist and the geek
Re: Face tracker (aka weekend project)
« Responder #13 em: 16 de Março de 2010, 15:33 »
A ideia é boa, mas se queres manter isso num sistema embebido numa aplicação, pensa antes num arm-7 ou mesmo um arm-9 a correr linux, o arduino é um simples micro-controlador de 8 bits, não tem capacidade de processamento para fazer reconhecimento de imagens e mesmo trabalhar com imagens de uma camera já é uma grande carga de trabalho para o arduino.
Imagina, só uma imagem com uma resolução de 800*600 e com 8bits por cor, são 800*600*(3*8), são 11520000 bits, ou seja 144Kbytes se não me engano, bem mais memória que um arduino tem, e isto é só uma imagem, imagina 25 ou 30 por segundo mais todo o processamento necessário

Ja ando ha uns tempos a olhar para arm-7 mas não sei bem por onde começar, os custos iniciais parecem-me um pouco altos.  Mas penso que com um processador desses ligado a uma arduino para controlo dos elementos mecanicos é possivel fazer-se imensas coisas...
Dronetech BlogThe Scientist and the Geek

Offline Afonso

  • Mini Robot
  • *
  • Mensagens: 157
  • Afonso Cunha
Re: Face tracker (aka weekend project)
« Responder #14 em: 16 de Março de 2010, 18:06 »
Boas,

Tenho andado a trabalhar num projecto que basicamente detecta um rosto numa imagem da webcam e centra-o na imagem movendo a webcam.

Para isto utilizei 2 servos, 1 arduino, 1 webcam (ma qualidade) e 1 laptop. A nivel de software, apliquei o algoritmo de Haarcascade usando funções da biblioteca openCV (Emgu CV para C#) e a biblioteca que tenho andado a desenvolver de C# (arduinocomm).

Ola.
Também estou a tentar trabalhar com o openCV, mas a ideia é reconhecer mais do que rostos, ou seja, reconhecer alguns objectos distintos, de forma a ajudar um veículo a localizar-se no espaço. 
Tal como dizes, não é uma ferramenta fácil, e por isso não tenho conseguido ir para além dos ficheiros HAAR que se encontram na net.

Já fiz algumas experiências com o reconhecimento do olho humano, e posteriormente, o cálculo da direcção do olhar, com o objectivo de ajudar uma pessoa tetraplégica a conduzir o rato num ecrã. Foram testes preliminares, mas com a referida biblioteca (onde curiosamente também usava um sistema pan&tilt para “apontar” a câmara ao olho, embora só no momento da inicialização), já foi possível alcançar alguns resultados. Entretanto, e pelas piores razões, abandonei esse projecto…

Outra ideia que também já experimentei, foi uma espécie de detector de movimento que fazia a câmara mover-se para a zona onde o movimento foi detectado (na imagem), e um pormenor que fez alguma diferença no meu caso foi “desligar” a analise da imagem até a câmara atingir a posição da ordem inicial, e só depois voltar a analisar a nova imagem. Pelo menos no meu caso, isto resultou num movimento mas suave em sem tantos soluços.

A verdade é que a qualidade da câmara é muito importante para o resultado final.

Agora gostava de conseguir criar os tais ficheiros HAAR para vários objectos específicos, mas para além da necessidade de fotografar o objecto em causa um sem número de vezes, ainda não consegui perceber muito bem como se faz o resto do processo. Se alguém me puder ajudar, agradeço
Acho que deves começar por algo simples que depois fosse melhorado com softwares e adereços que fazem a difereça. Por exemplo um estabelizador  , lentes de alta qualidade  , até camarâs de alta qualidade. ;)
Dizem que eu sou ninguem , ninguem é perfeito por isso eu sou perfeito