Desenhe uma forma retangular e extraia objetos usando o OpenCV do Python
OpenCV é uma biblioteca de software de aprendizagem de máquina e visão computacional de código aberto. Várias operações de processamento de imagem, como manipulação de imagens e aplicação de toneladas de filtros, podem ser feitas com a ajuda dele. É amplamente utilizado na detecção de objetos, detecção de rosto e outras tarefas de processamento de imagem.
Vamos ver como desenhar uma forma retangular na imagem e extrair os objetos usando o OpenCV.
import
cv2
import
numpy as np
drawing
=
False
mode
=
True
ix, iy
=
-
1
,
-
1
def
draw_circle(event, x, y, flags, param):
global
ix, iy, drawing, mode
if
event
=
=
cv2.EVENT_LBUTTONDOWN:
drawing
=
True
ix, iy
=
x, y
elif
event
=
=
cv2.EVENT_MOUSEMOVE:
if
drawing
=
=
True
:
if
mode
=
=
True
:
cv2.rectangle(img, (ix, iy), (x, y), (
0
,
255
,
0
),
3
)
a
=
x
b
=
y
if
a !
=
x | b !
=
y:
cv2.rectangle(img, (ix, iy), (x, y), (
0
,
0
,
0
),
-
1
)
else
:
cv2.circle(img, (x, y),
5
, (
0
,
0
,
255
),
-
1
)
elif
event
=
=
cv2.EVENT_LBUTTONUP:
drawing
=
False
if
mode
=
=
True
:
cv2.rectangle(img, (ix, iy), (x, y), (
0
,
255
,
0
),
2
)
else
:
cv2.circle(img, (x, y),
5
, (
0
,
0
,
255
),
-
1
)
img
=
np.zeros((
512
,
512
,
3
), np.uint8)
cv2.namedWindow(
'image'
)
cv2.setMouseCallback(
'image'
, draw_circle)
while
(
1
):
cv2.imshow(
'image'
, img)
k
=
cv2.waitKey(
1
) &
0xFF
if
k
=
=
ord
(
'm'
):
mode
=
not
mode
elif
k
=
=
27
:
break
cv2.destroyAllWindows()
Resultado:
O trecho de código acima funcionará apenas com a imagem de fundo preta. Mas retângulos podem ser desenhados em qualquer imagem. Podemos escrever um programa que nos permite selecionar a parte desejada em uma imagem e extrair essa parte selecionada também. A tarefa inclui as seguintes coisas -
- desenhe forma em qualquer imagem
- selecione novamente a porção de extração para o caso de má seleção
- extrair um objeto específico da imagem
import
cv2
import
argparse
ref_point
=
[]
crop
=
False
def
shape_selection(event, x, y, flags, param):
global
ref_point, crop
if
event
=
=
cv2.EVENT_LBUTTONDOWN:
ref_point
=
[(x, y)]
elif
event
=
=
cv2.EVENT_LBUTTONUP:
ref_point.append((x, y))
cv2.rectangle(image, ref_point[
0
], ref_point[
1
], (
0
,
255
,
0
),
2
)
cv2.imshow(
"image"
, image)
ap
=
argparse.ArgumentParser()
ap.add_argument(
"-i"
,
"--image"
, required
=
True
,
help
=
"Path to the image"
)
args
=
vars
(ap.parse_args())
image
=
cv2.imread(args[
"image"
])
clone
=
image.copy()
cv2.namedWindow(
"image"
)
cv2.setMouseCallback(
"image"
, shape_selection)
while
True
:
cv2.imshow(
"image"
, image)
key
=
cv2.waitKey(
1
) &
0xFF
if
key
=
=
ord
(
"r"
):
image
=
clone.copy()
elif
key
=
=
ord
(
"c"
):
break
if
len
(ref_point)
=
=
2
:
crop_img
=
clone[ref_point[
0
][
1
]:ref_point[
1
][
1
], ref_point[
0
][
0
]:
ref_point[
1
][
0
]]
cv2.imshow(
"crop_img"
, crop_img)
cv2.waitKey(
0
)
cv2.destroyAllWindows()
Executar : Salve o arquivo como capture_events.py e, para teste, selecione uma imagem de demonstração que está localizada no mesmo diretório. Agora, execute o seguinte comando -
python capture_events.py --image demo.jpg
Saída : Primeiro selecione a parte desejada da imagem. Além disso, podemos remover a seleção incorreta pressionando 'r' conforme programado para fazer uma nova seleção adequada.
Fig: Porção Selecionada
Agora, depois de selecionar uma seleção adequada como acima, basta pressionar 'c' para extrair, conforme programado.
Fig: Porção Cortada
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva