
树莓派人脸识别
本人踩过的坑:python版本过高,最开始尝试是把python更新到最高版本,结果发现各种问题各种依赖都不行;解决方法重新安装树莓派低版本系统。还在在更新OpenCV和OpenCV--contrib-python包时候经常出现网络连接不上,我猜测是因为源在外国的原因;解决方法可以换源,最好是换成清华大学那个源网站,阿里云的也行,还可以自己从电脑下载安装包,发送给树莓派进行安装。最后最后最重要的,安
一、环境搭配
树莓派环境的安装,以及安装OpenCV和OpenCV扩展包,在论坛有详细资料,这里就不细说了。
我这里的树莓派是3b
python环境如下
OpenCV的版本如下
最后的最后,记得安装OpenCV的扩展包opencv-contrib-python,这里可以参考论坛里面的文章。
树莓派安装opencv及其扩展包python3-opencv-contrib参考CSDN博客: https://blog.csdn.net/qq_39125451/article/details/116172832?
二、树莓派摄像头人脸检测
在做人脸识别这一项目摄像头必不可少,摄像头淘宝就可以找到;还要做摄像头测试,摄像头测试太简单就不详细说明。直接展示代码以及效果。
import numpy as np
import cv2
faceCascade = cv2.CascadeClassifier('Cascades/haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
while True:
ret, img = cap.read()
img = cv2.flip(img, -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=5,
minSize=(20, 20)
)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
cv2.imshow('video',img)
k = cv2.waitKey(30) & 0xff
if k == 27: # press 'ESC' to quit
break
cap.release()
cv2.destroyAllWindows()
在你写完这些代码用自带的thonny运行是不是以为这一步骤大功告成,那你大错特错了,你还要从GitHub上下载一个名为“haarcascade_frontalface_default.xml”模型,放在项目文件里。链接如下: https://github.com/opencv/opencv/tree/master/data/haarcascades
(这个链接还包括眼睛鼻子等等的训练模型)
效果图如下:
注意:这里的测试摄像头代码应该与你的项目文件放在同一个文件!不然会报告路径错误。这里还有识别人脸功能,下图所示:
三、树莓派数据采集
从多个用户中捕获多个人脸并将其存储在数据库(数据集目录)中,人脸将存储在目录:dataset/(如果不存在,请创建它),每个人脸将有一个唯一的数字ID,如1、2、3等。代码如下:
import cv2
import os
cam = cv2.VideoCapture(0)
cam.set(3, 640) # 视频的宽
cam.set(4, 480) # 视频的长
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 对于每个人,输入一个数字面部 ID
face_id = input('\n enter user id end press <return> ==> ')
print("\n [INFO] Initializing face capture. Look the camera and wait ...")
# 初始化个体采样面数
count = 0
while(True):
ret, img = cam.read()
img = cv2.flip(img, -1) # 垂直翻转视频图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
count += 1
# 将捕获的图像保存到datasets文件夹中
cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])
cv2.imshow('image', img)
k = cv2.waitKey(100) & 0xff # 按esc退出视频
if k == 27:
break
elif count >= 30: # 采集 30 个面部样本并停止视频
break
# 做清理
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()
效果如下:
会在dataset这个文件夹里生成30张图片保存,作为一个数据图片。每张图片都会变成人脸识别部分,这里就不展示图片了。
四、树莓派模型训练
必须从数据集中获取所有用户数据并“训练”OpenCV 识别器。这是由特定的 OpenCV 函数直接完成的。结果将是一个 .yml 文件,该文件将保存在“trainer/”目录中。注意确认你的 Rpi 上是否安装了 PIL 库。如果没有:pip install pillow
模型训练成果如下:
会在trainer文件中以yml文件保存。
五、人脸识别
在这里,我们将在相机上捕捉到一张新面孔,如果这个人的面部之前被捕捉并训练过,我们的识别器将做出“预测”,返回其 ID 和索引,显示识别器对这次匹配的信心程度。
代码如下:
import cv2
import numpy as np
import os
# 加载训练好的 LBPH 人脸识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
# 加载人脸检测器
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
# 定义字体
font = cv2.FONT_HERSHEY_SIMPLEX
# 初始化 ID 计数器
id = 0
# ID 对应的名字,例如:Marcelo 的 ID 为 1,对应的 names 列表中的第一个元素,以此类推。
names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']
# 初始化并启动实时视频采集
cam = cv2.VideoCapture(0)
cam.set(3, 640) # 设置视频宽度
cam.set(4, 480) # 设置视频高度
# 定义最小窗口大小以被识别为人脸
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
while True:
ret, img =cam.read()
# 垂直翻转视频图像
img = cv2.flip(img, -1)
img = cv2.flip(img, -1)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 使用人脸检测器检测人脸
faces = faceCascade.detectMultiScale(
gray,
scaleFactor = 1.2,
minNeighbors = 5,
minSize = (int(minW), int(minH)),
)
for(x,y,w,h) in faces:
# 在图像上绘制矩形,标记出人脸位置
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
# 对每个人脸进行识别
id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
# 如果置信度小于100,则认为识别成功
if (confidence < 100):
id = names[id] # 获取 ID 对应的名字
confidence = " {0}%".format(round(100 - confidence))
else:
id = "unknown"
confidence = " {0}%".format(round(100 - confidence))
# 在图像上显示出识别结果
cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)
cv2.imshow('camera',img)
# 按下 ESC 键退出程序
k = cv2.waitKey(10) & 0xff
if k == 27:
break
# 清理资源
print("\n [INFO] 退出程序并清理资源")
cam.release()
cv2.destroyAllWindows()
(这里本人实际效果已经完成,本人不好意思出境就没展示自己真正完成的图片效果)效果如下:
六、总结
本人踩过的坑:python版本过高,最开始尝试是把python更新到最高版本,结果发现各种问题各种依赖都不行;解决方法重新安装树莓派低版本系统。还在在更新OpenCV和OpenCV--contrib-python包时候经常出现网络连接不上,我猜测是因为源在外国的原因;解决方法可以换源,最好是换成清华大学那个源网站,阿里云的也行,还可以自己从电脑下载安装包,发送给树莓派进行安装。最后最后最重要的,安装依赖一定不能出错,不然就要崩溃了,各种问题。
更多推荐
所有评论(0)