Aplicação de visão computacional com OpenCV

visão computacional com OpenCV

Visão computacional é a visão de máquinas, é possível obter informações de imagens, sejam elas astronômicas, microscópicas ou em tamanho natural, podemos utilizar algoritmos computacionais para descrever e analisar o conteúdo de qualquer imagem digitalizada.

 

Essa prática é cada vez mais comum na indústria no controle de qualidade de processos e orientação de robôs, a visão computacional é capaz de realizar análises com precisão e velocidades que o olho humano não poderia alcançar, traz um novo leque de possibilidades como navegação de veículos autônomos, descoberta de novos planetas e análises biológicas em células.

 

 

Sobre o projeto

 

Um sistema de visão computacional para identificar e analisar biscoitos em tempo real, desenvolvido com software livre e neste caso voltado para uso educacional.

 

Inspeção - Biscoito aprovado
Figura 1 -  Inspeção - Biscoito aprovado

 

 

Funcionamento do sistema

 

O sistema de visão computacional utiliza uma câmera digital, uma iluminação uniforme tipo domo e um computador com software para processar e analisar as imagens. O software utiliza técnicas de processamento de imagens que são como os filtros do photoshop, os filtros têm o objetivo de tratar as imagens, retirar o fundo (background) e deixar o objeto com o melhor contraste possível e sem ruídos que possam atrapalhar a análise geométrica. Após filtrada a imagem, temos uma imagem binária, uma imagem preto e branco somente com a forma do objeto, chamamos essa imagem binária de máscara e é nela que o software irá realizar as análises de padrões geométricos.

 

Primeiro o software verifica a presença do biscoito na imagem pela cor/tom com uma função simples e rápida chamada trigger, depois se houver a presença detectada do objeto a imagem passa por filtros é retirada a máscara e em seguida passa para análise do padrão geométrico que vai identificar as peças boas e ruins e ao final o resultado é mostrado na tela em tempo real.

 

 

OpenCV - Biblioteca aberta de visão computacional da Intel

 

OpenCV é a principal biblioteca de código aberto para a visão computacional, processamento de imagem e aprendizagem de máquina, e agora apresenta a aceleração de GPU para operação em tempo real.

 

OpenCV é liberado sob uma licença de BSD e daqui é livre para o uso acadêmico e comercial. Possui interfaces C++, C, Python e Java e suporta Windows, Linux, Mac OS, iOS e Android. OpenCV foi projetado para eficiência computacional e com um forte foco em aplicações em tempo real. Escrito em C/C++ otimizado, a biblioteca pode aproveitar o processamento multi-core. Adotado em todo o mundo, OpenCV tem mais de 47 mil pessoas da comunidade de usuários e número estimado de downloads superior a 6 milhões. O uso varia de arte interativa, a inspeção de minas, costura mapas na web ou através de robótica avançada.

Documentação oficial do OpenCV.

 

Recomendo a leitura da documentação oficial do OpenCV para aprendizado e consulta!

 

Considero que você possui conhecimentos em programação, tem o OpenCV instalado e testou alguns, ou todos os exemplos dele em C++ e Python e fez um hello world com CMAKE.

 

Esse tutorial é de nível intermediário, apesar da simplicidade do código, é necessário algum conhecimento mas qualquer um pode aprender seguindo a documentação.

 

 

O projeto

 

Vamos apresentar a utilização do OpenCV em um projeto realtime simples, completo e de baixo custo.

 

Esse projeto poderá ser modificado para muitos outros casos de inspeção visual de objetos e sua arquitetura é fruto de anos de pesquisa e desenvolvimento para obter o melhor desempenho e manter a simplicidade do código com menor custo possível.

 

Funcionamento algoritmo básico:

 

  1. Captura
  2. Detecção
  3. Pre-processamento / filtro
  4. Inspeção / análise
  5. Resultado

 

Funcionamento algoritmo básico
Figura 2 - Funcionamento algoritmo básico

 

Parametrização, antes de capturar a imagem é necessário configurar a câmera, resolução, fps, tempo de exposição e ganho do sensor manual.

 

 

1 - Captura - abrir conexão, primeiro vamos abrir uma conexão com a câmera para imagem ser capturada.

 

1.0 - Conexão da câmera, este passo ocorre fora do loop principal, na inicialização do sistema:

 

 

 

1.1 Captura de frame, esta função é um loop e roda dentro de uma thread independente, aqui utilizei um mutex que tem a função de impedir que a imagem seja acessada simultaneamente por duas threads, pois a frame é uma variável tipo global e é utilizada por duas threads.

 

 

2 -  Detecção, uma função simples e rápida que verifica se o objeto existe na frame capturada!

 

A detecção ou trigger é uma área retangular no centro da imagem que testa a média da cor/tom.

 

Se a comparação for verdadeira a frame capturada contém o objeto e podemos inspecioná-la.

 

Trigger
Figura 3 - Trigger

 

3 - Pré-processamento, Esta etapa é muito importante, é onde filtramos a imagem cinza e transformamos em uma máscara, ou seja, uma imagem binária preto e branco, onde o objeto é branco e o fundo preto.

 

 

3.1 Canal - Escolho entre os canais de cor RGB o que melhor representa o objeto

 

Figura 4 - Canal R - canal Red selecionado
Figura 4 - Canal R - canal Red selecionado

 

3.2 Canal R - Os canais RGB, são imagens em tons de cinza com profundidade de 8 bits cada, neste caso escolhemos o RED que contém a melhor informação dos tons do biscoito, note que ele é cinza mas representa o vermelho de 0 á 100% na imagem colorida.

 

3.3 Threshold - Função que binariza a imagem, ou seja, transforma uma imagem em tons de cinza em uma imagem preto e branco, note que ainda existem alguns ruídos na imagem.

 

Threshold - imagem binária
Figura 5 - Threshold - imagem binária

 

3.4 Cleanup - Remoção de ruídos (Reduz a imagem na metade do tamanho, passa filtros de transformação morfológica de abrir e fechar e depois amplia a imagem para o tamanho original).

 

Após esses passos eliminam se os ruídos e temos uma imagem mais uniforme. Essa operação está dentro da função processing.

 

Máscara - Imagem filtrada
Figura 6 - Máscara - Imagem filtrada

 

4- Inspeção / análise, Após o objeto ser detectado, a frame filtrada e transformada em máscara é chamada a função de inspeção, que vai analisar a geometria do objeto.

 

Essa função analisa a máscara e verifica se o objeto é convexo, (possui todos os cantos arredondados) e valida as dimensões do objeto. Podemos medir a área, perímetro, altura e largura.

 

4.1 Contornos, é uma função que transforma a máscara binária em linhas ou contornos.

 

 

4.2 - Aproximação poligonal, transforma as linhas em um polígono com ajustes de precisão do comprimento das linhas. Essa precisão é chamada epsilon.

http://docs.opencv.org/3.1.0/dd/d49/tutorial_py_contour_features.html

 

 

5 - Resultado, Após a análise temos o resultado e podemos mostrar os contornos na tela com cores verde e vermelho indicando passa ou falha e em um sistema completo acionar uma saída digital de rejeito de defeitos.

 

 

Resultado, biscoito reprovado
Figura 7 - Resultado, biscoito reprovado
Resultado, biscoito aprovado
Figura 8 - Resultado, biscoito aprovado

 

Existem diversas maneiras de analisar imagens, com muitos outros algoritmos como por exemplo ORB, AKAZE e SURF. Neste caso nós utilizamos análise geométrica básica, que é um código simples, leve e eficiente. Na maioria das aplicações é necessário otimizar o código ao máximo para atingir alta velocidade de inspeção com precisão e segurança.

 

 

Materiais utilizados no teste

 

Fonte 12V, Fita Led, Bola de Isopor, pseye, um suporte de abajur de mesa e uma mesa giratória com fundo de EVA preto para simular o movimento da esteira.

 

Materiais
Figura 9 - Materiais
Iluminação domo
Figura 10 - Iluminação domo

 

Montagem da iluminação domo, feita com meia bola de isopor e fita led, a lente da câmera fica no centro do domo, os leds apontam para dentro do domo, esta iluminação é difusa, utilizada para evitar reflexo e obter uma iluminação uniforme. Funciona bem próximo ao objeto a ser inspecionado.

 

Projeto final
Figura 11 - Projeto final

 

Observações

 

Em projetos industriais utilizamos equipamentos industriais de alto desempenho e precisão, como as câmeras inteligentes da COGNEX, que possuem processadores dedicados com software próprio, iluminações como as da ADVANCED ILLUMINATION e lentes de alta qualidade, para realizar inspeções em linhas de alta velocidade com precisão e repetibilidade, além de conexão com robôs e outros equipamentos industriais.

 

