FAVORITAR
FecharPlease loginn
34 Comentários
FAVORITAR
FecharPlease loginn

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.

https://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!

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Home » Software » Aplicação de visão computacional com OpenCV

WEBINARS

LEIA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Comentários:
Notificações
Notificar
guest

34 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Aly Olaia
Aly Olaia
11/06/2023 08:57

Saudacoes!

Como posso usar o algortimo para reconhecimento de residuos solidos urbanos, gostaria de desenvolver uma aplicacao para reconhecimento de residuos solidos/lixo descartados em locais ilegais?

Leandro Passarelli
Leandro Passarelli
Reply to  Aly Olaia
12/06/2023 15:04

Olá Aly, saudações 🖖

Esse tipo de aplicação mais avançada precisa ser desenvolvida com IA.

Presto consultoria para essas aplicações através da Agrostorm computer vision.

@agrostorm [email protected]
http://www.agrostorm.com.br

Por favor entre em contato que irei te atender e te apresentar as melhores soluções para o seu desafio.

Márcio Silveira
Márcio Silveira
30/11/2018 23:31

Faz o treinamento e usa haar cascade, muito mais confiável, não precisa de luz controlada, ambiente controlado. Desse jeito nunca vai funcionar na “vida real”, só em laboratório com tudo (ambiente, luz, objeto) controlados.

Rogério Isidorio
Rogério Isidorio
Reply to  Márcio Silveira
24/06/2019 22:40

Precisamos de um profissional para desenvolver uma solução em visão computacional. Teria alguém para indicar?
Obrigado.

Márcio Silveira
Márcio Silveira
Reply to  Rogério Isidorio
25/06/2019 14:32

Rogério, me envia um email para conversarmos sobre seu projeto.
Meu email é [email protected]
Fico no aguardo.

Francisco
Francisco
Reply to  Rogério Isidorio
11/09/2019 18:08

Se você ainda tiver interesse em alguém, podemos conversar sobre o projeto que vocês desejam iniciar e então talvez fazermos uma parceria. Eu utilizo outras ferramentas mais precisas que opencv. Email: [email protected]

Thiago
Thiago
29/10/2018 15:24

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
andre ribeiro
18/09/2018 00:53

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

Hericles Jardim
Hericles Jardim
30/08/2018 08:37

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

Ro Mem
Ro Mem
25/08/2018 13:57

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
Airton Gaidys
30/05/2018 22:34

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.

Leandro
Leandro
Reply to  Airton Gaidys
07/06/2018 14:04

Fala Airton, tudo certo! rodei no raspi com tempo de 50ms e no i7 a 4ms, essa câmera é muito boa pra brincar. Quero ver seu artigo de futebol de robôs também!
Foram bons tempos na tagai, muito aprendizado e crescimento!
Obrigado por tudo e um grande abraço!

willian_horik
willian_horik
01/03/2018 17:18

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_horik
willian_horik
Reply to  Leandro Passarelli
19/03/2018 09:07

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
José Elias Gonçalves Leiva
Reply to  willian_horik
18/03/2018 19:12

tem link do seu tcc?

willian_horik
willian_horik
Reply to  José Elias Gonçalves Leiva
19/03/2018 09:08

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

Márcio
Márcio
17/01/2018 15:40

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
Andre
21/12/2017 21:23

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

Talvez você goste: