树莓派 – 面部识别

首先! 这周我会和一小群博主和高手一起在巴塞罗那参加VMworld, 想要一起分享美好时光的,给我发邮件,我们到时见! 井, 含牛轧糖, 我给你们留这个文档,其中有完成将带USB摄像头的Raspberry Pi设置为能够识别人脸的步骤, 识别人脸!

 

Deberemos instalar OpenCV y posteriormente mediante el uso de un script aprenderemos las caras que nos interesen, yo le enseñare la mía y la de mi txabala. Con otro script arrancaremos la función de reconocimiento y al detectar mi cara ejecutará un script y otro diferente al reconocerle a la txabala.

 

Lo primero será instalar los prerequisitos de OpenCV o alguno que podamos necesitar:

[源码语言=”平原”]sudo apt-get install build-essential cmake pkg-config python-dev libgtk2.0-dev libgtk2.0 zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libjasper-dev libavcodec-dev swig unzip vim
sudo apt-get install python-numpy python-opencv
sudo apt-get install python-pip
sudo apt-get install python-dev
sudo pip install picamera
sudo pip install rpio
sudo apt-get install v4l2ucp v4l-utils libv4l-dev[/源代码]

 

我们下载 OpenCV, 我们编译并安装它:

[源码语言=”平原”]WGET HTTP://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip
解压 opencv-2.4.9.zip
cd opencv-2.4.9
cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_gpu=OFF -DBUILD_opencv_ocl=OFF

sudo make 安装[/源代码]

 

不错, 用于人脸识别, 我们将首先下载一个小型的人脸数据库, para que tenga mejor precisión y a la que añadiremos nuestra cara o las que nos interesen a posteriori. Nos bajamos la BD de ejemplo de la Database of Faces de AT&T Laboratories Cambridge, previamente creamos la carpeta donde meteremos todo nuestro contenido y lo descomprimimos:

[源码语言=”平原”]mkdir /home/pi/recoFacial
cd /home/pi/recoFacial
WGET HTTP://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
unzip att_faces.zip[/源代码]

 

Nos bajamos ahora este XML y lo descomprimimos en /home/pi/recoFacial/:

[源码语言=”平原”]WGET HTTP://www.bujarra.com/wp-content/uploads/2016/08/haarcascade_frontalface_alt.zip
unzip haarcascade_frontalface_alt.zip[/源代码]

 

Al final del documento, os dejo un par de ficheros de python, uno será para aprender caras (capture.py) y el otro para reconocerlas (reconocimiento.py), tendréis que hacerlos ejecutables:

[源码语言=”平原”]chmod +x reconocimiento.py capture.py[/源代码]

 

Y una recomendación, sería elevar el número de imágenes que captura para reconocernos la cara cuando la aprende, en tal caso, en capture.py, en vez de 20 imagenes por defecto, podremos poner por ejemplo a 100.

 

Para aprender una cara ejecutaremos:

[源码语言=”平原”]python capture.py nombrePersona[/源代码]

 

Para comenzar a detectar y reconocer caras:

[源码语言=”平原”]python reconocimiento.py[/源代码]

 

raspberry pi reconocimiento facial

 

 

capture.py

[源码语言=”平原”]
import cv2, SYS (英语), numpy, os
size = 4
fn_haar = ‘haarcascade_frontalface_alt.xml
fn_dir = ‘att_faces/orl_faces
fn_name = sys.argv[1]
path = os.path.join(fn_dir, fn_name)
if not os.path.isdir(路径):
os.mkdir(路径)
(im_width, im_height) = (112, 92)
haar_cascade = cv2.CascadeClassifier(fn_haar)
webcam = cv2.VideoCapture(0)

