Simpósio Unicruz: OpenCV + Python (parte 1)

33
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

Transcript of Simpósio Unicruz: OpenCV + Python (parte 1)

Page 1: Simpósio Unicruz: OpenCV + Python (parte 1)

Construindo Máquinas que Veem:Uma Introdução ao Mundo da Visão

Computacional

II Simpósio de Pesquisa e Desenvolvimento em Computação11 e 12 de maio de 2016

MEng. Cristiano Rafael Steffens

Page 2: Simpósio Unicruz: OpenCV + Python (parte 1)

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

[email protected]@sproject.com.br

Page 3: Simpósio Unicruz: OpenCV + Python (parte 1)

Agenda• O que é a OpenCV?• Como instalar?• A linguagem Python• Hello World• O que podemos fazer com OpenCV?

Page 4: Simpósio Unicruz: OpenCV + Python (parte 1)

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.

Page 5: Simpósio Unicruz: OpenCV + Python (parte 1)

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

Page 6: Simpósio Unicruz: OpenCV + Python (parte 1)

Como instalar a OpenCV?• Software necessário (parte 1):

– $ sudo apt-get install build-essential cmake git pkg-config– $ sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev

libpng12-dev– $ sudo apt-get install libgtk2.0-dev– $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-

dev libv4l-dev– $ sudo apt-get install libatlas-base-dev gfortran– $ wget https://bootstrap.pypa.io/get-pip.py– $ sudo python get-pip.py– $ sudo apt-get install python2.7-dev– $ pip install numpy

Page 7: Simpósio Unicruz: OpenCV + Python (parte 1)

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

Page 8: Simpósio Unicruz: OpenCV + Python (parte 1)

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

Page 9: Simpósio Unicruz: OpenCV + Python (parte 1)

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/

Page 10: Simpósio Unicruz: OpenCV + Python (parte 1)

A linguagem PythonPython é 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.

Page 11: Simpósio Unicruz: OpenCV + Python (parte 1)

A linguagem Python - Números>>> 2+24>>> # Isto é um comentário... 2+24>>> (50-5*6)/45>>> # A divisão entre inteiros arredonda para baixo:... 7/32>>> 7/-3-3

Page 12: Simpósio Unicruz: OpenCV + Python (parte 1)

A linguagem Python - Números>>> 7.0 / 23.5>>> largura = 20>>> algura = 5*9>>> largura * altura900

>>> # Zerar x, y, z>>> x = y = z = 0

Page 13: Simpósio Unicruz: OpenCV + Python (parte 1)

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.'

Page 14: Simpósio Unicruz: OpenCV + Python (parte 1)

A linguagem Python - Strings>>> palavra = 'Ajuda' + 'Z'>>> palavra'AjudaZ'>>> '<' + palavra*5 + '>''<AjudaZAjudaZAjudaZAjudaZAjudaZ>‘>>> palavra[4]'a'>>> palavra[0:2]'Aj'>>> palavra[2:4]'ud‘>>> 'x' + palavra[1:]'xjudaZ‘>>> len(palavra)7

Page 15: Simpósio Unicruz: OpenCV + Python (parte 1)

A linguagem Python - Listas>>> a[0]'spam'>>> a[3]1234>>> a[-2]100>>> a[1:-1]['eggs', 100]>>> a[:2] + ['bacon', 2*2]['spam', 'eggs', 'bacon', 4]>>> 3*a[:3] + ['Boo!']['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']

Page 16: Simpósio Unicruz: OpenCV + Python (parte 1)

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] = []

Page 17: Simpósio Unicruz: OpenCV + Python (parte 1)

A linguagem Python - Repetiçãoa, b = 0, 1>>> while b < 10:

print b a, b = b, a+b

Page 18: Simpósio Unicruz: OpenCV + Python (parte 1)

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'

Page 19: Simpósio Unicruz: OpenCV + Python (parte 1)

A linguagem Python - For>>> # Medir o tamanho de algumas strings:>>> a = ['gato', 'janela', 'defenestrar']>>> for x in a: print x, len(x) gato 4janela 6defenestrar 11

Page 20: Simpósio Unicruz: OpenCV + Python (parte 1)

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 primo3 é um número primo4 = 2 * 25 é um número primo6 = 2 * 37 é um número primo8 = 2 * 49 = 3 * 3

Page 21: Simpósio Unicruz: OpenCV + Python (parte 1)

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)

Page 22: Simpósio Unicruz: OpenCV + Python (parte 1)

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

Page 23: Simpósio Unicruz: OpenCV + Python (parte 1)

Python - NumpyNumPy é 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.

Page 24: Simpósio Unicruz: OpenCV + Python (parte 1)

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)

Page 25: Simpósio Unicruz: OpenCV + Python (parte 1)

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

Page 26: Simpósio Unicruz: OpenCV + Python (parte 1)

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

Page 27: Simpósio Unicruz: OpenCV + Python (parte 1)

Importante!! Mat

Page 28: Simpósio Unicruz: OpenCV + Python (parte 1)

Importante!! cv::Mat# Operador de atribuiçãoa = b;# Mostrar no consoleprint(a);# Clonar uma matrizb = np.copy(a);# utilizar parte de uma matriz definindo uma região de interesseb = a[0:100,0:100];# Criando uma Matb = 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 valora[1,1,2] = 255;

Page 29: Simpósio Unicruz: OpenCV + Python (parte 1)

Olá turma!! # imports da opencvimport cv2

# lê a imagem para uma matrizimage = cv2.imread("unicruz.png");

# cria uma janela para mostrar a imagemcv2.namedWindow("Tutorial OpenCv - Unicruz");

# mostra a imagemcv2.imshow("Tutorial OpenCv - Unicruz", image);

# renderiza e aguarda entrada do tecladocv2.waitKey()

#fecha todas as janelascv2.destroyAllWindows();

Page 30: Simpósio Unicruz: OpenCV + Python (parte 1)

Olá mundo!! # imports da opencvimport cv2

# lê a imagem para uma matrizimage = cv2.imread("unicruz.png");

#converte para escala de cinzagray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY);

# cria uma janela para mostrar a imagemcv2.namedWindow("Tutorial OpenCv - Unicruz");cv2.imshow("Tutorial OpenCv - Unicruz", gray_image);

# renderiza e aguarda entrada do tecladocv2.waitKey()cv2.destroyAllWindows();

Page 31: Simpósio Unicruz: OpenCV + Python (parte 1)

Realçando uma imagemimage = 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();

Page 32: Simpósio Unicruz: OpenCV + Python (parte 1)

Encontrando Bordasimage = cv2.imread("unicruz.png");gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY);

# Remove o ruído da imagem utilizando um filtro 3x3gray_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ídacv2.imshow("Bordas", edges); cv2.waitKey();

Page 33: Simpósio Unicruz: OpenCV + Python (parte 1)

That’s it for today!

[email protected][email protected]