OpenCV é uma enorme biblioteca de código aberto para visão computacional, machine learning e processamento de imagens. OpenCV suporta uma grande variedade de linguagens de programação como Python, C ++, Java, etc. Ele pode processar imagens e vídeos para identificar objetos, rostos ou até mesmo a escrita de um humano. Neste artigo, tentaremos desenhar imagens com a ajuda do mouse. Antes de aprender a desenhar em imagens usando um mouse, precisamos entender o que é um retorno de chamada. <

Ligue de volta

Um retorno de chamada em programação significa chamar esta função (o retorno de chamada) quando um processo é concluído. O mesmo se aplica à programação orientada a eventos em geral. Quando um botão do mouse é clicado (um evento), chame uma função. Não sabemos quando o botão será clicado. Tudo o que podemos fazer é dizer ao botão “me ligue de volta” ou chamar esta função quando o botão do mouse for clicado.

Retornos de chamada do mouse

Um retorno de chamada pode ocorrer quando um usuário executa uma operação usando o mouse; esta operação é geralmente conhecida como um evento. Apenas um retorno de chamada está presente para um mouse, que é setMouseCallback() , todas as operações do mouse chamarão apenas esta função.

Podemos ter blocos condicionais para executar algo com base no evento / operação realizada com o mouse. Os eventos / operações do mouse podem ser:

  • EVENT_MOUSEMOVE
  • EVENT_LBUTTONDOWN
  • EVENT_RBUTTONDOWN
  • EVENT_LBUTTONUP
  • EVENT_RBUTTONUP

Quando deve ocorrer esse retorno de chamada:

Queremos ter essa chamada de volta apenas quando usarmos o mouse na janela pop-up, que tem o título “Título da janela pop-up ”.



cv2.namedWindow ("Título da janela pop-up")

Exemplo 1: desenhe um círculo ao clicar com o botão esquerdo em um pop-up com OpenCV:

import cv2 
  
  
img = cv2.imread("flower.jpg") 
  
def draw_circle(event, x, y, flags, param): 
      
    if event == cv2.EVENT_LBUTTONDOWN: 
        print("hello") 
        cv2.circle(img, (x, y), 100, (0, 255, 0), -1) 
          
cv2.namedWindow(winname = "Title of Popup Window") 
cv2.setMouseCallback("Title of Popup Window", draw_circle) 
  
while True: 
    cv2.imshow("Title of Popup Window", img) 
      
    if cv2.waitKey(10) & 0xFF == 27: 
        break
          
cv2.destroyAllWindows() 

Resultado:

O que (cv2.waitKey (10) & 0xFF == 27) faz?

cv2.waitKey() retorna um valor inteiro de 32 bits (pode ser dependente da plataforma). A entrada principal está em ASCII, que é um valor inteiro de 8 bits. Portanto, você só se preocupa com esses 8 bits e deseja que todos os outros bits sejam 0. Isso você pode conseguir com:cv2.waitKey(10) & 0xFF == 27