参考文章
https://www.educoder.net/shixuns/2pwliuxy/challenges
本关任务:利用 openCV 对图片进行相应的处理。
为了完成本关任务,你需要掌握:
1 . 人脸检测。
2 . 如何利用 openCV 实现人脸检测。
在上一关,我们已经知道如何去检测图片中人物的性别。然而,在真实项目中,我们不仅仅是需要知道图片中人物的性别,有时候还需要将图片中人脸的位置检测出来。
如上图,我们用一个方框将人脸部分给划分出来,人脸检测就是需要找出这个方框的正确位置。需要将检测框位置确定下来需要知道四个参数:
1.x:检测框左上角点的横坐标。
2.y:检测框左上角点的纵坐标。
3.w:检测框宽的值。
4.h:检测框高的值。
如何确定这四个参数的值其实与上一关相似,都需要构建一个损失函数再进行优化,只不过上一关是分类问题,而这一关是回归问题。
跟其它任务一样,要进行人脸检测首先得加载待检测图片:
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 三个通道。
# -*- 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]