一、环境搭配

        树莓派环境的安装,以及安装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包时候经常出现网络连接不上,我猜测是因为源在外国的原因;解决方法可以换源,最好是换成清华大学那个源网站,阿里云的也行,还可以自己从电脑下载安装包,发送给树莓派进行安装。最后最后最重要的,安装依赖一定不能出错,不然就要崩溃了,各种问题。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