0
点赞
收藏
分享

微信扫一扫

小啾带你开天眼 之 人脸检测与识别(以及华强、皇叔、高祖配墨镜特效)【Python-Open_CV系列(十三)】


小啾带你开天眼 人脸识别
            【Python-Open_CV系列(十三)】

文章目录


      ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞ
                 在这里插入图片描述请添加图片描述请添加图片描述请添加图片描述在这里插入图片描述
    ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞ


大家好,我是侯小啾!在这里插入图片描述

在这里插入图片描述今天分享的内容是,使用python-OoenCV做人脸识别。废话不多说,开始整活!


①素材准备


②人脸检测

(一)级联分类器 与 相关方法介绍



相关的方法


(二)检测人脸

import cv2
# 以检测cdm_4.jpg中的人脸为例
img = cv2.imread("pictures\\cdm_4.jpg")
# 加载识别人脸的级联分类器
# faceCascade = cv2.CascadeClassifier("cascades\\haarcascade_frontalface_default.xml")
# faceCascade = cv2.CascadeClassifier("cascades\\haarcascade_frontalface_alt.xml")
faceCascade = cv2.CascadeClassifier("cascades\\haarcascade_frontalface_alt2.xml")
# 识别出所有人脸
faces = faceCascade.detectMultiScale(img, 1.3)
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

③华强、皇叔、高祖配墨镜


import cv2


# 定义覆盖图像函数
def overlay_img(img, img_over, img_over_x, img_over_y):
    img_h, img_w, img_p = img.shape  # 背景图像宽、高、通道数
    img_over_h, img_over_w, img_over_c = img_over.shape  # 覆盖图像高、宽、通道数
    # 如果图像通道数为3,则转换成4通道图像,增加一个表示透明度的。
    if img_over_c == 3:
        img_over = cv2.cvtColor(img_over, cv2.COLOR_BGR2BGRA)
    for h in range(0, img_over_h):
        for w in range(0, img_over_w):
            # 判断该像素点如果不透明,则执行覆盖。否则不用覆盖。
            if img_over[h, w, 3] != 0:
                # 如果该位置超出背景图边界则也不用执行覆盖
                X = img_over_x + w
                Y = img_over_y + h
                if X > img_w or Y > img_h:
                    break
                img[Y, X, 0] = img_over[h, w, 0]
                img[Y, X, 1] = img_over[h, w, 1]
                img[Y, X, 2] = img_over[h, w, 2]
    return img


face_img = cv2.imread("pictures\\shl_4.jpg")  # 读取人脸图像
glass_img = cv2.imread("glass.png", cv2.IMREAD_UNCHANGED)  # 读取眼镜图像,保留图像类型
height, width, channel = glass_img.shape  # 获取眼镜图像高、宽、通道数
# 加载级联分类器 haarcascade_frontalface_alt2.xml
face_cascade = cv2.CascadeClassifier("cascades\\haarcascade_frontalface_alt2.xml")
# garyframe = cv2.cvtColor(face_img, cv2.COLOR_BGR2GRAY)  # 转为黑白图像
faces = face_cascade.detectMultiScale(face_img, 1.3)  # 识别人脸

# 根据人脸大小缩放眼镜 并覆盖
for (x, y, w, h) in faces:  
    gw = int(w * 0.8)   
    gh = int(height * gw / width)  
    glass_img = cv2.resize(glass_img, (gw, gh))  
    overlay_img(face_img, glass_img, int(x + 0.1 * w), y + int(h * 1 / 3))
cv2.imshow("screen", face_img)
cv2.waitKey()
cv2.destroyAllWindows()



④人脸识别

import cv2
import numpy as np

# 先读取索引训练集的图像
img1 = cv2.imread("pictures\\cdm_1.jpg", 0)
img2 = cv2.imread("pictures\\cdm_2.jpg", 0)
img3 = cv2.imread("pictures\\cdm_3.jpg", 0)
img4 = cv2.imread("pictures\\cdm_4.jpg", 0)
img6 = cv2.imread("pictures\\shl_1.jpg", 0)
img7 = cv2.imread("pictures\\shl_2.jpg", 0)
img8 = cv2.imread("pictures\\shl_3.jpg", 0)
img9 = cv2.imread("pictures\\shl_4.jpg", 0)
img11 = cv2.imread("pictures\\yhw_1.jpg", 0)
img12 = cv2.imread("pictures\\yhw_2.jpg", 0)
img13 = cv2.imread("pictures\\yhw_3.jpg", 0)
img14 = cv2.imread("pictures\\yhw_4.jpg", 0)

# 以cdm_4.jpg的大小为基准,将其他图像也都调整为该大小。
y, x = img4.shape
img1 = cv2.resize(img1, (x, y))
img2 = cv2.resize(img2, (x, y))
img3 = cv2.resize(img3, (x, y))
img6 = cv2.resize(img6, (x, y))
img7 = cv2.resize(img7, (x, y))
img8 = cv2.resize(img8, (x, y))
img9 = cv2.resize(img9, (x, y))
img11 = cv2.resize(img11, (x, y))
img12 = cv2.resize(img12, (x, y))
img13 = cv2.resize(img13, (x, y))
img14 = cv2.resize(img14, (x, y))

# 将样本图像和标签都分别添加进列表中
# cdm的图像标签为0,shl的图像标签为1,yhw的图像标签为2
photos = list()
lables = list()
photos.append(img1)
lables.append(0)
photos.append(img2)
lables.append(0)
photos.append(img3)
lables.append(0)
photos.append(img4)
lables.append(0)

photos.append(img6)
lables.append(1)
photos.append(img7)
lables.append(1)
photos.append(img8)
lables.append(1)
photos.append(img9)
lables.append(1)

photos.append(img11)
lables.append(2)
photos.append(img12)
lables.append(2)
photos.append(img13)
lables.append(2)
photos.append(img14)
lables.append(2)

# 用字典匹配每个人的名字和上边设定的标签
names = {"0": "cdm", "1": "shl", "2": "yhw"}
# 创建特征脸识别器
# recognizer = cv2.face.EigenFaceRecognizer_create()
# 创建线性判别分析识别器
# recognizer = cv2.face.FisherFaceRecognizer_create()  
# 创建 LBPH人脸识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()

# 识别器开始训练
recognizer.train(photos, np.array(lables))

模型训练完成,下边开始使用测试集的图像进行识别。


读取测试集图像,并也调整为上述大小:

img5 = cv2.imread("pictures\\cdm_5.jpg", 0)
img10 = cv2.imread("pictures\\shl_5.jpg", 0)
img15 = cv2.imread("pictures\\yhw_5.jpg", 0)
img5 = cv2.resize(img5, (x, y))
img10 = cv2.resize(img10, (x, y))
img15 = cv2.resize(img15, (x, y))

识别img5:cdm_5.jpg

img = img5
label, confidence = recognizer.predict(img)
print("confidence = " + str(confidence))
print("识别结果:", names[str(label)])
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

识别img10:shl_5.jpg

img = img10
label, confidence = recognizer.predict(img)
print("confidence = " + str(confidence))
print("识别结果:", names[str(label)])
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()


识别img15:yhw_5.jpg

img = img15
label, confidence = recognizer.predict(img)
cv2.imshow("img", img)
print("confidence = " + str(confidence))
print("识别结果:", names[str(label)])

本次分享就到这里,本专栏也到此就告一段落啦。小啾感谢您的关注与支持!更多精彩内容敬请期待!
🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ

举报

相关推荐

0 条评论