接下来开始学习使用python+opencv进行人脸识别功能,但今天先不做人脸识别,先做人脸检测,要实现给你一张照片要准确的再照片上找到人脸,并将人脸框起来。
要使用opencv我们得先安装相关库。命令行输入“pip install opencv-python”回车执行进行安装
接下来准备几张需要检测人脸的照片,照片命名尽量言简意赅,方便调用。
例:我准备了三张照片,分别是大一,大二,大三的照片,本打算做人脸识别,判断这三张照片是不是同一人,但今天先拿来做人脸检测实验。
其实人脸检测程序只有一个,但要检测三张照片,后面的代码基本相同,所以就直接复制了。
首先导入三张照片,再用人脸级联分类器进行人脸检测,这里顺便加了一个人眼检测,不仅要检测到人脸还要检测到人眼。最后将人脸和人眼用不同颜色的线条框起来
import cv2 # 导入相关库
img1 = cv2.imread(r'C:\Users\DELL\Desktop\face_test\image\1.jpg',1) # 导入照片
img2 = cv2.imread(r'C:\Users\DELL\Desktop\face_test\image\2.jpg',1) # 导入照片
img3 = cv2.imread(r'C:\Users\DELL\Desktop\face_test\image\3.jpg',1) # 导入照片
face_engine = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml') # 人脸检测
eye_engine = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml') # 人眼检测
# 照片1处理
face1 = face_engine.detectMultiScale(img1,scaleFactor=1.3,minNeighbors=5) # 参数可调,有利于分辨
for (x1,y1,w1,h1)in face1:
img1 = cv2.rectangle(img1,(x1,y1),(x1+w1,y1+h1),(255,0,0),2) # 脸部框图绘制
face_area1 = img1[y1:y1+h1,x1:x1+w1] # 将眼部检测区域范围缩小,减少检测时间
eye1 = eye_engine.detectMultiScale(face_area1,1.3,10)
for (ex1,ey1,ew1,eh1) in eye1:
cv2.rectangle(face_area1,(ex1,ey1),(ex1+ew1,ey1+eh1),(0,255,0),1) # 眼部框图绘制
# 照片2处理
face2 = face_engine.detectMultiScale(img2,scaleFactor=1.2,minNeighbors=2) # 参数可调,有利于分辨
for (x2,y2,w2,h2)in face2:
img2 = cv2.rectangle(img2,(x2,y2),(x2+w2,y2+h2),(255,0,0),2) # 脸部框图绘制
face_area2 = img2[y2:y2+h2,x2:x2+w2] # 将眼部检测区域范围缩小,减少检测时间
eye2 = eye_engine.detectMultiScale(face_area2,1.3,10)
for (ex2,ey2,ew2,eh2) in eye2:
cv2.rectangle(face_area2,(ex2,ey2),(ex2+ew2,ey2+eh2),(0,255,0),1) # 眼部框图绘制
# 照片3处理
face3 = face_engine.detectMultiScale(img3,scaleFactor=1.3,minNeighbors=5) # 参数可调,有利于分辨
for (x3,y3,w3,h3)in face3:
img3 = cv2.rectangle(img3,(x3,y3),(x3+w3,y3+h3),(255,0,0),2) # 脸部框图绘制
face_area3 = img3[y3:y3+h3,x3:x3+w3] # 将眼部检测区域范围缩小,减少检测时间
eye3 = eye_engine.detectMultiScale(face_area3,1.3,10)
for (ex3,ey3,ew3,eh3) in eye3:
cv2.rectangle(face_area3,(ex3,ey3),(ex3+ew3,ey3+eh3),(0,255,0),1) # 眼部框图绘制
cv2.imshow('1', img1) # 大一照片人脸检测展示
cv2.imshow("2", img2) # 大二照片人脸检测展示
cv2.imshow("3", img3) # 大三照片人脸检测展示
cv2.waitKey(0) # 循环
cv2.destroyAllWindows()
到这里代码就全部结束了,接下来看看展示效果。
这里特别注意,在检测第二张图片时,我将检测的精准度调小了,因为第二张是偏侧脸,精准度太高的话,会识别不到脸。
今天先做静态照片的人脸检测,接下来做动态的人脸检测,之后再做静态和动态的人脸识别,一步一步来,这样更容易掌握人脸识别。