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