Bootstrap

(可拷贝直接复现)入门学习 树莓派4B 基于python OpenCV 人脸识别例程【装机之后】

目录

一、前言

二、详细步骤讲解

        1、导入必要的库

        2、加载提供的级联分类器文件

         3、人脸识别详解

三、运行结果

四、完整代码贴出

        1、图片人脸识别

         2、视频人脸识别

五、完整工程贴出 


一、前言

        ①本篇将给出图片和视频的例程,所以无摄像头也可复现学习

        ②树莓派需先预装好opencv以及numpy,安装步骤有许多教程可供参考,本文不再赘述 

        ③博主使用的系统为64位树莓派系统、python版本为3.11.2、opencv版本为4.6.0、numpy的

版本为1.24.2

        ④完整代码在文末贴出,以供学习

        ⑤完整工程在文末贴出,可使用U盘拷贝置树莓派直接运行学习

二、详细步骤讲解

        1、导入必要的库:numpy用于数值计算,cv2用于计算机视觉操作

import numpy as np
import cv2

        2、加载已训练好的开源的级联分类器文件,加载图片或视频流

#加载级联分类器文件
face_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_eye.xml')

#图片读取及大小处理
image = cv2.imread('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/lc.jpg', 33)
img = cv2.resize(image, (800, 800))    #将加载的图像调整为800x800的尺寸

注意:

分类级联器也放在文末

若要复现项目需修改分类级联器和图片的文件路径,路径必须为绝对路径,否则会报错

         3、人脸识别详解

while 1:
    
    # 将图像从BGR色彩空间转换为灰度图像,以便更容易进行人脸检测。
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 使用人脸检测分类器在灰度图像中检测人脸。参数1.3为缩放系数,5为最小邻居数(越高越严格)。
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    # 对检测到的每张人脸的坐标(x, y, w, h)进行遍历。
    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]
        # 打印人脸矩形框中心的坐标。
        print (int(x+w/2), int(y+h/2))
        # 在人脸区域的灰度图像中检测眼睛。
        eyes = eye_cascade.detectMultiScale(roi_gray)
        # 对每个检测到的眼睛的坐标(ex, ey, ew, eh)进行遍历。
        for (ex,ey,ew,eh) in eyes:
            # 在原始彩色图像的人脸区域内,在检测到的每只眼睛周围绘制一个绿色矩形框。
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

    # cv2.imshow('img',img)显示处理后的图像,窗口名称为img。
    cv2.imshow('img',img)
    
    # 按下q键,退出循环并结束程序。
    key=cv2.waitKey(1)
    if key&0XFF==ord('q'):
        break

cv2.destroyAllWindows()

三、运行结果

        感谢舍友提供图片素材!由运行结果可以看出人脸检测非常成功,但是没有识别出人眼,原因如下:

        被识别图像需要较为稍微标准一些的人脸 ,或可以适当降低一些识别的严格系数

四、完整代码贴出

        1、图片人脸识别

import numpy as np
import cv2

#加载级联分类器文件
face_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_eye.xml')

#图片读取及大小处理
image = cv2.imread('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/lc.jpg', 33)
img = cv2.resize(image, (800, 800))    #将加载的图像调整为800x800的尺寸

while 1:
    
    # 将图像从BGR色彩空间转换为灰度图像,以便更容易进行人脸检测。
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 使用人脸检测分类器在灰度图像中检测人脸。参数1.3为缩放系数,5为最小邻居数(越高越严格)。
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    # 对检测到的每张人脸的坐标(x, y, w, h)进行遍历。
    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]
        # 打印人脸矩形框中心的坐标。
        print (int(x+w/2), int(y+h/2))
        # 在人脸区域的灰度图像中检测眼睛。
        eyes = eye_cascade.detectMultiScale(roi_gray)
        # 对每个检测到的眼睛的坐标(ex, ey, ew, eh)进行遍历。
        for (ex,ey,ew,eh) in eyes:
            # 在原始彩色图像的人脸区域内,在检测到的每只眼睛周围绘制一个绿色矩形框。
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

    # cv2.imshow('img',img)显示处理后的图像,窗口名称为img。
    cv2.imshow('img',img)
    
    # 按下q键,退出循环并结束程序。
    key=cv2.waitKey(1)
    if key&0XFF==ord('q'):
        break

cv2.destroyAllWindows()

         2、视频人脸识别

import numpy as np
import cv2


#加载级联分类器文件
face_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_eye.xml')

cap = cv2.VideoCapture(0)

while 1:
    ret, img = cap.read()
    img = cv2.flip(img,1)    # 摄像头传入的图片是水平相反的,所以要镜像对称一次
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.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)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
        print (int(x+w/2), int(y+h/2))
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

    cv2.imshow('img',img)

    # 按下q键,退出循环并结束程序。
    key=cv2.waitKey(1)
    if key&0XFF==ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

五、完整工程贴出 

入门学习树莓派4B基于pythonOpenCV人脸识别例程(含图片识别方法和视频识别方法)资源-CSDN文库

;