Python的人脸识别设计史上最全的教程,手把手教(附源代码)

2024-06-08 1210阅读

首先要下载人脸识别模块,win+R后输入cmd在控制台下载

Python的人脸识别设计史上最全的教程,手把手教(附源代码)
(图片来源网络,侵删)

 

先是读取图片功能

#  导入OpenCV模块
import cv2 as cv
#  读取图片  参数:图片路径(注意:路径中不能有中文,否则图片加载失败
img = cv.imread('pictures/AI.jpeg')
#  显示图片  参数:窗口的名称,所要显示的图片
cv.imshow('AI_img', img)
#  等待键盘输入 单位毫秒  传入0  则就是无限等待
cv.waitKey(0)
#  销毁窗体,释放内存
cv.destroyAllWindows()

图片灰度转换

为什么要用图片灰度转换呢,他会将人脸转变为矩阵,不同的颜色会有1到16个数字对应他不同颜色的深浅

#  导入OpenCV模块
import cv2 as cv
#  读取图片  参数:图片路径(注意:路径中不能有中文,否则图片加载失败
img = cv.imread('pictures/AI.jpeg')
#  显示图片  参数:窗口的名称,所要显示的图片
cv.imshow('AI_img', img)
#  将图片灰度转换  参数:所要转换的图片,指定转换为灰度图
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
#  显示图片
cv.imshow('gray_AI_img', gray_img)
#  保存图片
cv.imwrite('pictures/gray_AI_img.jpeg', gray_img)
#  等待键盘输入
cv.waitKey(0)
#  销毁窗体,释放内存
cv.destroyAllWindow()

修改图片尺寸

#  导入OpenCV模块
import cv2 as cv
#  读取图片  参数:图片路径(注意:路径中不能有中文,否则图片加载失败
img = cv.imread('pictures/AI.jpeg')
#  显示图片  参数:窗口的名称,所要显示的图片
cv.imshow('AI_img', img)
print('before:', img.shape)
#  修改图片尺寸  参数:所要修改的图片,新尺寸
resize_img = cv.resize(img, dsize=(500,500))
print('after:', resize_img.shape)
#  显示修改好的尺寸图片
cv.imshow('resize_AI_img', resize_img)
#  等待键盘输入
cv.waitKey(0)
#  销毁窗体,释放内存
cv.destroyAllWindow()

绘制形状

#  导入OpenCV模块
import cv2 as cv
#  读取图片  参数:图片路径(注意:路径中不能有中文,否则图片加载失败
img = cv.imread('pictures/AI.jpeg')
#  左上角的坐标是(x,y) 矩形的宽度和高度是(w,h)
x,y,w,h = 150,150,150,150
#  绘制矩形
cv.rectangle(img, (x,y,x+w,y+h), color=(0, 255, 255), thickness= 6)
'''
#   圆中心点坐标(x,y) 与半径r
x,y,r = 300,300,150
#  绘制圆  参数:所要绘制的图片,坐标与尺寸,颜色的RGB值,线的粗度
cv.circle(img, center=(x,y), radius=r, color=(0,255,255), thickness=2)
'''
#  显示绘制后的图片
cv.imshow('new_img', img)
#  等待键盘输入
cv.waitKey(0)
#  销毁窗体,释放内存
cv.destroyAllWindow()

单个人脸识别

#  导入OpenCV模块
import cv2 as cv
#  人脸识别的函数
def face_detect_demo(img):
    #  将图片转换为灰度图片
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    #  创建级联分类器,通过该分类器检测人脸 参数:特征数据
    face_detector = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')
    #  检测人脸并返回人脸信息
    faces = face_detector.detectMultiScale(gray)
    #  遍历人脸信息获取 xX轴坐标  yY轴坐标  w宽度  h高度
    for x,y,w,h in faces:
        #  通过矩形框出图片人脸部分
        cv.rectangle(img , (x , y) , (x+w , y+h) , color=(0 , 255 , 0) , thickness=2)
    cv.imshow('result_img' , img)
#  加载图片
img = cv.imread('pictures/face1.jpeg')
#  调用人脸识别函数
face_detect_demo(img)
#  等待键盘输入
cv.waitKey(0)
#  销毁窗体,释放内存
cv.destroyAllWindow()

多个人脸识别

