Using AR/CR, with markers
and others, to control and
inspect hardware with
ARDUINO based interface.
Utilização de Realidade
Aumentada, com
marcadores(ARToolKitPlus) e
outros (utilizando openCV), para
controle e inspeção de hardware,
utilizando a interface ARDUINO.
2
Claudio Kirner1 and Christopher S. Cerqueira12
1Federal University of Itajubá – Universidade Federal de Itajubá (UNIFEI) 2National Institute for Space Research – Instituto Nacional de Pesquisas Espaciais (INPE)
[email protected] ,[email protected] 1http://realidadevirtual.com.br/, 2http://cscerqueira.com.br
09:16
Agenda:
• Conceitos e openFrameworks ~60m
• Estado da prática no INPE
• Criando o primeiro programa em openFrameworks ~20m
• Conectando com o Arduino ~40m
• Realidade Aumentada + ex.: Realidade Cruzada ~ 60min
• Usando marcadores -ofxARToolKitPlus
• Usando openCV - ofxOpenCv
• Controlar e monitorar equipamentos usando RA ~60min
• Arduino + openCV + marcadores
09:16 fb.com/RVA.BR 3
Três etapas:
1. 10h30 – 12h00
2. 14h00 – 15h30
3. 16h00 – 17h30
Exemplo prático que vai ser montado
• Vamos controlar o Arduino:
• Acender e apagar led, via botão físico e botão virtual (usando
marcador tipo ofxARToolKitPlus)
• Movimentar um servo usando rastreio de mão (usando ofxOpenCv)
09:16 fb.com/RVA.BR 4
O que teremos ao final do dia:
09:16 fb.com/RVA.BR 5
CONCEITOS GERAIS Algumas definições, como cheguei no openFrameworks, e estado da prática de estudos de interação e visão computacional na Engenharia e Tecnologia Espacial.
09:16 fb.com/RVA.BR 6
“The product is no longer
the basis of value. The
experience is.”
Venkat Ramaswamy
The Future of Competition
7 12/11/2014 fb.com/RVA.BR
Valor de uma boa experiência
8 12/11/2014 fb.com/RVA.BR
IHC – Interação Homem-Computador
• Estudo da interação entre pessoas e
computadores.
• Onde são formadas as experiências.
9 12/11/2014 fb.com/RVA.BR
Mas quem desenvolve experiência?
• UX Developer – User Experience
• A pessoa que caminha entra o design e a
tecnologia.
http://blog.alexandremagno.net/2013/02/o-que-seria-um-ux-developer/
10 12/11/2014 fb.com/RVA.BR
Interação
11
Texto, som,
cores, visual,
mecânico ou
fisico.
Interface
Mensagens
Usuário Sistema
12/11/2014 fb.com/RVA.BR
Usabilidade
09:16 fb.com/RVA.BR 12
Exemplo:
• Usabilidade:
1. Facilidade de
aprendizado
2. Eficiência
3. Facilidade de
memorização
4. Erros
5. Satisfação subjetiva
13
Meta-Mensagen
s
Usuário Sistema
12/11/2014 fb.com/RVA.BR
3 níveis
Lógico: Resolvem,
solucionam, facilitam.
Emocional: Satisfazem
necessidades e desejos
afetivos.
Visceral: resolvem
questões fundamentais,
sem consciência.
Impulso.
14 12/11/2014 fb.com/RVA.BR
Espera.... Visceral?
15 12/11/2014 fb.com/RVA.BR
16 12/11/2014 fb.com/RVA.BR
CLI – Command Line Códigos, estritos
GUI – Grafical Metáforas, exploratória
NUI – Natural Direta, intuitiva
RV RA
Evolução das
interfaces
9:16 17
Gerações:
09:16 fb.com/RVA.BR 18
Realidades – Realidade Virtual
interface que permite ao
usuário interagir, em tempo
real, com um mundo
tridimensional gerado
por computador, usando
seus sentidos através de
equipamentos
especiais.
SOURCE: NASA (2013a)
9:16 20
Billinghurst Vision
12/11/2014 21 fb.com/RVA.BR
Realidades – Realidade Aumentada
uma interface baseada na
sobreposição de informações
virtuais geradas por computador
(envolvendo imagens estáticas e
dinâmicas, sons espaciais e
sensações hápticas) com o
ambiente físico do usuário,
percebida através de dispositivos
tecnológicos e usando as
interações naturais do usuário,
no mundo físico.
Claudio Kirner
SOURCE: Adapted from ESA (2009) and Capua (2008)
12/11/2014 22 fb.com/RVA.BR
Christopher Vision
Informação virtual
Interação Natural
dispositivos tecnológicos
12/11/2014 23 fb.com/RVA.BR
Realidades – Realidade Cruzada
é um ambiente de realidade misturada
ubíqua, que vem da fusão de uma rede
de sensores e atuadores (que coletam
e enviam dados relacionados ao mundo
real) com mundos virtuais
compartilhados, usando a
interface da realidade
aumentada.
Claudio Kirner
Intr
odução
12/11/2014 24 fb.com/RVA.BR
Milgram Continuum - interfaces
SOURCE: Milgram et al. (1995)
Aumento de elementos reais Aumento de elementos virtuais
12/11/2014 25 fb.com/RVA.BR
Kirner’s Diagram – elementos
Source: (KIRNER et al., 2012)
12/11/2014 26 fb.com/RVA.BR
M$
GRU
Lego
Cave
2L
Realidade Cruzada
Objetos
reais
Sensores e
Atuadores
Realidade Aumentada
OC
R
NO
CR
NO
CR
Intr
odução
12/11/2014 27 fb.com/RVA.BR
OPENFRAMEWORKS
09:16 fb.com/RVA.BR 29
\\
ERA TROGLODITA
• Graduação (2010):
• ARToolKit
• PTAMM
• Bolsista DTI (2011):
• basAR
Conectar com ARDUINO em C++
Literatura indica FIRMATA:
http://firmata.org/wiki/Download
12/11/2014 30 fb.com/RVA.BR
https://github.com/bodusb
http://cscerqueira.com.br/basar
Processing
Adobe Flash
Unity
Cinder
openFrameworks
31 12/11/2014 fb.com/RVA.BR
openframeworks.cc
32
• Vídeo oF1..\Media\7_openFrameworks1.mp4
• Vídeo oF2..\Media\7_openFrameworks2.mp4
12/11/2014 fb.com/RVA.BR
oF
• Criado para artistas e designers • Desenvolvido por: Zach Liberman, Theo Watson, Artuno
Castro e Chris O’Shea
•Proposta: Arrumar a falta de comunicação entre
diversas bibliotecas em C++, e permitir portabilidade.
• Escrita em C++
• Licença: MIT (educacional e venda)
33 12/11/2014 fb.com/RVA.BR
utilizar oF quando:
• O projeto renderiza muitos gráficos 3D, e/ou;
• Utilizar muita visão computacional, e/ou;
• Controlar equipamentos, como, por exemplo, o
ARDUINO.
34 12/11/2014 fb.com/RVA.BR
Página Principal – openframeworks.cc
35 12/11/2014 fb.com/RVA.BR
Libs no pacote padrão
• OpenGL, GLEW, GLUT, libtess2 e cairo para gráficos.
• rtAudio, PortAudio ou FMOD e Kiss FFT para entrada,
saída e análise de áudio.
• FreeType para fontes.
• FreeImage para salvar e carregar imagens.
• Quicktime e videoInput para playback e aquisição de
vídeo.
• Poco, que contém uma variedade de utilidades.
36 12/11/2014 fb.com/RVA.BR
Addons da comunidade
09:16 fb.com/RVA.BR 37
38
OSX, Linux,
Windows, iOS,
Android, Linux
ARM
09:17 fb.com/RVA.BR 39
ERA TROGLODITA (C++)
• Graduação (2010):
• ARToolKit
• PTAMM
• Bolsista DTI (2011):
• basAR
ERA DO FOGO (C++/oF)
• Mestrado (2012):
• Doutorado (2014):
12/11/2014 40 fb.com/RVA.BR
• Introdução à utilização de openFrameworks para o desenvolvimento de aplicações de RVA
http://pt.slideshare.net/christophercerqueira/svr2013-o-frev
• Construção de aplicações de Realidade Cruzada Projetiva utilizando openFrameworks e ARDUINO
http://pt.slideshare.net/christophercerqueira/ppt-svr2014
12/11/2014 41 fb.com/RVA.BR
OPENFRAMEWORKS ROUND ONE
09:17 fb.com/RVA.BR 42
Ambiente de desenvolvimento deste
tutorial
oF 0.8.4
Visual Studio Express 2012
C++ 11
Windows 8.1
09:17 fb.com/RVA.BR 43
Descompactando
• addons – recursos fora do core do oF
• apps – local onde ocorre o devel
• docs –
• examples - +100
• export – dlls
• libs – bibliotecas do oF
• others – pde para exemplo com Arduino
• projectGenerator – gerador automático de projetos
• scripts – compilar tudo, e base para criação de projetos
09:17 fb.com/RVA.BR 44
Exemplos
09:17 fb.com/RVA.BR 45
• Ex1.: 3D pointPicker
• Ex2.: graphics polylineBlobs
• Ex3.: utilssorting
• Ex4.: 3DcameraLensOffset
• Ex5.: addonsassimp
• (particulas)
O EXEMPLO VAZIO! o exemplo vazio serve para explorar a estrutura de
arquivos do oF, a utilização do gerador automático e a
organização do código.
46
Onde encontrar?
09:17 fb.com/RVA.BR 47
Level Easy: Gerador Automático
48
Escolhendo expansões
49
Do c
ore
oF
Da c
om
unid
ade
Estrutura do projeto
09:17 fb.com/RVA.BR 50
Exemplo básico
09:17 fb.com/RVA.BR 51
// ofApp.cpp
void ofApp::setup(){
mensagem = "Hello WRVA2014!!!";
raio = 0;
}
void ofApp::draw(){
ofEnableAlphaBlending(); ofSetColor(ofColor::blue,128);
ofCircle(x_i,y_i,raio);
ofSetColor(ofColor::red);
ofDrawBitmapString(mensagem,mouseX,mouseY);
}
// ofApp.cpp
void ofApp::mouseDragged(int x, int y, int button){
raio = ofDist(x_i,y_i,x,y);
}
void ofApp::mousePressed(int x, int y, int button){
x_i = x;
y_i = y;
}
void ofApp::mouseReleased(int x, int y, int button){
raio = ofDist(x_i,y_i,x,y);
}
// ofApp.h
...
string mensagem;
int x_i,y_i;
float raio;
...
ARDUINO O que é? Onde vivem?
Existe? Hoje no Glob..
Fritzing, Arduino 1.0, Firmata, exemplo openFrameworks
09:17 fb.com/RVA.BR 52
O que tem no ARDUINO?
12/11/2014 53 fb.com/RVA.BR
Outras versões
12/11/2014 54 fb.com/RVA.BR
Shields
12/11/2014 55 fb.com/RVA.BR
FIRMATA
Literatura indica FIRMATA:
http://firmata.org/wiki/Download
12/11/2014 56 fb.com/RVA.BR
O que a FIRMATA faz!?
• Transforma o ARDUINO numa interface de controle,
podendo ser modificado por um host.
• Quais as vantagens?
• O host controla a execução!
• O host tem mais memória.
• Desvantagens?!
• Tem que ficar atrelado ao host!
12/11/2014 57 fb.com/RVA.BR
Obs.: Mudança da nomenclatura dos
pinos após Firmata 2.3 (Arduino 1.0)
09:17 fb.com/RVA.BR 58
Instalando a Firmata no Arduino
• Faça download do
Arduino 1.0.6
http://arduino.cc/en/Ma
in/Software
• Abra o sketch do
Firmata Standard.
• Transfira para a board.
09:17 fb.com/RVA.BR 59
http://arduino.cc/en/reference/firmata
“esquemático”
12/11/2014 60 fb.com/RVA.BR
• #crashcourse fritzing
• http://fritzing.org/home/
Arduino e openFrameworks
09:17 fb.com/RVA.BR 61
Métodos para conectar com o ARDUINO
connect()
disconnect()
getAnalog()
getAnalogPinReporting()
getDigital()
getDigitalPinMode()
getPwm()
getString()
isArduinoReady()
isInitialized()
sendAnalogPinReporting()
sendByte()
sendDigital()
sendDigitalPinMode()
sendPwm()
sendReset()
sendString()
setUseDelay()
update()
12/11/2014 62 fb.com/RVA.BR
Código no openFrameworks
• Exploração do exemplo: communicationfirmataExample
09:17 fb.com/RVA.BR 63
Fluxograma básico
09:17 fb.com/RVA.BR 64
SETUP Habilita callback
de Arduino Alive
Arduino
Responde
Evento Alive
Configura
Arduino Loop de
execução – sem
Arduino
Enviar
comandos pro
Arduino
Recebeu um
evento Digital
Recebeu um
evento
Analógico
Loop de
execução –
Arduino Update
Código
09:17 fb.com/RVA.BR 65
//ofApp.h
#pragma once
#include "ofMain.h"
class ofApp : public ofBaseApp{
public:
…
ofArduino ard;
bool bSetupArduino;
private:
void setupArduino(const int & version);
void digitalPinChanged(const int & pinNum);
void analogPinChanged(const int & pinNum);
void updateArduino();
};
//ofApp.cpp
void ofApp::setup(){
...
ard.connect("COM3", 57600); //conecta com arduino
ofAddListener(ard.EInitialized, this, &ofApp::setupArduino);
bSetupArduino= false;// flag arduino ok
}
void ofApp::setupArduino(const int & version) {
ofRemoveListener(ard.EInitialized, this, &ofApp::setupArduino);
bSetupArduino = true; // agora pode usar o arduino.
ard.sendDigitalPinMode(2, ARD_INPUT); //pino entrada digital
ard.sendAnalogPinReporting(0, ARD_ANALOG); // pino entrada analógica
ard.sendDigitalPinMode(13, ARD_OUTPUT); // configura pino saída digital
ard.sendDigitalPinMode(11, ARD_PWM); // configura pino saída PWM
ard.sendServoAttach(9); // diz que o pino tem um servo.
ofAddListener(ard.EDigitalPinChanged, this, &ofApp::digitalPinChanged);
//callback para eventos de pino digital.
ofAddListener(ard.EAnalogPinChanged, this, &ofApp::analogPinChanged);
//callback para eventos de pino analógico
}
void ofApp::updateArduino(){
ard.update(); // verifica se algo mudou no Arduino - obrigatório
if (bSetupArduino) {
//envia o que for para o Arduino.
ard.sendPwm(11, (int)(128 + 128 * sin(ofGetElapsedTimef()))); // pwm...
}
}
//ofApp.cpp
void ofApp::digitalPinChanged(const int &
pinNum) {
// trata o pino digital - ard.getDigital(pinNum)
}
void ofApp::analogPinChanged(const int &
pinNum) {
// trata o pino analógico -
ard.getAnalog(pinNum)
}
//outros comandos
ard.sendServo(9, 180, false);
ard.sendDigital(8, ARD_HIGH);
09:17 fb.com/RVA.BR 66
MatrixCube
Robot
Insect
Weather
Patchube
Momento histórico: 2014-11-12
• Primeira aterrisagem num cometa
• ESA. Missão Rosetta
16:06 fb.com/RVA.BR 67
REALIDADE AUMENTADA Marcadores: ofxARToolKitPlus
“sem marcadores”: ofxOpenCv, ofxCv
09:17 fb.com/RVA.BR 68
Definição atual
Uma definição mais atualizada é:
realidade aumentada é uma interface
baseada na sobreposição de informações virtuais
geradas por computador (envolvendo imagens
estáticas e dinâmicas, sons espaciais e sensações
hápticas) com o ambiente físico do usuário, percebida
através de dispositivos tecnológicos e usando as
interações naturais do usuário, no mundo
físico. (KIRNER 2011)
69
Frameworks
Marcador
• ARToolKit (C) – 90´s
• NYARToolKit (Java, C#,
C++, Android)
• AndAR (Android)
• FLARToolKit (AS3)
• Vuforia
Sem marcador
• OpenCV –
Multiplataforma
• HandyAR
• MetaIO
• PTAMM (C++)
• Kinect like (Meta / Tango)
70
72
AREngine Tango Tango
9:17
NUI
Tangíveis
Móveis
Especializados
Institutos
iFORM
Sand
MYO
META
Kinect
9:17 73
ARTOOLKITPLUS
09:17 fb.com/RVA.BR 74
Marcadores
ARToolKit
• HITLab
• Compara templates.
• Template marker
detection
• Mais lento
• (Costumava ser) Inviável
em SW embarcado.
ARToolKitPlus
• Graz University of
Technology
• Compara códigos
• ID-Encoded marker
detection
• Mais rápido
• Bom para SW
embarcado.
75
ARToolKit
76
ARToolKitPlus
77
Voltando ao mundo real
• openFrameworks + ARToolKitPlus.
• Add-on ofxARToolKitPlus.
(https://github.com/fishkingsin/ofxARtoolkitPlus)
• Descompactá-lo e salvar dentro de
<of>/addons
• Renomear, retirando o sufixo –master
78
ARToolKitPlus original:
• https://launchpad.net/artoolkitplus
• released on 2014-10-05 ( )
• ARToolKitPlus is a software library that can be used to calculate camera position and orientation relative to physical markers in real time. This enables the easy development of a wide range of Augmented Reality applications.
• advantages over the classical ARToolKit:
• easier C++ based API
• support for 4096 binary based markers - no need to design new markers yourself
• supports RGB565, Gray images
• "Robust Planar Pose" algorithm that reduces jitter while tracking
• uses modern text-file based camera calibration
• Vignetting Compensation
• automatic Thresholding
• Hull based tracking in multi marker mode
09:19 fb.com/RVA.BR 79
• Utilizar o gerador automático e gerar com os seguintes
add-nos:
• ofxARToolKitPlus
• ofxOpenCv (necessário para o ofxARToolKitPlus)
• DICA: Não vai funcionar – o of0.8.4 usa o C++
11, diferente do compilado na
ofxARToolKitPlus
• Como resolver: http://touch-base-
br.blogspot.com.br/2014/09/openframeworks-083-
ofxartoolkitplus.html
80
Ajustando o projeto - caminhos
1. Configuration Properties Linker GeneralAdditional Library Directories e inclua o caminho para a biblioteca, no caso:
..\..\..\addons\ofxARtoolkitPlus\libs\ARToolKitPlus\lib\win32
1. Configuration Properties Linker Input Additional Dependencies incluir a lib:
ARToolKitPlus.lib
81
Fluxograma
09:19 fb.com/RVA.BR 82
SETUP Configura câmera e
ARTKP
UPDATE Update câmera e
ARTKP
DRAW Desenha 2D
Desenha 3D
Lets code... // ofApp.cpp
#pragma once
#include "ofMain.h"
#include "ofxOpenCv.h" //Cabeçalho do OpenCV
#include "ofxARToolkitPlus.h" //Cabeçalho do ARToolKitPlus
class ofApp : public ofBaseApp{
...
int width, height; // Tamanho da janela da câmera
ofVideoGrabber vidGrabber; // Componente do oF que pega a câmera.
ofxARToolkitPlus artk; // Instância do ARToolKitPlus
ofxCvColorImage colorImage; //imagem capturada pela câmera
ofxCvGrayscaleImage grayImage; //imagem em tons de cinza (mais rápida)
};
83
Configurando – testApp::setup()
//--------------------------------------------------------------
void ofApp::setup(){
ofSetWindowShape(1280,480); // Ajusta o tamanho da aplicação
width = 640; height = 480; // largura e altura da imagem da câmera
vidGrabber.initGrabber(width, height); // reserva buffer da câmera
colorImage.allocate(width, height); // reserva imagem colorida
grayImage.allocate(width, height); // reserva imagem mono
artk.setup(width, height); // inicia o ARToolKitPlus
}
84
Rastreio - testApp::update()
//--------------------------------------------------------------
void ofApp::update(){
vidGrabber.update(); // Pega frame da câmera
bool bNewFrame = vidGrabber.isFrameNew();// é um frame novo ???
if(bNewFrame) { // se um frame novo
//pega os pixels do buffer da câmera e armazena
colorImage.setFromPixels(vidGrabber.getPixels(), width, height);
grayImage = colorImage; //converte a imagem para mono
artk.update(grayImage.getPixels());
}
}
85
Exibindo - testApp::draw() – p1 void ofApp::draw(){
ofSetColor(ofColor::white); // inicia a cor dos objetos como branca
colorImage.draw(0, 0); // exibe a imagem capturada colorida
artk.draw(640, 0); // Esta função exibe a posição e etiqueta marcador
// ARTK 2D stuff - // See if marker ID '0' was detected
int myIndex = artk.getMarkerIndex(0);
if(myIndex >= 0) {
ofSetColor(ofColor::red);
ofDrawBitmapString(ofToString(artk.getTranslation(myIndex)),
artk.getDetectedMarkerCenter(myIndex));
}
// ARTK 3D
artk.applyProjectionMatrix(); // matriz de projeção da camera
int numDetected = artk.getNumDetectedMarkers(); //detectar marcadores
ofEnableAlphaBlending(); //habilitar a transparência
86
Exibindo - testApp::draw() – p2
for(int i=0; i<numDetected; i++) { // marcadores encontrados
artk.applyModelMatrix(i); //matriz de perspectiva do marcador
//Local onde colocar o conteúdo 3D do marcador
// neste exemplo é uma pilha de retângulos.
ofNoFill();
ofEnableSmoothing();
ofSetColor(255, 255, 0, 50);
for(int i=0; i<10; i++) {
ofRect(-25, -25, 50, 50);
ofTranslate(0, 0, i*1);
}
}
}
87
Alterando o threshold -
testApp::keyPressed(int key) //--------------------------------------------------------------
void ofApp::keyPressed(int key){
switch(key){
// aumenta o valor do threshold
case OF_KEY_UP: artk.setThreshold(++threshold); break;
// diminui o valor do threshold
case OF_KEY_DOWN: artk.setThreshold(--threshold); break;
// chama a configuração da câmera
case 's': case 'S': vidGrabber.videoSettings(); break; default: break;
};}
88
Lembrar de copiar a
ARToolKitPlus.dll para a
pasta destino
Lembrar de copiar as
definições de câmera do
ARToolKitPlus
09:19 fb.com/RVA.BR 89
Resultado esperado
90
USANDO OPENCV
09:19 fb.com/RVA.BR 91
Teoria: Rastreio de cores
1. Breve teoria de cores e rastreio de blobs em openCV,
2. Construção dos artefatos de manipulação,
3. Algoritmo de rastreio,
4. Algumas sugestões de usos
12/11/2014 92 fb.com/RVA.BR
Cores
RGB-A (red, green, blue)-alfa HSV (hue (cor), saturation, value)
12/11/2014 93 fb.com/RVA.BR
Blobs
• Método de busca de características.
• Blobs compartilham propriedades constantes que podem
ser “percebidas” na imagem.
12/11/2014 94 fb.com/RVA.BR
Construção dos artefatos : Rastreio Cores
12/11/2014 95 fb.com/RVA.BR
Bonus: Projection Mapping
12/11/2014 fb.com/RVA.BR 96
Audi case
PM
PM
Usos
• Table-tops
• Projeções em paredes
12/11/2014 97 fb.com/RVA.BR
SketchSynth
Sensetable
L.A.S.E.R. Tag
Climbing
OASIS
SVR2014 - Resultados
12/11/2014 98 fb.com/RVA.BR
SVR2014 - Resultados
12/11/2014 99 fb.com/RVA.BR
Voltando ao mundo real
• openFrameworks + openCV.
• Addon ofxOpenCV – Incluso no openFrameworks
• Addon ofxCv (https://github.com/kylemcdonald/ofxCv)
• Descompactá-lo e salvar dentro de
<of>/addons
• Renomear, retirando o sufixo –master
• DICA: nenhuma dica,
vai funcionar!!!
100
Exemplos interessantes
• ofxCv\example-difference-Colummns
• ofxCv\example-countours-advanced
09:19 fb.com/RVA.BR 101
Fluxograma: Challange: rastrear mão
09:19 fb.com/RVA.BR 102
SETUP
Configura
câmera
Configura
“padrão”
UPDATE Câmera
Update
Procura
“padrão”
DRAW
Rastrear mão (apontador 2D)
• Restrições (para facilitar)
• Fundo homogêneo
• Longe das quinas
• Uma mão só
• Pseudo-código
• Fazer diferença entra o fundo e o frame atual para encontrar a
mão.
• Com a diferença rastreia o blob.
• Do blob calcula as quinas
• Das quinas pega a mais distante do centroide e que não seja
próximo das quinas ( braço).
09:19 fb.com/RVA.BR 103
Lets code babe #include "ofMain.h"
#include "ofxOpenCv.h" //Cabeçalho do OpenCV
#include "ofxCv.h"
class ofApp : public ofBaseApp{
...
int width, height, threshold;
ofVideoGrabber vidGrabber; // Componente do oF que pega a câmera.
ofxCvColorImage colorImage; // imagem capturada pela câmera
ofxCvGrayscaleImage grayBg, grayImage, grayDiff;// bg, cinza, diferença
bool bLearnBakground;
ofxCv::TrackingColorMode trackingColorMode;
ofxCv::ContourFinder contourFinder;
ofColor targetColor;
ofPoint apontador;
ofPoint encontraPontoMaisDistante();
};
09:19 fb.com/RVA.BR 104
Setup
void ofApp::setup(){
width = 320; height = 240;
vidGrabber.initGrabber(width, height); //abre câmera
colorImage.allocate(width,height); //aloca memória para as imagens
grayBg.allocate(width,height);
grayImage.allocate(width,height);
grayDiff.allocate(width,height);
contourFinder.setMinAreaRadius(10); //configura rastreador
contourFinder.setMaxAreaRadius(150);
contourFinder.setTargetColor(ofColor::white, TRACK_COLOR_RGB);
threshold = 50;
bLearnBakground = true;
}
09:19 fb.com/RVA.BR 105
Update
void ofApp::update(){
vidGrabber.update(); // Pega frame da câmera
if(vidGrabber.isFrameNew()){ // é um frame novo ???
colorImage.setFromPixels(vidGrabber.getPixels(),width,height);
grayImage = colorImage;
if (bLearnBakground == true){
grayBg = grayImage;// salva o fundo da tela - TO ROUBANDO MESMO!
bLearnBakground = false;}
grayDiff.absDiff(grayBg, grayImage); // fazer fundo x atual
grayDiff.threshold(threshold);
contourFinder.setThreshold(threshold); // procurar blobs no atual
contourFinder.findContours(grayDiff);
apontador = encontraPontoMaisDistante(); // procurar “dedo”
}
}
09:19 fb.com/RVA.BR 106
Ponto mais distante – p1
ofPoint ofApp::encontraPontoMaisDistante(){
int n = contourFinder.size(); //qtidade de blobs capturados
ofPoint maisDistante ; //nosso ponto mais distante
for(int i = 0; i < n; i++) {
ofVec2f centroid = toOf(contourFinder.getCentroid(i)); //Centroide;
ofPolyline convexHull = toOf(contourFinder.getConvexHull(i)); //quinas;
vector<ofPoint> vertices = convexHull.getVertices(); // vetorDeQuinas
vector<ofPoint>::iterator itVec; // para percorrer as quinas.
maisDistante = (*vertices.begin());
float tamMaisDistante = centroid.distanceSquared(maisDistante);
float distanciaAtual = 0;
09:19 fb.com/RVA.BR 107
Ponto mais distante – p2
for(itVec = vertices.begin(); itVec != vertices.end(); itVec++){
//encontrar ponto mais distante do dedo --> eliminar as bordas
if( ((*itVec).x > 40) && ((*itVec).x < width - 40) &&
((*itVec).y > 40) && ((*itVec).y < height - 40)){ //elimina bordas
distanciaAtual = centroid.distanceSquared((*itVec));
if(distanciaAtual > tamMaisDistante){ //maior “simple as possible”
maisDistante = (*itVec);
tamMaisDistante = distanciaAtual;
}
}
}
}
return maisDistante;
}
09:19 fb.com/RVA.BR 108
Draw
void ofApp::draw(){
ofSetColor(255); grayImage.draw(0, 0); // desenha camera
ofTranslate(320, 0); grayDiff.draw(0, 0); // desenha threshould
ofTranslate(-320,240); contourFinder.draw(); //desenha contorno encontrado
ofSetColor(ofColor::hotPink);
ofDrawBitmapString("openCV Threshold: " + ofToString(threshold),50,50);
ofTranslate(0,-240);
ofFill();
ofSetColor(ofColor::green);
ofCircle(apontador,5); //desenha bola verde no “dedo”
}
09:19 fb.com/RVA.BR 109
Resultado desejado:
09:19 fb.com/RVA.BR 110
Só use mais hardware quando realmente
precisar.
09:51 fb.com/RVA.BR 111
JUNTANDO TUDO. Controlar e monitorar Arduino em RA.
09:19 fb.com/RVA.BR 112
O que nós sabemos (em tese) até agora:
• Como se localizar no openFrameworks • projectGenerator, ofApp.h, ofApp.cpp, métodos: setup,update,draw
• Como transformar o Arduino numa interface de hardware, para sensores e atuadores. • Como, via openFrameworks: enviar comandos digitais, receber
dados digitais e analógicos, enviar PWM, controlar um servo.
• Utilizar marcadores do tipo ARToolKitPlus, e: descobrir a sua posição 3D e a sua posição 2D (na tela), verificar se ele foi encontrado.
• Utilizar openCV para rastreio de cores, e a posteriori rastreio de mão/dedos – • usando uma webcam normal!!!
• Suck it up Kinect!
09:19 fb.com/RVA.BR 113
Fluxograma simplificado
09:19 fb.com/RVA.BR 114
SETUP Configura Arduino, Câmera,
ARToolkitPlus e Rastreio
Aguarda
Arduino
Arduino alive – configura
Arduino
UPDATE
Update
Arduino
Update
Câmera +
posições de
Marcadores e
apontador.
Verifica
interação
marcador
Verifica
interação
pointer
DRAW
Verifica
interação
Arduino
Funcionando!
09:19 fb.com/RVA.BR 115
WRAP-UP
09:19 fb.com/RVA.BR 116
O QUE APRENDEMOS HOJE
• Existe um framework easy (noob level) em C++ chamado
openFrameworks.
• openFrameworks pode ser expandido com componentes
da comunidade, chamados addons.
• Com ele é possível controlar o Arduino (em C++).
• O Arduino pode se transformar numa interface de dados
usando a lib Firmata.
• Arduino é barato e fácil de usar. Um possível software
para desenhar circuitos é o Fritzing
• Realidade Aumentada é só uma interface de
acesso aos elementos virtuais.
09:19 fb.com/RVA.BR 117
• ARToolKitPlus é um tipo de marcador para RA, que é
mais rápido que o ARToolKit.
• openCV é uma biblioteca de visão computacional.
• Com openCV podemos rastrear cores, diferenças de
padrão, etc.
• Visão computacional nem sempre é um resultado por si.
Ideal são soluções hibridas.
• Adicionando elementos de interação físicos (sensores e
atuadores) à Realidade Aumentada, que fazem a troca
bidirecional de informação cria-se Realidade Cruzada.
09:19 fb.com/RVA.BR 118
09:19 fb.com/RVA.BR 119
120
Claudio Kirner1 and Christopher S. Cerqueira12
1Federal University of Itajubá – Universidade Federal de Itajubá (UNIFEI) 2National Institute for Space Research – Instituto Nacional de Pesquisas Espaciais (INPE)
[email protected] ,[email protected] 1http://realidadevirtual.com.br/, 2http://cscerqueira.com.br
Dúvidas: [email protected]
Site: http://cscerqueira.com.br
Facebook: http://fb.com/RVA.BR
Para maiores dúvidas:
INPE – SJC
Prédio Satélite
Sala 95