O documento apresenta uma introdução à visão computacional e à biblioteca OpenCV. Resume os principais tópicos abordados: 1) Apresentação do palestrante; 2) Instalação e uso básico da OpenCV em Python; 3) Exemplos iniciais de detecção de bordas e conversão para escala de cinza usando a biblioteca.
1. Construindo Máquinas que Veem:
Uma Introdução ao Mundo da Visão
Computacional
II Simpósio de Pesquisa e Desenvolvimento em Computação
11 e 12 de maio de 2016
MEng. Cristiano Rafael Steffens
2. Sobre mim:
• Mestre em Eng. de Computação – FURG
• Professor
• Bolsista DTI – CAPES
• Consultor na S-Project
• Áreas de interesse:
– Robótica para aplicações industriais
– Visão Computacional
– Sistemas de medição baseados em visão
– Aprendizagem de máquina
CristianoSteffens@furg.br
Cristiano@sproject.com.br
3. Agenda
• O que é a OpenCV?
• Como instalar?
• A linguagem Python
• Hello World
• O que podemos fazer com OpenCV?
4. O que é OpenCV?
• OpenCV (Open Source Computer Vision) é
uma biblioteca de programação com funções
de visão computacional de tempo real.
• Distribuída sob a licença BSD.
• Possui interfaces para C/C++, Python.
• Possui suporte para Windows, Linux Android e
Mac OS.
5. Como instalar a OpenCV?
• Software necessário:
– Python27
– numpy-1.8.2-win32-superpack-python2.7
– matplotlib-1.3.0.win32-py2.7
– OpenCv 3.1.0
• Passo a passo:
docs.opencv.org/3.1.0/d5/de5/tutorial_py_setup
_in_windows.html
7. Como instalar a OpenCV?
• Software necessário (parte 2):
– $ cd ~
– $ git clone https://github.com/Itseez/opencv.git
– $ cd opencv
– $ git checkout 3.1.0
– $ cd ~
– $ git clone https://github.com/Itseez/opencv_contrib.git
– $ cd opencv_contrib
– $ git checkout 3.1.0
8. Como instalar a OpenCV?
• Software necessário (parte 3):
– $ cd ~/opencv
– $ mkdir build
– $ cd build
– $ cmake -D CMAKE_BUILD_TYPE=RELEASE
-D CMAKE_INSTALL_PREFIX=/usr/local
-D INSTALL_C_EXAMPLES=OFF
-D INSTALL_PYTHON_EXAMPLES=ON
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules
-D BUILD_EXAMPLES=ON ..
– $ make -j4
– $ sudo make install
– $ sudo ldconfig
9. Como instalar a OpenCV?
• Máquina virtual do ROS:
– Download em:
http://nootrix.com/2014/09/ros-indigo-virtual-machine/
– Se estiver utilizando Virtual Box precisa instalar o Extension
Pack para habilitar USB 2.0 *
– Para habilitar o uso da webcam do computador é necessário a
instalação do Cheese, GUVCView e os drivers da câmera.
– Mais informações podem ser encontradas em:
https://siddhantahuja.wordpress.com/2011/07/20/working-with-
ros-and-opencv-draft/
10. A linguagem Python
Python é uma linguagem de programação
poderosa e de fácil aprendizado. Possui
estruturas de dados de alto nível eficientes,
bem como adota uma abordagem simples e
efetiva para a programação orientada a
objetos. Sua sintaxe elegante e tipagem
dinâmica, além de sua natureza interpretada,
tornam Python ideal para scripting e para o
desenvolvimento rápido de aplicações em
diversas áreas e na maioria das plataformas.
11. A linguagem Python - Números
>>> 2+2
4
>>> # Isto é um comentário
... 2+2
4
>>> (50-5*6)/4
5
>>> # A divisão entre inteiros arredonda para baixo:
... 7/3
2
>>> 7/-3
-3
12. A linguagem Python - Números
>>> 7.0 / 2
3.5
>>> largura = 20
>>> algura = 5*9
>>> largura * altura
900
>>> # Zerar x, y, z
>>> x = y = z = 0
13. A linguagem Python - Strings
>>> 'spam eggs'
'spam eggs'
>>> 'doesn't'
"doesn't"
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> ""Yes," he said."
'"Yes," he said.'
>>> '"Isn't," she said.'
'"Isn't," she said.'
16. A linguagem Python - Listas
>>> a
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]
>>> remover itens da lista
>>> a[0:2] = []
17. A linguagem Python - Repetição
a, b = 0, 1
>>> while b < 10:
print b
a, b = b, a+b
18. A linguagem Python - Decisão
>>> x = int(raw_input("Favor digitar um inteiro: "))
Favor digitar um inteiro: 42
>>> if x < 0:
x = 0
print 'Negativo alterado para zero'
elif x == 0:
print 'Zero'
elif x == 1:
print 'Unidade'
else:
print 'Mais'
19. A linguagem Python - For
>>> # Medir o tamanho de algumas strings:
>>> a = ['gato', 'janela', 'defenestrar']
>>> for x in a:
print x, len(x)
gato 4
janela 6
defenestrar 11
20. A linguagem Python - For
>>> for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print n, '=', x, '*', n/x
break
else: # laço terminou sem encontrar um fator
print n, 'é um número primo'
2 é um número primo
3 é um número primo
4 = 2 * 2
5 é um número primo
6 = 2 * 3
7 é um número primo
8 = 2 * 4
9 = 3 * 3
21. A linguagem Python - Funções
>>> def fib(n): # escrever série de Fibonacci
até n
"""Exibe série de Fibonacci até n"""
a, b = 0, 1
while a < n:
print a,
a, b = b, a+b
>>> # Agora invocamos a função que
acabamos de definir:
fib(2000)
22. A linguagem Python - Funções
>>> def fib2(n): # devolve a série de Fibonacci até n
"""Devolve uma lista a com série de Fibonacci
até n."""
resultado = []
a, b = 0, 1
while a < n:
resultado.append(a) # veja mais adiante
a, b = b, a+b
return resultado
>>> f100 = fib2(100) # executar
>>> f100 # exibir o resultado
23. Python - Numpy
NumPy é um pacote de Python que suporta
operações com vetores e matrizes e é
essencial para a computação científica com
Python.
É baseado em C, portanto tem um
desempenho superior se comparado às
operações com vetores originais do Python.
24. Python - Numpy
>>> import numpy as np
>>> a = np.array([0,1,2,3,4,5])
>>> type(a)
>>> a = np.array([[0,1,2,3], [4,5,6,7],
[8,9,10,11]])
>>> a.shape
(3,4)
25. Python - Numpy
>>> a[1,3] # acessa uma posição
>>> a[0,3:5] # pega parte da matriz
>>>a[:,2] #pega parte da matriz
>>> a.transpose() # matriz transposta
>>> np.sum(a) # soma dos elementos
>>> a.sum() #soma dos elementos
>>> np.amin(a) # menor valor
>>> a.argmin() # índice do menor valor
>>> np.amax(a) # maior valor
>>> a.flat[:] # array como vetor
26. Aplicações da OpenCV
• A biblioteca OpenCV é dividida em módulos
– core - define as principais estruturas de dados utilizadas pela biblioteca.
Ex.: Mat e Point.
– improc - Módulo de processamento de imagem que inclui filtros
lineares e não lineares além de transformações geométricas.
– highgui - Módulo com funções de interface como criação de janelas.
– objdetect - Módulo com funções de detecção de objetos. Ex: haar,
cascade classifiers.
– ml – Módulo com funções de Machine Learning. Ex: classificadores de
árvore, knn, redes neurais, svm e classificadores bayesianos.
– video – Módulo com funções de processamento de video. Ex:
KalmanFilter.
• A lista completa pode ser obtida em
http://docs.opencv.org/modules/refman.html
28. Importante!! cv::Mat
# Operador de atribuição
a = b;
# Mostrar no console
print(a);
# Clonar uma matriz
b = np.copy(a);
# utilizar parte de uma matriz definindo uma região de interesse
b = a[0:100,0:100];
# Criando uma Mat
b = np.zeros((2,2,3), np.uint8);
b = np.ones((2,2,3), np.float32);
# Alterar uma posição (branco)
a[1,1] = 255;
# altera o canal de cor verde para o valor
a[1,1,2] = 255;
29. Olá turma!!
# imports da opencv
import cv2
# lê a imagem para uma matriz
image = cv2.imread("unicruz.png");
# cria uma janela para mostrar a imagem
cv2.namedWindow("Tutorial OpenCv - Unicruz");
# mostra a imagem
cv2.imshow("Tutorial OpenCv - Unicruz", image);
# renderiza e aguarda entrada do teclado
cv2.waitKey()
#fecha todas as janelas
cv2.destroyAllWindows();
30. Olá mundo!!
# imports da opencv
import cv2
# lê a imagem para uma matriz
image = cv2.imread("unicruz.png");
#converte para escala de cinza
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY);
# cria uma janela para mostrar a imagem
cv2.namedWindow("Tutorial OpenCv - Unicruz");
cv2.imshow("Tutorial OpenCv - Unicruz", gray_image);
# renderiza e aguarda entrada do teclado
cv2.waitKey()
cv2.destroyAllWindows();
31. Realçando uma imagem
image = cv2.imread("E:/trash/img.jpg");
if (image.size>0)):
# cria a versão suavizada
blured = cv2.blur(image, (5,5))
# adiciona ao original (unsharp filter)
sharp = cv2.addWeighted(image, 1.5, blured, 0,6);
# calcula a diferença entre as imagens
diference = cv2.absdiff(image, sharp);
# mostra a imagem
cv2.imshow("Original", image); cv2.imshow("Blured", blured);
cv2.imshow("Sharp", sharp); cv2.imshow("diference", diference);
# salva as imagens em arquivo
cv2.imwrite("sharp.png", sharp);
cv2.waitKey();
32. Encontrando Bordas
image = cv2.imread("unicruz.png");
gray_image = cv2.cvtColor(image,
cv2.COLOR_BGR2GRAY);
# Remove o ruído da imagem utilizando um filtro 3x3
gray_image = cv2.blur(gray_image, (5,5))
# Detector de bordas de Canny # origem, threshold baixo,
threshold alto;
edges = cv2.Canny(gray_image, 100, 200);
# mostra a saída
cv2.imshow("Bordas", edges); cv2.waitKey();
33. That’s it for today!
• CristianoSteffens@furg.br
• Cristiano@SProject.com.br
Notas do Editor
Construindo Máquinas que Veem: Uma Introdução ao Mundo da Visão Computacional
O Processamento de Imagens se apresenta como uma ferramenta de manipulação de dados em imagens tornando-as apropriadas para algoritmos de visão computacional ou para o observador humano. Variação de brilho e contraste, equalização de histograma, remoção de ruído e nitidez são apenas algumas das técnicas que podem ser utilizadas. A visão computacional transcende estas técnicas, utilizando algoritmos especialmente projetados e aprendizagem de máquina para transformar dados de imagens e vídeos em informações relevantes.
Nesta oficina exploram-se as principais características de imagens digitais, sua aquisição, representação no computador e como elas podem ser manipuladas. Os principais conceitos, as técnicas e algoritmos mais difundidos e sua implementação na biblioteca OpenCv são revisadas. Em seguida, faz se o desenvolvimento de algoritmos de visão computacional, incluindo técnicas OCR (Optical Character Recognition), detecção e reconhecimento de faces.
Atua junto ao NAUTEC - Grupo de Automação e Robótica Inteligentes - do Centro de Ciências Computacionais na Universidade Federal do Rio Grande - FURG. É Bolsista de Desenvolvimento Tecnológico Industrial C - CNPq. Atua na análise e desenvolvimento de soluções em visão computacional e aprendizagem de máquina para problemas não resovidos em robótica industrial. Tem conhecimento em linguagens e ferramentas para desenvolvimento Web e C++. Desenvolveu sistemas embarcados em hardware e software. Publicações recentes incluem conferências como ICRA (CC-A1) - International Conference in Robotics and Automation, VISAPP (CC-B3) - International Conference on Computer Vision Theory and Applications, IWS (CC-B4) - Iberchip Workshop, LARS (CC-B4) - Latin American Robotics Symposium e SBAI (CC-B4) - Simpósio Brasileiro de Automação Inteligente.
É membro do comitê revisor do SYROCO (CC-B3) - IFAC Symposium on Robot Control, ICCEEg-FURG (CC-C) - Revista Jr de Iniciação Científica em Ciências Exatas e Engenharia e avaliador do Simpósio de Pesquisa e Desenvolvimento em Computação da Universidade de Cruz Alta - UNICRUZ. Atua como professor do magistério superior substituto junto à FURG desde 2015 lecionando nas disciplinas de Sistemas para Internet, Sistemas Operacionais, Algoritmos Computacionais, Tópicos Especiais em Sistemas de Informação e Atividades de Integração Curricular. Leciona nos nos cursos de Engenharia de Computação, Sistemas de Informação, Engenharia de Automação e Engenharia Civil Costeira e Portuária.
Tradutor Coursera
Tutor Bliive
Diferentemente de C, strings em Python não podem ser alteradas. Tentar atribuir valor a uma posição (índice ou fatia) dentro de uma string resulta em erro!!
Python inclui diversas estruturas de dados compostas, usadas para agrupar outros valores. A mais versátil é list (lista), que pode ser escrita como uma lista de valores (itens) separados por vírgula, entre colchetes. Os valores contidos na lista não precisam ser todos do mesmo tipo.
Da mesma forma que índices de string, índices de lista começam em 0, listas também podem ser concatenadas, fatiadas e multiplicadas.
Diferentemente de strings, que são imutáveis, é possível alterar elementos individuais de uma lista:
Diferentemente de strings, que são imutáveis, é possível alterar elementos individuais de uma lista:
Diferentemente de strings, que são imutáveis, é possível alterar elementos individuais de uma lista:
Diferentemente de strings, que são imutáveis, é possível alterar elementos individuais de uma lista:
Diferentemente de strings, que são imutáveis, é possível alterar elementos individuais de uma lista:
Diferentemente de strings, que são imutáveis, é possível alterar elementos individuais de uma lista: