树莓派 – 面部识别

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

 

我们应该先安装 OpenCV,然后通过使用一个脚本来学习我们感兴趣的面孔, 我会教它识别我和我的伴侣的面孔. 通过另一个脚本启动识别功能,检测到我的面孔时执行一个脚本,识别到伴侣的面孔时执行另一个不同的脚本.

 

首先要安装 OpenCV 的前置需求或其他可能需要的依赖:

[源码语言=”平原”]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 安装[/源代码]

 

不错, 用于人脸识别, 我们将首先下载一个小型的人脸数据库, 以便有更高的精确度,并且之后我们会添加我们自己的面孔或感兴趣的面孔. 我们下载 AT Database of Faces 的示例数据库&T Laboratories Cambridge, 事先创建存放所有内容的文件夹并解压:

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

 

我们现在下载这个 XML 并将其解压到 /home/pi/recoFacial/:

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

 

在文档末尾, 我给你们留了几个 Python 文件, 一个用于学习面部 (capture.py) 另一个用于识别它们 (reconocimiento.py), 你们需要将它们设为可执行文件:

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

 

还有一个建议, 最好增加捕获的图像数量,以便在学习时识别我们的面部, 在这种情况下, 在 capture.py 中, 而不是 20 默认图像数量, 我们可以例如设置为 100.

 

要学习一个面部,运行:

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

 

要开始检测和识别面部,运行:

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

 

树莓派 人脸识别

 

 

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")
#如果面孔是Seila
elif cara == "SEILA":
os.system("/home/pi/seila.sh")
#如果面孔未知, 设为未知
还:
cv2.putText(frame,
‘未知’,
(x-10, y-10), cv2.FONT_HERSHEY_PLAIN,1,(0, 255, 0))
#没有人
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, 请随时与我联系, 我会尽我所能帮助你, 分享就是生活 ;) . 享受文档!!!