#  导入OpenCV模块
import cv2 as cv
#  人脸识别的函数
def face_detect_demo(img):
    #  将图片转换为灰度图片
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    #  加载特征数据
    face_detector = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')
    #  检测人脸并返回人脸信息
    faces = face_detector.detectMultiScale(gray)
    for x,y,w,h in faces:
        print(x,y,w,h)
        cv.rectangle(img, (x,y), (x+w, y+h), color = (0,255,0), thickness=2)
        #  "/"  表示浮点数出发,返回浮点结果;6/4=1.5
        #  “//” 表示整数出发,返回不大于结果的一共最大的整数:6//4=1
        cv.circle(img, center = (x+w//2, y+h//2), radius = w//2, color=(0,255,0), thickness=2)
    #  显示图片
    cv.imshow('result', img)
#  加载图片
img = cv.imread('pictures/face3.jpg')
#  调用人脸检测方法
face_detect_demo(img)
#  等待键盘输入
cv.waitKey(0)
#  销毁窗体,释放内存
cv.destroyAllWindow()

检测摄像头中的人脸

import cv2 as cv
def face_detect_demo(img):
    gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    face_detect = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')
    face = face_detect.detectMultiScale(gary)
    for x, y, w, h in face:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0,0,255), thickness=2)
    #  水平镜像翻转,cv.图片(图片,轴)  0:水平轴   1:垂直轴
    #  img = cv.flip(img, 1)
    img = cv.flip(img , 1)
    cv.imshow('result', img)
#  cv.VideoCapture(摄像头的编号, 打开摄像头的模式)
#  摄像头编号默认从0开始,每多一个摄像头,编号+1,但不绝对
#  如果你写摄像头编号为0时无法打开摄像头,可以试一下1,2,3等编号
#  打开摄像头   参数:对应优先级的摄像头,指定为打开
#  cv.CAP_DSHOW:强制打开摄像头
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
while True:
    #  获取检测到的数据(flag是否为人脸特征数据,frame人脸特征数据)
    flag,frame = cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    #  按键盘Q键退出
    if ord('q') == cv.waitKey(1):
        break
cv.destroyAllWindows()
cap.release()
#  水平镜像翻转,cv.img(图片,轴)  0:水平轴   1:垂直轴
#  img = cv.flip(img, 1)

检测视频中的人脸

import cv2 as cv
def face_detect_demo(img):
    gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    face_detect = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')
    face = face_detect.detectMultiScale(gary)
    for x, y, w, h in face:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0,0,255), thickness=2)
    cv.imshow('result', img)
cap = cv.VideoCapture('Video/video.mp4')
while True:
    #  读取视频中每一帧的画面
    #  flag为当前帧的画面是否有内容,若没有内容,则表示视频播放完毕
    #  frame为当前帧画面
    flag,frame = cap.read()
    if not flag:
        break
    #  检测当前帧画面的人脸
    face_detect_demo(frame)
    #  按键盘Q键退出
    if ord('q') == cv.waitKey(1):
        break
cap.release()
cv.destroyWindow()

训练人脸识别模型

#  导入模块
import os
import numpy as np
import cv2 as cv
#  获取实时人脸识别模型的训练集数据
def GetFaceImg_TrainData(path):
    #  定义两个容器,存放训练集的数据和结果
    #  存放训练图片数据的列表
    facesSamples = []                        #x_Train=[]
    #  存放训练图片数据对应id的列表(以图片名为id)
    ids = []                                 #y_Train=[]
    #  再定义一共容器,来存储人脸图片的路径
    imagePaths = []
    #  遍历传入的路径中的所有的文件,来获得这些文件的路径,存到容器中
    for f in os.listdir(path):
        #  根据路径跟名称,就能够拼接成文件的完整路径
        fPath = os.path.join(path, f)
        #  将文件的完整路径存储到容器中去
        imagePaths.append(fPath)
    #  创建人脸检测器(人脸检测模型)
    face_detector = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')
    #  遍历指定路径下的所有图片
    for imagePath in imagePaths:
        #  读取本地图片
        img = cv.imread(imagePath)
        #  把图片转换为灰度图
        PIL_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
        #  把图片转变为像素点矩阵
        img_numpy = np.array(PIL_img)
        #  检测人脸,并获得人脸信息
        faces = face_detector.detectMultiScale(img_numpy)
        #  获得当前图片的文件名id
        id = int(os.path.split(imagePath)[1].split('.')[0])
        #  遍历当前张图片中的所有人脸,存储人脸的数据和结果
        for x,y,w,h in faces:
            #  从当前图片中把人脸矩阵数据切片出来,并存到容器中去
            facesSamples.append(img_numpy[y:y+h, x:x+w])
            #  存储当前人脸对应结果
            ids.append(id)
        #  返回人脸数据,以及结果
        return facesSamples, ids
