Você está na página 1de 19

TEM – Sistemas de Visão

Parte 04
Descrição baseada em contornos
e conversão de coordenadas entre planos

Material produzido por:


Mário Lucio Roloff, DAMM/IFSC
Maurício Edgar Stivanello, DAMM/IFSC
Marcelo Ricardo Stemmer, DAS/UFSC
Aula de Hoje

 Processamento Digital de Imagens


– Descrição baseada em contorno
– Conversão de coordenadas entre planos

2 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Descrição baseada
em contornos

3 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Descrição baseada em contornos
 Muitas vezes estamos interessados na forma de um objeto
 A forma pode ser representada pelos pontos que compõe a fronteira do
componente conectado associado ao objeto de interesse

4 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Descrição baseada em contornos
 A OpenCv disponibiliza uma forma de descrição conveniente dos componentes
conectados detectados em imagens binárias
 A função findContours retorna uma lista contendo o contorno de cada componente
conectado encontrado
 Cada contorno contém uma lista das coordenadas de todos os pontos que o compõe
Lista de contornos

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0
0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0
0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

5 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Descrição baseada em contornos
 Funções sobre um contorno
 Sobre um contorno retornado pela função findContours podemos realizar operações
relevantes através de funções utilitárias:
 Recuperar a área
 Recuperar o menor retângulo que contém os pontos do contorno
 Recuperar o menor círculo que contém os pontos do contorno
 Recuperar o perímetro do contorno
 Desenhar o contorno
 Dentre outras funções associadas

6 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


void funcao_DescreverContornos()
{
Mat imagem = imread("..\\Imagens\\imagem_figuras_geometricas_2.bmp ", IMREAD_GRAYSCALE);
threshold(imagem,imagem,100,255,THRESH_BINARY_INV);
imshow("Binarizada", imagem);

// buscando os contornos
vector<vector<Point>> contornos;
// imagem, vetor de saída com os contornos,Lista de todos os contornos, pontos exatos, sem offset
findContours( imagem, contornos, RETR_LIST, CHAIN_APPROX_NONE, Point(0, 0));

// *** Exibindo descritores do PRIMEIRO contorno ***


Mat imagemDesenho = Mat::zeros( imagem.size(), CV_8UC3 );

// acessando e pintando cada ponto do contorno


imagemDesenho.setTo(Scalar(255,255,255));
for (int i = 0; i < contornos.at(0).size(); i++)
{
imagemDesenho.at<Vec3b>(contornos.at(0).at(i)) = Vec3b(0,0,255);
}
// ou drawContours(imagemDesenho, contornos, 0, Scalar(0,0,255));
imshow( "Pontos do contorno", imagemDesenho );

// recuperando e pintando o menor retangulo que se ajusta aos pontos


imagemDesenho.setTo(Scalar(255,255,255));
Rect retangulo = boundingRect(contornos.at(0));
drawContours(imagemDesenho, contornos, 0, Scalar(0,0,255));
rectangle(imagemDesenho, retangulo, Scalar(255,0,0));
imshow( "Retangulo", imagemDesenho );

// recuperando e pintando o menor círculo que se ajusta aos pontos


imagemDesenho.setTo(Scalar(255,255,255));
Point2f centroCirculo;
float raio;
minEnclosingCircle(contornos.at(0), centroCirculo, raio);
drawContours(imagemDesenho, contornos, 0, Scalar(0,0,255));
circle(imagemDesenho,centroCirculo,raio,Scalar(0,255,0));
imshow( "Círculo", imagemDesenho );

// recuperando e exibindo o perímetro e a área


cout << "Perimetro: " << contornos.at(0).size() << endl;
cout << “Área: " << contourArea(contornos.at(0)) << endl;
waitKey();
}

7 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Conversão de
Coordenadas entre planos

8 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Conversão de Coordenadas entre planos

 Homografia
 Detectado um objeto na cena, como estimar sua posição em um dado sistema
de coordenadas do mundo?

9 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Conversão de Coordenadas entre planos

 Homografia
 Transformação de perspectiva entre dois planos
 Problemas a se resolver na conversão de pontos entre planos
 Estimar a homografia
 Transformar os pontos

10 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Conversão de Coordenadas entre planos

 Homografia na OpenCv

 Mat findHomography(InputArray pontosOrigem, InputArray pontosDestino)