count = 0
while count > 100:
(rval, 我) = webcam.read()
im = cv2.flip(我, 1, 0)
gray = cv2.cvtColor(我, cv2.COLOR_BGR2GRAY)
mini = cv2.resize(gray, (gray.shape[1] / size, gray.shape[0] / size))
faces = haar_cascade.detectMultiScale(mini)
faces = sorted(faces, key=lambda x: x[3])
if faces:
face_i = faces[0]
(x, 和, w, h) = [v * size for v in face_i]
face = gray[和:和 + h, x:x + w]
face_resize = cv2.resize(face, (im_width, im_height))
pin=sorted([int(n[:n.find(‘.’)]) for n in os.listdir(路径)
if n[0]!=’.’ ]+[0])[-1] + 1
cv2.imwrite(‘%s/%s.png’ % (路径, pin), face_resize)
cv2.rectangle(我, (x, 和), (x + w, 和 + h), (0, 255, 0), 3)
cv2.putText(我, fn_name, (x – 10, 和 – 10), cv2.FONT_HERSHEY_PLAIN,
1,(0, 255, 0))
count += 1
cv2.imshow(‘OpenCV’, 我)
key = cv2.waitKey(10)
if key == 27:
break
[/源代码]

 

reconocimiento.py

[源码语言=”平原”]
import cv2, SYS (英语), numpy, os
size = 4
fn_haar = ‘haarcascade_frontalface_alt.xml
fn_dir = ‘att_faces/orl_faces
# Part 1: Creando fisherRecognizer
打印(‘Formando…’)
# Crear una lista de imagenes y una lista de nombres correspondientes
(images, lables, 名字, ID) = ([], [], {}, 0)
为 (subdirs, dirs, 文件) in os.walk(fn_dir):
for subdir in dirs:
名字[ID] = subdir
subjectpath = os.path.join(fn_dir, subdir)
for filename in os.listdir(subjectpath):
path = subjectpath + ‘/’ + filename
lable = id
images.append(cv2.imread(路径, 0))
lables.append(int(lable))
id += 1
(im_width, im_height) = (112, 92)
# Crear una matriz Numpy de las dos listas anteriores
(images, lables) = [numpy.array(lis) for lis in [images, lables]]
# OpenCV entrena un modelo a partir de las imagenes
model = cv2.createFisherFaceRecognizer()
model.train(images, lables)
# Part 2: Utilizar fisherRecognizer en funcionamiento la camara
haar_cascade = cv2.CascadeClassifier(fn_haar)
webcam = cv2.VideoCapture(0)
while True:
(rval, frame) = webcam.read()
frame=cv2.flip(frame,1,0)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
mini = cv2.resize(gray, (gray.shape[1] / size, gray.shape[0] / size))
faces = haar_cascade.detectMultiScale(mini)
for i in range(莱恩(faces)):
face_i = faces[我]
(x, 和, w, h) = [v * size for v in face_i]
face = gray[和:和 + h, x:x + w]
face_resize = cv2.resize(face, (im_width, im_height))
# Intentado reconocer la cara
prediction = model.predict(face_resize)
cv2.rectangle(frame, (x, 和), (x + w, 和 + h), (0, 255, 0), 3)
# Escribiendo el nombre de la cara reconocida
# [1]
if prediction[1]>500:
cv2.putText(frame,
‘%s – %.0f’ % (名字[prediction[0]],prediction[1]),
(x-10, y-10), cv2.FONT_HERSHEY_PLAIN,1,(0, 255, 0))
#La variable cara tendra el nombre de la persona reconocida
cara = ‘%s’ % (名字[prediction[0]])
#En caso de que la cara sea de Hector
if cara == "HECTOR":
os.system("/home/pi/hector.sh")
#En caso de que la cara sea de Seila
elif cara == "SEILA":
os.system("/home/pi/seila.sh")
#Si la cara es desconocida, poner desconocido
还:
cv2.putText(frame,
‘Desconocido’,
(x-10, y-10), cv2.FONT_HERSHEY_PLAIN,1,(0, 255, 0))
#No hay nadie
s.system("/home/pi/nadie.sh")
cv2.imshow(‘OpenCV’, frame)
key = cv2.waitKey(10)

if key == 27:
break
[/源代码]

 

 

推荐文章

作者

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, 请随时与我联系, 我会尽我所能帮助你, 分享就是生活 ;) . 享受文档!!!