#  建立模型,把模型保存到本地
if __name__ == '__main__':
    #  训练集数据与结果
    x_Train, y_Train = GetFaceImg_TrainData('mydata2')
    #  建立模型
    faceModel = cv.face.LBPHFaceRecognizer_create()
    #  训练模型
    faceModel.train(x_Train, np.array(y_Train))
    #  来保存模型本地
    faceModel.write('trainer/faceModel.yml')

用模型来识别人脸

#  导入模块
import cv2 as cv
import os
import numpy as np
'''
#  展示刚刚建模后使用data文件夹内的15张图片
fnames = os.listdir('data')
for fname in fnames:
    fpath = os.path.join('data' , fname)
    img = cv.imread(fpath)
    cv.imshow(fname , img)
#  等待按键输入
cv.waitKey(0)
#  关闭所有窗口
cv.destroyAllWindows( )
'''
#  1.创建模型
faceModel = cv.face.LBPHFaceRecognizer_create()
#  2.读取保存在本地的模型
faceModel.read('trainer/faceModel.yml')
#  3.使用模型来识别人脸,看人脸更接近哪张图片
#  (1) 读取人脸图片
img = cv.imread('data/7.pgm')
#  (2) 从人脸图片中获取人脸部分的像素矩阵
#   1)  将原图转换为灰度图
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
#   2)  创建人脸检测器(另一个模型)
face_detector = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')
#   3)  检测人脸,获得人脸的位置信息
faces = face_detector.detectMultiScale(gray_img)
#   4)  通过人脸的位置信息,来获得人脸部分的像素矩阵
for x,y,w,h in faces:
    #  (3) 把人脸的像素矩阵给模型进行识别
    result, score = faceModel.predict(np.array(gray_img)[y:y+h, x:x+w])
    #  输出结果
    print('识别结果是:', result, ',置信评分是:', score)

录入人脸

#  导入模块
import cv2 as cv
import numpy as np
import time
#  打开摄像头
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
#  创建人脸检测器
face_deteceor = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')
#  创建id
id = 1
#  记录当前时间
timer = time.time()
#  死循环
while True:
    #  遍历摄像头每帧画面
    #  flag表示摄像头是否有开启
    #  frame表示摄像头当前帧的画面
    flag, frame = cap.read()
    #  先判断摄像头是否有开启
    if not flag:
        break
    #  将摄像头的画面转换为灰度图
    gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    #  对摄像头画面检测人脸
    faces = face_deteceor.detectMultiScale(frame)
    #  遍历摄像头画面中的人脸信息
    for x,y,w,h in faces:
        #  在当前帧的摄像头画面中来画矩形
        cv.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255))
        #  经过3s后,才开始录入人脸
        if time.time() - timer 10:
            print(' 已经录入完毕')
        else:
            print('开始录入人脸')
            #  来将灰度图取出人脸部分的图像
            face_frame = np.array(gray_frame[y:y+h, x:x+w])
            #  把人脸图像存到本地中去
            cv.imwrite(f'my data/{id}.jpeg', face_frame)
            #  id+=1
            id +=1
    #  将摄像头的画面水平翻转
    newFrame = cv.flip(frame, 1)
    #  来把摄像头的画面通过opencv绘制出来
    #  参数:窗口名称 , 要显示的图像
    cv.imshow('CAP', newFrame)
    #  停留一下
    cv.waitKey(1)

在摄像头中识别人脸

#  导入模型
import cv2 as cv
#  打开摄像头
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
#  创建人脸检测器
face_detector = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')
#  创建人脸识别的模型
faceModel =cv.face.LBPHFaceRecognizer_create()
faceModel.read('trainer/faceModel.yml')
#  遍历摄像头每帧画面,进行显示
while True:
    #  获取摄像头当前帧画面
    flag, frame = cap.read()
    #  判断摄像头是否有开启
    if not flag:
        break
    #  把摄像头的画面转换为灰度图
    gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    #  检测摄像头画面中的人脸
    faces = face_detector.detectMultiScale(frame)
    #  遍历人脸信息
    for x,y,w,h in faces:
        #  框出人脸
        cv.rectangle(frame , (x , y) , (x+w , y+h) , color=(0 , 255 , 255))
        #  来把摄像头画面中人脸部分切片出来
        face_frae = gray_frame[y:y+h, x:x+w]
        #  把切片的这部分来给人脸识别模型进行识别 ,然后将识别结果输出出来
        id,score = faceModel.predict(face_frae)
        '''print('识别到图片id为:', id, ',差距值是', score)'''
        if score  10:
        print('successfully!!')
        break
    img = cv2.imread('my data/1.jpeg')
    cv2.imshow('my data/1.jpeg' , img)
    if ord('q') == cv2.waitKey(1):
        break
cap.release( )
cv2.destroyAllWindows( )

 

 

 

 

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]