python+opencv入门-动手实现人脸检测

python+opencv入门-动手实现人脸检测

参考文章
https://www.educoder.net/shixuns/2pwliuxy/challenges

任务描述

本关任务:利用 openCV 对图片进行相应的处理。

相关知识

为了完成本关任务,你需要掌握:
1 . 人脸检测。
2 . 如何利用 openCV 实现人脸检测。

人脸检测

在上一关,我们已经知道如何去检测图片中人物的性别。然而,在真实项目中,我们不仅仅是需要知道图片中人物的性别,有时候还需要将图片中人脸的位置检测出来。
在这里插入图片描述
如上图,我们用一个方框将人脸部分给划分出来,人脸检测就是需要找出这个方框的正确位置。需要将检测框位置确定下来需要知道四个参数:
1.x:检测框左上角点的横坐标。
2.y:检测框左上角点的纵坐标。
3.w:检测框宽的值。
4.h:检测框高的值。

在这里插入图片描述
如何确定这四个参数的值其实与上一关相似,都需要构建一个损失函数再进行优化,只不过上一关是分类问题,而这一关是回归问题。

如何利用openCV实现人脸检测

跟其它任务一样,要进行人脸检测首先得加载待检测图片:

import cv2
#加载图片
img = cv2.imread(img_path,1)
#转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

其中,cv2.imread() 为加载图片方法,参数 img_path 为待识别图片路径, 1 表示加载 BGR 图片,接下来再使用 cv2.cvtColor() 方法将图片转换为灰度图。 img 为待处理图片,cv2.COLOR_BGR2GRAY 表示将 BGR 图转换为灰度图。
然后我们再加载已经训练好的检测模型:

#加载模型
face_cascade = cv2.CascadeClassifier(model_path)

cv2.CascadeClassifier()为加载模型方法,model_path为模型存放路径。
利用训练好的模型,我们就能检测出人脸的位置,代码如下:

#获取识别框坐标
face_rects = face_cascade.detectMultiScale(gray, 1.1, 10)
x, y, w, h = face_rects[0]

face_cascade.detectMultiScale() 为人脸检测方法, gray 为待检测灰度图, 1.1 表示检测框按 1.1 的比例放大, 10 表示一个目标至少要被检测到 10 次才算真正的目标。(x,y) 为检测框左上角坐标,w,h 为检测框宽高长度值。
最后,我们将检测框添加进图像中并保存图像:

#将识别框加入图片中
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
#保存图片
cv2.imwrite(img_save_path,img)

img 为目标图片,(x,y) 为检测框左上角坐标,(x+w,y+h) 为右下角坐标。 (255,0,0) 表示蓝色,(0,255,0) 表示绿色,(0,0,255) 表示红色,3 表示 BGR 三个通道。

编程实践

编辑器补充代码,实现人脸检测方法。
0在这里插入图片描述 方便复制学习

# -*- coding: utf-8 -*-#完整代码!
import cv2


def face_detection(img_path,img_save_path,model_path):    
   '''    
   img_path:待识别图片路径
   img_save_path:图片保存路径
   model_path:模型所在路径    
   '''      
   #********* Begin *********#    
   #加载图片    
   img = cv2.imread(img_path,1)    
   #转换为灰度图    
   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    
   #加载模型    
   face_cascade = cv2.CascadeClassifier(model_path)    
   #获取识别框坐标    
   face_rects = face_cascade.detectMultiScale(gray, 1.1, 10)    
   x, y, w, h = face_rects[0]    
   #将识别框加入图片中    
   cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)    
   #保存图片    
   cv2.imwrite(img_save_path,img)    
   #********* End *********#    
   return face_rects[0]



猜你喜欢

转载自blog.csdn.net/m0_46742690/article/details/106559552