Detecção de rosto usando Python e OpenCV com webcam
OpenCV é uma biblioteca usada para realizar o processamento de imagens usando linguagens de programação como python. Este projeto utiliza a biblioteca OpenCV para fazer uma detecção de rosto em tempo real usando sua webcam como câmera principal.
A seguir estão os requisitos para isso: -
- Python 2.7
- OpenCV
- Numpy
- Classificadores faciais Haar Cascade Frontal
Abordagem / Algoritmos usados:
- Este projeto usa o Algoritmo LBPH (Local Binary Patterns Histograms) para detectar faces. Ele rotula os pixels de uma imagem limitando a vizinhança de cada pixel e considera o resultado como um número binário.
- LBPH usa 4 parâmetros:
(i) Raio: o raio é usado para construir o padrão binário local circular e representa o raio ao redor do
pixel central.
(ii) Vizinhos: o número de pontos de amostra para construir o padrão binário local circular.
(iii) Grade X: o número de células na direção horizontal.
(iv) Grade Y: o número de células na direção vertical. - O modelo construído é treinado com as faces com tag que lhes é fornecida e, posteriormente, a máquina recebe um dado de teste e a máquina decide o rótulo correto para ele.
Como usar :
- Crie um diretório em seu pc e nomeie-o (por exemplo, projeto)
- Crie dois arquivos Python chamados create_data.py e face_recognize.py, copie o primeiro código-fonte e o segundo código-fonte nele, respectivamente.
- Copie haarcascade_frontalface_default.xml para o diretório do projeto, você pode obtê-lo em opencv ou
daqui . - Agora você está pronto para executar os seguintes códigos.
import
cv2, sys, numpy, os
haar_file
=
'haarcascade_frontalface_default.xml'
datasets
=
'datasets'
sub_data
=
'vivek'
path
=
os.path.join(datasets, sub_data)
if
not
os.path.isdir(path):
os.mkdir(path)
(width, height)
=
(
130
,
100
)
face_cascade
=
cv2.CascadeClassifier(haar_file)
webcam
=
cv2.VideoCapture(
0
)
count
=
1
while
count <
30
:
(_, im)
=
webcam.read()
gray
=
cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
faces
=
face_cascade.detectMultiScale(gray,
1.3
,
4
)
for
(x, y, w, h)
in
faces:
cv2.rectangle(im, (x, y), (x
+
w, y
+
h), (
255
,
0
,
0
),
2
)
face
=
gray[y:y
+
h, x:x
+
w]
face_resize
=
cv2.resize(face, (width, height))
cv2.imwrite(
'% s/% s.png'
%
(path, count), face_resize)
count
+
=
1
cv2.imshow(
'OpenCV'
, im)
key
=
cv2.waitKey(
10
)
if
key
=
=
27
:
break
O seguinte código deve ser executado após o modelo ter sido treinado para os rostos:
import
cv2, sys, numpy, os
size
=
4
haar_file
=
'haarcascade_frontalface_default.xml'
datasets
=
'datasets'
(
'Recognizing Face Please Be in sufficient Lights...'
)
(images, lables, names,
id
)
=
([], [], {},
0
)
for
(subdirs, dirs, files)
in
os.walk(datasets):
for
subdir
in
dirs:
names[
id
]
=
subdir
subjectpath
=
os.path.join(datasets, subdir)
for
filename
in
os.listdir(subjectpath):
path
=
subjectpath
+
'/'
+
filename
lable
=
id
images.append(cv2.imread(path,
0
))
lables.append(
int
(lable))
id
+
=
1
(width, height)
=
(
130
,
100
)
(images, lables)
=
[numpy.array(lis)
for
lis
in
[images, lables]]
model
=
cv2.face.LBPHFaceRecognizer_create()
model.train(images, lables)
face_cascade
=
cv2.CascadeClassifier(haar_file)
webcam
=
cv2.VideoCapture(
0
)
while
True
:
(_, im)
=
webcam.read()
gray
=
cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
faces
=
face_cascade.detectMultiScale(gray,
1.3
,
5
)
for
(x, y, w, h)
in
faces:
cv2.rectangle(im, (x, y), (x
+
w, y
+
h), (
255
,
0
,
0
),
2
)
face
=
gray[y:y
+
h, x:x
+
w]
face_resize
=
cv2.resize(face, (width, height))
prediction
=
model.predict(face_resize)
cv2.rectangle(im, (x, y), (x
+
w, y
+
h), (
0
,
255
,
0
),
3
)
if
prediction[
1
]<
500
:
cv2.putText(im,
'% s - %.0f'
%
(names[prediction[
0
]], prediction[
1
]), (x
-
10
, y
-
10
),
cv2.FONT_HERSHEY_PLAIN,
1
, (
0
,
255
,
0
))
else
:
cv2.putText(im,
'not recognized'
,
(x
-
10
, y
-
10
), cv2.FONT_HERSHEY_PLAIN,
1
, (
0
,
255
,
0
))
cv2.imshow(
'OpenCV'
, im)
key
=
cv2.waitKey(
10
)
if
key
=
=
27
:
break
Nota: os programas acima não funcionarão no IDE online.
Capturas de tela do programa
Pode parecer algo diferente porque eu integrei o programa acima no framework flask
A execução do segundo programa produz resultados semelhantes aos da imagem abaixo:
Armazenamento de conjuntos de dados:
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva