Lab05 - Espaço de cor e contorno
Objetivos da aula:
- Conhecer o espaço de cor HSV
- Conhecer o processo de mascara
- conhecer o processo de detecção de contornos
- conhecer o processo de calculo do centro de massa
- conhecer o processo para desenar e escrever na imagem
Espaço de cor HSV¶
Até o momento trabalhamos com imagens em escala de cinza, BGR, RGB e binaria. Agora vamos conhecer e trabalhar com HSV ou HSB.
H - hue (matriz)
S - saturation (saturação)
V - value (Value) ou B - brightness (brilho)
Utilizar esse espaço possui algumas vantagens vamos ver no exemplo abaixo.
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/HSV_colorspace.jpg /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/bolinha.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/convolution.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/formas.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/formas_contorno.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/formas_contornor.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/lena.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/melancia.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/melancia_filtrada.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/HSV_colorspace.jpg /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/melancia_filtrada_rgb.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/same_padding_no_strides.gif /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/sudoku.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/PDI/lab05/tux.png /content
--2023-02-23 21:32:26-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/HSV_colorspace.jpg Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 20800 (20K) [image/jpeg] Saving to: ‘HSV_colorspace.jpg’ HSV_colorspace.jpg 0%[ ] 0 --.-KB/s HSV_colorspace.jpg 100%[===================>] 20.31K --.-KB/s in 0.001s 2023-02-23 21:32:26 (21.7 MB/s) - ‘HSV_colorspace.jpg’ saved [20800/20800] /content: Scheme missing. FINISHED --2023-02-23 21:32:26-- Total wall clock time: 0.2s Downloaded: 1 files, 20K in 0.001s (21.7 MB/s) --2023-02-23 21:32:26-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/bolinha.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 205355 (201K) [image/png] Saving to: ‘bolinha.png’ bolinha.png 100%[===================>] 200.54K --.-KB/s in 0.03s 2023-02-23 21:32:27 (7.75 MB/s) - ‘bolinha.png’ saved [205355/205355] /content: Scheme missing. FINISHED --2023-02-23 21:32:27-- Total wall clock time: 0.2s Downloaded: 1 files, 201K in 0.03s (7.75 MB/s) --2023-02-23 21:32:27-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/convolution.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.111.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 162095 (158K) [image/png] Saving to: ‘convolution.png’ convolution.png 100%[===================>] 158.30K --.-KB/s in 0.02s 2023-02-23 21:32:27 (6.76 MB/s) - ‘convolution.png’ saved [162095/162095] /content: Scheme missing. FINISHED --2023-02-23 21:32:27-- Total wall clock time: 0.2s Downloaded: 1 files, 158K in 0.02s (6.76 MB/s) --2023-02-23 21:32:27-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/formas.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 34765 (34K) [image/png] Saving to: ‘formas.png’ formas.png 100%[===================>] 33.95K --.-KB/s in 0.003s 2023-02-23 21:32:27 (10.2 MB/s) - ‘formas.png’ saved [34765/34765] /content: Scheme missing. FINISHED --2023-02-23 21:32:27-- Total wall clock time: 0.1s Downloaded: 1 files, 34K in 0.003s (10.2 MB/s) --2023-02-23 21:32:27-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/formas_contorno.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.110.133, 185.199.109.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 22192 (22K) [image/png] Saving to: ‘formas_contorno.png’ formas_contorno.png 100%[===================>] 21.67K --.-KB/s in 0.002s 2023-02-23 21:32:27 (14.1 MB/s) - ‘formas_contorno.png’ saved [22192/22192] /content: Scheme missing. FINISHED --2023-02-23 21:32:27-- Total wall clock time: 0.1s Downloaded: 1 files, 22K in 0.002s (14.1 MB/s) --2023-02-23 21:32:27-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/formas_contornor.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 22192 (22K) [image/png] Saving to: ‘formas_contornor.png’ formas_contornor.pn 100%[===================>] 21.67K --.-KB/s in 0.002s 2023-02-23 21:32:27 (13.8 MB/s) - ‘formas_contornor.png’ saved [22192/22192] /content: Scheme missing. FINISHED --2023-02-23 21:32:27-- Total wall clock time: 0.1s Downloaded: 1 files, 22K in 0.002s (13.8 MB/s) --2023-02-23 21:32:27-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/lena.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 218726 (214K) [image/png] Saving to: ‘lena.png’ lena.png 100%[===================>] 213.60K --.-KB/s in 0.03s 2023-02-23 21:32:28 (8.10 MB/s) - ‘lena.png’ saved [218726/218726] /content: Scheme missing. FINISHED --2023-02-23 21:32:28-- Total wall clock time: 0.2s Downloaded: 1 files, 214K in 0.03s (8.10 MB/s) --2023-02-23 21:32:28-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/melancia.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1359302 (1.3M) [image/png] Saving to: ‘melancia.png’ melancia.png 100%[===================>] 1.30M --.-KB/s in 0.06s 2023-02-23 21:32:28 (23.5 MB/s) - ‘melancia.png’ saved [1359302/1359302] /content: Scheme missing. FINISHED --2023-02-23 21:32:28-- Total wall clock time: 0.3s Downloaded: 1 files, 1.3M in 0.06s (23.5 MB/s) --2023-02-23 21:32:28-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/melancia_filtrada.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 3956 (3.9K) [image/png] Saving to: ‘melancia_filtrada.png’ melancia_filtrada.p 100%[===================>] 3.86K --.-KB/s in 0s 2023-02-23 21:32:28 (46.7 MB/s) - ‘melancia_filtrada.png’ saved [3956/3956] /content: Scheme missing. FINISHED --2023-02-23 21:32:28-- Total wall clock time: 0.1s Downloaded: 1 files, 3.9K in 0s (46.7 MB/s) --2023-02-23 21:32:28-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/HSV_colorspace.jpg Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 20800 (20K) [image/jpeg] Saving to: ‘HSV_colorspace.jpg.1’ HSV_colorspace.jpg. 100%[===================>] 20.31K --.-KB/s in 0.001s 2023-02-23 21:32:28 (18.7 MB/s) - ‘HSV_colorspace.jpg.1’ saved [20800/20800] /content: Scheme missing. FINISHED --2023-02-23 21:32:28-- Total wall clock time: 0.05s Downloaded: 1 files, 20K in 0.001s (18.7 MB/s) --2023-02-23 21:32:28-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/melancia_filtrada_rgb.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 76721 (75K) [image/png] Saving to: ‘melancia_filtrada_rgb.png’ melancia_filtrada_r 100%[===================>] 74.92K --.-KB/s in 0.01s 2023-02-23 21:32:29 (6.08 MB/s) - ‘melancia_filtrada_rgb.png’ saved [76721/76721] /content: Scheme missing. FINISHED --2023-02-23 21:32:29-- Total wall clock time: 0.2s Downloaded: 1 files, 75K in 0.01s (6.08 MB/s) --2023-02-23 21:32:29-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/same_padding_no_strides.gif Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 276460 (270K) [image/gif] Saving to: ‘same_padding_no_strides.gif’ same_padding_no_str 100%[===================>] 269.98K --.-KB/s in 0.03s 2023-02-23 21:32:29 (8.34 MB/s) - ‘same_padding_no_strides.gif’ saved [276460/276460] /content: Scheme missing. FINISHED --2023-02-23 21:32:29-- Total wall clock time: 0.2s Downloaded: 1 files, 270K in 0.03s (8.34 MB/s) --2023-02-23 21:32:29-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/sudoku.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 191852 (187K) [image/png] Saving to: ‘sudoku.png’ sudoku.png 100%[===================>] 187.36K --.-KB/s in 0.02s 2023-02-23 21:32:29 (7.60 MB/s) - ‘sudoku.png’ saved [191852/191852] /content: Scheme missing. FINISHED --2023-02-23 21:32:29-- Total wall clock time: 0.2s Downloaded: 1 files, 187K in 0.02s (7.60 MB/s) --2023-02-23 21:32:29-- https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab05/tux.png Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 140853 (138K) [image/png] Saving to: ‘tux.png’ tux.png 100%[===================>] 137.55K --.-KB/s in 0.02s 2023-02-23 21:32:29 (6.07 MB/s) - ‘tux.png’ saved [140853/140853] /content: Scheme missing. FINISHED --2023-02-23 21:32:29-- Total wall clock time: 0.2s Downloaded: 1 files, 138K in 0.02s (6.07 MB/s)
!pip install opencv-python
Requirement already satisfied: opencv-python in c:\users\junior\appdata\local\programs\python\python310\lib\site-packages (4.5.5.62)
WARNING: You are using pip version 21.2.4; however, version 22.1 is available. You should consider upgrading via the 'C:\Users\junior\AppData\Local\Programs\Python\Python310\python.exe -m pip install --upgrade pip' command.
Requirement already satisfied: numpy>=1.19.3 in c:\users\junior\appdata\local\programs\python\python310\lib\site-packages (from opencv-python) (1.22.2)
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('hsv_colorspace.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.figure(figsize = (20,20))
plt.imshow(img); plt.show()
A matiz descreve o pigmento de uma cor e é medido em graus de 0 a 359 graus.
A saturação descreve a vivacidade ou o esmaecimento de uma cor e é medida em porcentagem de 0 a 100 (0 = cor "diluida" 100 = cor pura).
O brilho determina a intensidade percebida (0 = preto 100 = brilho maximo);
Dica: Pra entender bem o que é cada componente, da uma olhada neste link ou digita no google "colorpicker"
lembrete super importante!! a OpenCV trabalha com valores de 8bits (0-255), ou seja o valor da matriz tem que ser divido por 2
Conversão para HSV
Na OpenCV a conversão de BGR para RGB é muito simples, podemos converter diretamete da imagem em BGR usando o cv2.COLOR_BGR2HSV.
img = cv2.imread('bolinha.png')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.subplot(1, 2, 2)
plt.imshow(img_hsv)
plt.show()
mascara de cor
Para realizar uma marcara de cor, nos usamos a função cv2.inrange para escolher o intervalo de cor ( o valor minimo e o valor maximo).
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('bolinha.png')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Definição dos valores minimo e max da mascara
# o magenta tem h=300 mais ou menos ou 150 para a OpenCV
image_lower_hsv = np.array([140, 100, 40])
image_upper_hsv = np.array([175, 255, 255])
mask_hsv = cv2.inRange(img_hsv, image_lower_hsv, image_upper_hsv)
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.subplot(1, 2, 2)
plt.imshow(mask_hsv, cmap="Greys_r", vmin=0, vmax=255)
plt.show()
DESAFIO 1¶
Faça a segmentação da meia lua da imagem "melancia.png". O seu resultado deve ser proximo/parecido com a imagem "melancia_filtrada.png".
Dica: talvez você precise usar mais que uma faixa de valores, se necessário use a função "cv2.bitwise_or" para juntar as partes.
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('melancia.png')
img_res = cv2.imread('melancia_filtrada.png')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_res_rgb = cv2.cvtColor(img_res, cv2.COLOR_BGR2RGB)
fig = plt.figure(figsize=(20,20))
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.subplot(1, 2, 2)
plt.imshow(img_res_rgb)
plt.show()
#Implemente seu código
DESAFIO 2¶
Usando a imagem "melancia_filtrada.png", devolva a cor original que era antes da filtragem.
Dica: Use as funções de "cv2.bitwise_and" para juntar.
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('melancia_filtrada.png')
img_res = cv2.imread('melancia_filtrada_rgb.png')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_res_rgb = cv2.cvtColor(img_res, cv2.COLOR_BGR2RGB)
fig = plt.figure(figsize=(20,20))
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.subplot(1, 2, 2)
plt.imshow(img_res_rgb)
plt.show()
#Implemente seu código
DETECÇÃO DE CONTORNOS¶
Para realizar a detecção dos contornos, ou bordas de um objeto, usamos a função cv2.findontours
#recarregando o nosso exemplo...
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('bolinha.png')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Definição dos valores minimo e max da mascara
# o magenta tem h=300 mais ou menos ou 150 para a OpenCV
image_lower_hsv = np.array([140, 50, 100])
image_upper_hsv = np.array([170, 255, 255])
mask_hsv = cv2.inRange(img_hsv, image_lower_hsv, image_upper_hsv)
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.subplot(1, 2, 2)
plt.imshow(mask_hsv, cmap="Greys_r", vmin=0, vmax=255)
plt.show()
# realizando o contorno da imagem
contornos, _ = cv2.findContours(mask_hsv, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# para desenhar o contorno primeiro faz uma copia da imagem
mask_rgb = cv2.cvtColor(mask_hsv, cv2.COLOR_GRAY2RGB)
contornos_img = mask_rgb.copy() # Cópia da máscara para ser desenhada "por cima"
cv2.drawContours(contornos_img, contornos, -1, [255, 0, 0], 5);
plt.figure(figsize=(8,6))
plt.imshow(contornos_img);
# para desenhar o contorno primeiro faz uma copia da imagem
mask_rgb = cv2.cvtColor(mask_hsv, cv2.COLOR_GRAY2RGB)
contornos_img = mask_rgb.copy() # Cópia da máscara para ser desenhada "por cima"
cv2.drawContours(img_rgb, contornos, -1, [0, 0, 255], 10);
plt.figure(figsize=(8,6))
plt.imshow(img_rgb);
Note que a função findContours devolve uma lista com os contornos detectados.
print("Quantidade de contornos encontrado: ", len(contornos))
Quantidade de contornos encontrado: 1
DESAFIO 3¶
Usando a imagem "formas.png", faça um código que detecta todos os contornos da imagem. O resultado deve ser parecido com "formas_contorno.png"
Dica: Neste desafio, basicamente tem que ajustar a a mascara, o resto não muda.
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('formas.png')
img_res = cv2.imread('formas_contorno.png')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_res_rgb = cv2.cvtColor(img_res, cv2.COLOR_BGR2RGB)
# Definição dos valores minimo e max da mascara
image_lower_hsv = np.array([0, 1, 0])
image_upper_hsv = np.array([180, 255, 255])
fig = plt.figure(figsize=(20,20))
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.subplot(1, 2, 2)
plt.imshow(img_res_rgb)
plt.show()
#Implemente seu código
DESAFIO 4¶
Altere o seu codigo para desenhar o contorno de maior area da imagem. Use a função "cv2.contourArea()".
Referência da documentação: https://docs.opencv.org/master/dd/d49/tutorial_py_contour_features.html
Dica: Use um for para varrer a lista e armazene o indice do maior valor e passe esse valor para desenhar o contorno.
## Implemente seu código
CENTRO DE MASSA DE UM OBJETO¶
O calculo para o centro de massa é feito atráves da função cv2.findontours
cv2.__version__
'4.5.5'
#recarregando o nosso exemplo...
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('bolinha.png')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Definição dos valores minimo e max da mascara
# o magenta tem h=300 mais ou menos ou 150 para a OpenCV
image_lower_hsv = np.array([140, 50, 100])
image_upper_hsv = np.array([170, 255, 255])
mask_hsv = cv2.inRange(img_hsv, image_lower_hsv, image_upper_hsv)
contornos, _ = cv2.findContours(mask_hsv, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
mask_rgb = cv2.cvtColor(mask_hsv, cv2.COLOR_GRAY2RGB)
contornos_img = mask_rgb.copy() # Cópia da máscara para ser desenhada "por cima"
cv2.drawContours(contornos_img, contornos, -1, [255, 0, 0], 5);
plt.figure(figsize=(8,6))
plt.imshow(contornos_img);
# usando o exemplo da documentação https://docs.opencv.org/master/dd/d49/tutorial_py_contour_features.html
# notamos que a função devolve um dicionario.
cnt = contornos[0]
M = cv2.moments(cnt)
print( M )
{'m00': 20954.5, 'm10': 8414785.5, 'm01': 4813317.5, 'm20': 3414210172.083333, 'm11': 1932427931.625, 'm02': 1140509199.0833333, 'm30': 1399201096317.6501, 'm21': 783868070420.7833, 'm12': 457787216119.7167, 'm03': 278003040454.85004, 'mu20': 35049847.99971104, 'mu11': -475946.1051416397, 'mu02': 34874354.26211333, 'mu30': -7672941.9208984375, 'mu21': -4968840.380795479, 'mu12': 6858123.621509552, 'mu03': 2822544.575317383, 'nu20': 0.07982364109512664, 'nu11': -0.0010839348312655414, 'nu02': 0.07942396606302501, 'nu30': -0.00012071706132489804, 'nu21': -7.817390189392743e-05, 'nu12': 0.00010789766667418762, 'nu03': 4.4406603113053444e-05}
# Calculo das coordenadas do centro de massa
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
print("centro de massa na possição: ",cx, cy)
centro de massa na possição: 401 229
Vamos plotar isso na imagem para saber se esta correto. A função "cv2.line" vai nos ajudar a desenhar uma cruz. e função "cv2.putText" a escrever na imagem as coordenadas.
## para desenhar a cruz vamos passar a cor e o tamanho em pixel
size = 20
color = (128,128,0)
cv2.line(contornos_img,(cx - size,cy),(cx + size,cy),color,5)
cv2.line(contornos_img,(cx,cy - size),(cx, cy + size),color,5)
# Para escrever vamos definir uma fonte
font = cv2.FONT_HERSHEY_SIMPLEX
text = cy , cx
origem = (0,50)
cv2.putText(contornos_img, str(text), origem, font,1,(200,50,0),2,cv2.LINE_AA)
plt.imshow(contornos_img);
DESAFIO 5¶
O desafio é juntar o que aprendemos em um video, use como base "webcam.py". Você deve seguimentar a cor de um objeto, encontrar seu contorno e montar a imagem segmentada com o centro de massa e suas coordenadas. Video de referência "segmenta_melancia.mp4"
#### seu código aqui...