É possível utilizar este software com câmeras industriais, mas é necessário fazer a integração! Nosso objetivo aqui é fornecer um ambiente de estudos de visão computacional de baixo custo com materiais simples e promover o uso de software livre para fins educacionais!

 

Isso é o mais simples que posso fazer, não é utilizado para fins industriais e sim para estudos!

 

 

Repositório do projeto para download

 

Vocês podem baixar o exemplo completo neste repositório.

 

Vídeo

 

 

Existe uma versão em Python e uma em C++ para este projeto.

 

Espero que gostem!

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

28
Deixe um comentário

avatar
 
13 Comment threads
15 Thread replies
8 Followers
 
Most reacted comment
Hottest comment thread
15 Comment authors
Thiagoandre ribeiroHericles JardimRo MemLeandro Passarelli Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Thiago
Visitante
Thiago

Leandro boa tarde,

Estou trabalhando em um TCC sobre "PROGRAMA DE OTIMIZAÇÃO DA LÍNGUA BRASILEIRA DE SINAIS (LIBRAS)", inicialmente na plataforma mobile.

Quero desenvolver um tradutor de LIBRAS para português e vice-versa.

Poderia me ajudar com estudos e/ou pesquisas semelhantes na área?
Ou alguma tecnologia (pesquisei sobre OpenCV que acho vai ajudar muito no desenvolvimento do meu TCC)...

Obrigado!!

andre ribeiro
Visitante
andre ribeiro

Gostaria da saber onde vejo a versão em Python ?

Hericles Jardim
Visitante
Hericles Jardim

Boa tarde, gostaria de saber qual software de programação o senhor utilizou.

Ro Mem
Visitante
Ro Mem

Caro Passarelli, boa tarde!

Estou desenvolvendo um projeto sobre "Processamento de Imagens na Agricultura de Precisão" (foco: Pragas em Folhas) com OpenCV e Python.
Poderia me ajudar com estudos e/ou pesquisas semelhantes na área?
Estou encontrando dificuldades...

Agradeço sua gentileza.
Forte Abraço,

Airton Gaidys
Membro
Airton Gaidys

E ai maluco, tudo dentro? Leandro, aqui Airton TAGAI, coloca para eu ver o tempo em ms que cada rotina leva para executar cada função. Só para comparar com o meu feito em Processing. Outra coisa, também estou usando a camera do PS3 aqui, esta camera é fera,. 100 Frames com ajustes muito bacanas. Parabéns pelo trabalho.

Willian Cardoso
Membro
willian_horik

Parabéns, bom trabalho.
Há dois anos no meu TCC fiz um trabalho com OpenCV semelhante a esse, mas no caso era para reconhecimento de doença em sementes de soja utilizando machine learning e classificação com o WEKA em dispositivos mobile (android)

Willian Cardoso
Membro
willian_horik

O objetivo final era medir a melhor performance no quesito acurácia e tempo de descritores (explicados no trabalho) e classificação. Segue o link da monografia https://drive.google.com/open?id=0Bw6ZiUelKGElQ24xckMtN0ZVeEk

Mande um feedback do que achou. Ficarei grato

José Elias Gonçalves Leiva
Visitante
José Elias Gonçalves Leiva

tem link do seu tcc?

Willian Cardoso
Membro
willian_horik

Opa, mandei o no comentário acima... Mande um feedback depois.

Márcio
Visitante
Márcio

Leandro, fiz uma aplicação em Python que ao ser chamada ela grava um arquivo avi de 10 segundos de vídeo. Mas isso tendo acesso por shell através de alguma interface gráfica.

Sabe se tem alguma forma fazer essa gravação via prompt através de um ssh por exemplo?

quando tento rodar ele me reporta esse erro 'Gtk-WARNING **: cannot open display:'

Andre
Visitante
Andre

Boa noite amigo ! Desde já quero parabenizá-lo pelo projeto !
Eu tenho algumas dúvidas:
-Alem do python, o que preciso para compilar o codigo no windows?. Sou novato nesta area e estou apanhando muito para conseguir fazer rodar.
-Que tipo de camera preciso para funcionar no codigo?
Obrigado

João Lucas
Visitante
João Lucas

Amigo esse código foi feito para linux pelo que vi né? Já compilei outros exemplos usando visual studio (C++) e openCV, aqui. Mas, esse está dando erros... Tem alguma dica ou versão do código compatível com windows? Queria um exemplo que identifica alteração em uma imagem como esse... E parabéns pelo artigo!

Évelyn Silveira
Visitante
Évelyn Silveira

Muito legal! Parabéns!