小啾带你开天眼 之 人脸识别
【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)])
本次分享就到这里,本专栏也到此就告一段落啦。小啾感谢您的关注与支持!更多精彩内容敬请期待!
🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