// Encontra a transformação de perspectiva entre pontos correspondents no
plano de origem e no plano de destino. Pelo menos 4 pontos correspondents são
necessários

 void perspectiveTransform(InputArray pontosEntrada, OutputArray


pontosSaida, InputArray matrizTransformação)
// Realiza a transformação de perspectiva dos pontos de entrada em função da
matriz de transformação

11 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Exemplo de utilização de funções de
homografia (1/2)

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/calib3d.hpp>
#include <iostream>

void funcaoHomografia()
{
VideoCapture capturador(0);
// cria uma janela para visualização e define o seu tamanho
namedWindow("Camera", WINDOW_AUTOSIZE);
setMouseCallback("Camera", funcMouse);

cout << "Clique sobre os 4 cantos do plano, iniciando da origem." << endl;
cout << "Em seguida, clique sobre a coordenada a converter." << endl;

Mat imagemCorrente;
char c = ' ';
while (c != 27)
{
capturador >> imagemCorrente;
imshow("Camera", imagemCorrente);
c = waitKey(50);
}
// libera capturador
capturador.release();

12 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


vector<Point2f> pontosImagem;
Mat homografia; Exemplo de utilização de funções de
void funcMouse(int event, int x, int y, int flags, void* param){
homografia (2/2)
if (event == EVENT_LBUTTONUP)
{
// verifica se está no momento de calibração ou de conversão
if (pontosImagem.size() < 4)
{
// entra com pontos da imagem
pontosImagem.push_back(Point2f(x,y));
cout << "Ponto " << pontosImagem.size() << " informado." << endl;
// se já tiver 4 pontos calcula a homografia
if (pontosImagem.size() == 4)
{
// define pontos do plano do mundo
vector<Point2f> pontosMundo;
pontosMundo.push_back(Point2f(0.0,0.0));
pontosMundo.push_back(Point2f(0.0,210.0));
pontosMundo.push_back(Point2f(297.0,210.0));
pontosMundo.push_back(Point2f(297.0,0.0));

// encontra a transformação de perspectiva entre dois planos


homografia = findHomography(pontosImagem,pontosMundo);
cout << "Matriz calculada." << endl;
}
}
else
{
// conversão de ponto imagem-mundo
vector<Point2f> pontoImagem, pontoMundo;
pontoImagem.push_back(Point2f(x,y));
perspectiveTransform(pontoImagem, pontoMundo,homografia);
cout << "x = " << pontoMundo.at(0).x << "y = " << pontoMundo.at(0).y << endl;
}
}
}

13 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Exercícios

14 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Exercícios

1) Exiba as seguintes informações associadas ao maior nó encontrado na imagem


“madeira.jpg”:
 Valor da Área
 Valor do Perímetro
 Desenho dos pontos que compõe o nó
 Desenho do menor retângulo que contém os pontos do nó
 Desenho do menor círculo que contém os pontos do nó
 Utilize-se da descrição baseada em contornos.

15 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Exercícios

2) Crie um programa que leia a imagem “peças.jpg” e que detecte e apresente uma caixa
em torno de cada parafuso detectado.

16 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Exercícios

Dica: Para diferenciar porcas e parafusos podemos utilizar o descritor de circularidade,


calculado em função do perímetro P e da área A:

A circularidade de um círculo perfeito é igual a 1, e menor para formas não circulares.

Outras funções úteis:


Constante do PI – CV_PI
Potência de um número – pow(base,expoente)

17 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


Exercícios
3) Crie um programa que permita realizar o mapeamento entre as coordenadas
de um tabuleiro de xadrez real para um tabuleiro sintético. O usuário clicará sobre
uma posição na imagem do tabuleiro real, e uma marca será desenhada sobre a
posição correspondente no tabuleiro sintético.

tabuleiro_sintetico.jpg

Dimensões do tabuleiro sintético:

300 X 300 pixels

tabuleiro_mundo.jpg

18 | Mecatrônica – DAMM – IFSC TEM – Sistemas de Visão


TEM – Sistemas de Visão
Parte 04
Descrição baseada em contornos
e conversão de coordenadas entre planos

Material produzido por:


Mário Lucio Roloff, DAMM/IFSC
Maurício Edgar Stivanello, DAMM/IFSC
Marcelo Ricardo Stemmer, DAS/UFSC

Você também pode gostar