Começamos aprendendo noções básicas de OpenCV e, em seguida, fizemos alguns processamentos básicos de imagem e manipulações em imagens seguidas por Segmentações de imagens e muitas outras operações usando OpenCV e linguagem python. Aqui, nesta seção, realizaremos algumas técnicas simples de detecção de objetos usando a correspondência de modelos. Encontraremos um objeto em uma imagem e então descreveremos suas características. Características são os atributos comuns da imagem, como cantos, bordas, etc. Também daremos uma olhada em alguns algoritmos de detecção de objetos comuns e populares, como SIFT, SURF, FAST, BREIF e ORB.
Como dito nos tutoriais anteriores, OpenCV é Open Source Commuter Vision Library que tem interfaces C ++, Python e Java e oferece suporte a Windows, Linux, Mac OS, iOS e Android. Portanto, ele pode ser facilmente instalado no Raspberry Pi com ambiente Python e Linux. E o Raspberry Pi com OpenCV e câmera conectada pode ser usado para criar muitos aplicativos de processamento de imagem em tempo real, como detecção de rosto, bloqueio de rosto, rastreamento de objeto, detecção de placa de carro, sistema de segurança residencial etc.
A detecção e o reconhecimento de objetos formam o caso de uso mais importante para a visão computacional, eles são usados para fazer coisas poderosas, como
- Rotulando cenas
- Robot Navigation
- Carros autônomos
- Reconhecimento corporal (Microsoft Kinect)
- Detecção de doença e câncer
- Reconhecimento facial
- Reconhecimento de caligrafia
- Identificação de objetos em imagens de satélite
Detecção de Objeto VS Reconhecimento
O reconhecimento de objeto é o segundo nível de detecção de objeto no qual o computador é capaz de reconhecer um objeto de vários objetos em uma imagem e pode ser capaz de identificá-lo.
Agora, vamos realizar algumas funções de processamento de imagem para encontrar um objeto de uma imagem.
Encontrar um objeto a partir de uma imagem
Aqui, usaremos a correspondência de modelos para encontrar caractere / objeto em uma imagem, use a função cv2.matchTemplate () do OpenCV para encontrar esse objeto
import cv2 import numpy as np
Carregue a imagem de entrada e converta-a em cinza
image = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('pessoas', imagem) cv2.waitKey (0) grey = cv2.cvtColor (imagem, cv2.COLOR_BGR2GRAY)
Carregue a imagem do modelo
template = cv2.imread ('waldo.jpg', 0) #result of template matching of object over an image result = cv2.matchTemplate (grey, template, cv2.TM_CCOEFF) sin_val, max_val, min_loc, max_loc = cv2.minMaxLoc (resultado)
Criar caixa delimitadora
top_left = max_loc #aumentando o tamanho do retângulo delimitador em 50 pixels bottom_right = (top_left + 50, top_left + 50) cv2.rectangle (image, top_left, bottom_right, (0,255,0), 5) cv2.imshow ('objeto encontrado', imagem) cv2.waitKey (0) cv2.destroyAllWindows ()
Em cv2.matchTemplate (cinza, modelo, cv2.TM_CCOEFF) , insira a imagem em escala de cinza para encontrar o objeto e o modelo. Em seguida, aplique o método de correspondência de modelo para encontrar os objetos da imagem, aqui cv2.TM_CCOEFF é usado.
A função inteira retorna uma matriz que é inserida no resultado, que é o resultado do procedimento de correspondência do modelo.
E então usamos cv2.minMaxLoc (result) , que fornece as coordenadas ou a caixa delimitadora onde o objeto foi encontrado em uma imagem, e quando obtemos essas coordenadas desenhamos um retângulo sobre ele e esticamos algumas dimensões da caixa para que o objeto pode caber facilmente dentro do retângulo.
Existem vários métodos para realizar a correspondência de modelos e, neste caso, estamos usando cv2.TM_CCOEFF, que significa coeficiente de correlação.
Aqui, os pontos-chave são coordenadas (X, Y) extraídas usando o detector de peneiramento e desenhadas sobre a imagem usando a função cv2 draw keypoint.
SURF
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Crie o objeto SURF Feature Detector, aqui nós definimos o limite de hessian para 500
surf = cv2.xfeatures2d.SURF_create (500) pontos-chave, descritores = surf.detectAndCompute (cinza, Nenhum) print ("Número de pontos-chave detectados:", len (pontos-chave))
Desenhe importantes pontos-chave na imagem de entrada
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - SURF', image) cv2.waitKey () cv2.destroyAllWindows ()
Saída do console:
VELOZES
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Criar objeto FAST Detector
fast = cv2.FastFeatureDetector_create () # Obtenha pontos-chave, por padrão a supressão não máxima é Ativada # para desligar set fast.setBool ('nonmaxSuppression', False) keypoints = fast.detect (cinza, Nenhum) print ("Número de pontos-chave Detectado: ", len (pontos-chave))
Desenhe importantes pontos-chave na imagem de entrada
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - FAST', image) cv2.waitKey () cv2.destroyAllWindows ()
Saída do console:
BREVE
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Criar objeto detector FAST
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
Criar objeto extrator BRIEF
#brief = cv2.DescriptorExtractor_create ("BRIEF") # Determine pontos-chave pontos- chave = fast.detect (cinza, nenhum)
Obtenha descritores e novos pontos-chave finais usando BRIEF
pontos-chave, descritores = brief.compute (cinza, pontos-chave) print ("Número de pontos-chave detectados:", len (pontos-chave))
Desenhe importantes pontos-chave na imagem de entrada
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - BRIEF', image) cv2.waitKey () cv2.destroyAllWindows ()
Saída do console:
ESFERA
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Criar objeto ORB, podemos especificar o número de pontos-chave que desejamos
orb = cv2.ORB_create () # Determine pontos-chave pontos- chave = orb.detect (cinza, nenhum)
Obtenha os descritores
pontos-chave, descritores = orb.compute (cinza, pontos-chave) print ("Número de pontos-chave detectados:", len (pontos-chave))
Desenhe importantes pontos-chave na imagem de entrada
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - ORB', image) cv2.waitKey () cv2.destroyAllWindows ()
Saída do console:
Podemos especificar o número de pontos-chave que tem um limite máximo de 5000, no entanto, o valor padrão é 500, ou seja, o ORB detectaria automaticamente os 500 melhores pontos-chave se não fosse especificado para qualquer valor de pontos-chave.
Então é assim que a detecção de objetos ocorre no OpenCV, os mesmos programas também podem ser executados no Raspberry Pi instalado no OpenCV e podem ser usados como um dispositivo portátil, como smartphones com Google Lens.
Este artigo é referido a partir do curso Master Computer Vision ™ OpenCV4 em Python com Deep Learning na Udemy, criado por Rajeev Ratan, inscreva-se para aprender mais sobre Visão Computacional e Python.