A detecção de objetos é muito importante na visão computacional, várias pesquisas e metódos são criados todos os anos com novas melhorias e aperfeiçoamento de algoritmos já existentes.
Uma das técnicas mais utilizadas é descrita em “
Rapid Object Detection using a Boosted Cascade of Simple Features” de 2001 prosposto por Paul Viola e Michael Jones, o algoritmo tem como entrada várias imagens positivas (imagens que possuem o objeto a ser detectado) e negativas (imagens que não possuem o objeto) e em seguida é aplicado aprendizado de máquina para gerar um cascade classifier, ou seja, um arquivo com todas as características extraídas daquele objeto. O próximo passo é utiliza-lo para reconhecer o objeto em outras imagens.
Neste tutorial faremos a detecção de rostos em uma imagem utilizando este classificador, para mais detalhes de como o treinamento é realizado veja em:
face detection using haar cascade.
Caso deseje criar o seu próprio classificador para outros objetos como carro, mesa e bola saiba como em:
cascade classifier train.
Detecção de rostos com OpenCv
Para nossa sorte o OpenCv já possui vários classificadores pré-treinados para detecção de faces, olhos, e sorrisos. Você pode encontra-los na pasta data/haarcascades, exporte-os para a pasta de seu projeto. Como linguagem de programação utilizaremos python pela rapidez e simplicidade do código. Nosso primeiro passo será carregar os classificadores tanto para faces frontais quanto para faces em perfil.
Based on: OpenCv faceDetection Tutorial |
"""
#carrega os classificadores |
frontal_face_cascade = cv2.CascadeClassifier('cascade/haarcascade_frontalface_default.xml') |
profile_face_cascade
= cv2.
CascadeClassifier(
'cascade/haarcascade_profileface.xml')
Em seguida, carregaremos a imagem em que desejamos encontrar os rostos e a converteremos para escala de cinza para facilitar o processo de detecção, pois não teremos tantas variedades de cores para se preocupar:
img = cv2.imread('img/family.jpeg') |
#converte para escala de cinza |
gray
= cv2
.cvtColor(img, cv2.
COLOR_BGR2GRAY)
Neste momento faremos a detecção em si, com a ajuda dos nossos classificadores acima:
#encontre os rostos na imagem |
faces = frontal_face_cascade.detectMultiScale(gray, 1.3, 5) |
#se nao encontrou faces frontais, procure por faces em perfil |
faces
= profile_face_cascade.
detectMultiScale(gray,
1.3,
5)
Caso tenhamos obtido resultados, desenhamos um retangulo verde em cada rosto, o padrão do opencv é utilizar o formato de cores (B(blue),G(green),R(red)), note que o retangulo está sendo desenhado em cima da imagem original:
#se encontrou, desenhe um retangulo verde em cada rosto |
for(x, y, w, h) in faces: |
cv2.
rectangle(img, (x,y), (x
+w, y
+h), (
0,
255,
0),
2)
Por fim exibiremos o resultado obtido com a função imshow:
cv2.imshow('family', img) |
cv2.imwrite('img/familydetection.png', img) |
if cv2.waitKey(0) == 'q': |
cv2.
destroyAllWindows()
A seguir temos o resultado obtido para a imagem family.jpeg:
Caso o resultado não seja satisfatória para a sua imagem, é possível alterar os parâmetros passados para a função detectMultiScale, e ir brincando com os valores para chegar a precisão desejada. |
0 comentários:
Postar um comentário