Manual

do

Maker

.

com

Face detection com OpenCV

Face detection com OpenCV

Algumas pessoas me perguntaram porque o número de posts diminuiu, apesar de ter vários patrocinadores. Bem, material não falta para escrever artigos, mas de fato estou trabalhando intensamente em um projeto que envolve muita, mas muita visão computacional e ao término incluirá inteligência artificial. Isso tem me tomado em média 15 horas por dias e para justificar isso, escrevo hoje esse primeiro artigo introdutório ao OpenCV. Não que eu já saiba alguma coisa, mas como estou iniciando, é mais fácil repassar com simplicidade como introduzir-se nesse mundo, seja em x86, ARM, MIPS etc.

Visão Computacional

Visão computacional é a ciência das máquinas que enxergam. Isso não é exatamente como um olho, porque o olho apenas recebe a imagem e o cérebro processa, depois toma (ou não) uma ação. A visão computacional comporta o funcionamento do olho e a função cerebral de identificação ou reconhecimento. Isso será explicado mais adiante.

A visão computacional é empregada na área medicinal, em jogos, em drones, câmeras de segurança e muito mais. Apesar de não ser um processamento trivial, ela tem sido intensamente utilizada em sistemas embarcados (como nas próprias câmeras de monitoramento) e o Raspberry Pi é um excelente ponto de início para você que é da Internet das coisas.

Eu utilizarei ela intensamente no Onion Omega, uma board MIPS espetacular com um conceito de empilhamento interessantíssimo. Já escrevi a respeito dessa belezinha aqui, aqui e aqui.

Já a segunda versão dessa adorável board está no kickstarter foi lançada e buscando na caixa de pesquisa rápida aí em cima, você encontrará montes de artigos relacionados.

Instalação

Não basta o OpenCV instalado e também não há apenas uma maneira de atingir um objetivo. Por conta disso, sendo eu iniciante em OpenCV, posso não dar as melhores dicas a respeito, mas conforme eu somar expertise, escrevo novos tutoriais.

x86

Se você quiser brincar com sua webcam no notebook/desktop, a primeira tarefa é instalar um Linux (porque não escrevo tutoriais para Windows). Depois, instale o pacote python-opencv:

sudo apt-get install python-opencv

ARM

No Raspberry Pi, o procedimento deverá ser um pouquinho diferente:

sudo apt-get install python-pip
#depois:
pip install cv2

Em ambas as plataformas o import é o mesmo. Vou utilizar os exemplos em Python, mas a biblioteca tem o mesmo suporte em C++, inclusive as mesmas chamadas.

Abrir a origem de leitura

Você pode ler uma imagem, um video, um dispositivo de video (webcam) ou uma streaming IP. Essa informação é simples, mas importante ao meu ver, pois no primeiro momento precisei pegar streaming IP e não se encontra exemplos diretos com a mesma facilidade que leitura da webcam.

Para ler de uma imagem é bastante simples:

import cv2
image = cv2.imread("obama.jpg")

Até aqui você não fez nada além de carregar a imagem. Para video:

cap = cv2.cvCreateFileCapture("video.avi")

Para abrir webcam, você deve dizer o número do dispositivo de video desse modo:

cap = cv2.VideoCapture(0)

E para abrir uma streaming de uma câmera IP:

stream = "rtsp://usuario:senha@IP:porta/tal/tal"
cap = cv2.VideoCapture(0)
cap.open(stream)

A URL varia conforme a câmera, basta pegar isso no manual ou, se estiver utilizando uma câmera já implementada, olhe na configuração do software de gerenciamento.

Classifiers

Os classificadores são treinamentos armazenados em xml. O OpenCV já vem com alguns classifiers para você inciar a brincadeira. Como nesse artigo vamos fazer a detecção de face, recomendo que pegue esse classificador. Aliás, recomendo que faça um clone do git do OpenCV. No código completo você notará como utilizá-lo.

Você pode criar seus próprios treinamentos para OpenCV e isso mostrarei em outro artigo.

Learning machine

A máquina de aprendizado é como você faz o treinamento para que o OpenCV reaja a um evento como por exemplo, detectar uma mão. Você precisa de uma quantidade meio grande de imagens contendo mãos. Essas imagens são chamadas de "positivos". Do mesmo modo, você precisará de uma quantidade grande de imagens que não contenham o objeto alvo (a mão). Isso é chamado de "negativo". A partir daí tem uma série de procedimentos que abordarei em outro artigo.

ROI - Region Of Interest

Se você estiver apenas visualizando a imagem, aplicando histograma, convertendo pra escala de cinza etc, isso não é visão computacional, isso é manipulação de imagem. A região de interesse já é um principio à utilização de visão computacional, sendo a área que você deseja que seja observada (quando limitando a análise do OpenCV a uma área específica) ou a área encontrada (por exemplo) na detecção de face.

Código completo

Agora sem mais delongas, veja como é simples fazer um face detection com OpenCV.

from  __future__ import print_function
import numpy as np
import cv2

cap = cv2.VideoCapture(0)

face_cascade = cv2.CascadeClassifier('/home/djames/opencv/data/haarcascades/haarcascade_frontalface_default.xml')

while (cap.isOpened()):
    ret,frame = cap.read()
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5, flags=cv2.CASCADE_SCALE_IMAGE,minSize=(50, 50), maxSize=None)

    if len(faces) > 0:
        print("Pessoa detectada!")
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x - 10, y - 20), (x + w + 10, y + h + 10), (0, 255, 0), 2)
            roi_gray = frame[y-15:y + h+10, x-10:x + w+10]

        cv2.imshow("Manual do Maker", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Para sair, simplesmente aperte a letra 'q'.

O resultado poderia ser melhor, mas só tenho essa cara mesmo:

djames-300x212.webp

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.