绘制人脸与人眼区域

【 1. 绘制矩形 】

  • 通过 OpenCV 的 Harr 分类器检测人脸,并输出识别结果(x,y,w,h)。
    图片坐标以左上角为原点;
    (x,y)代表人脸区域左上角坐标;
    w代表人脸区域的宽度(width);
    h代表人脸区域的高度(height)。
  • 例如:
    在这里插入图片描述
  • OpenCV 绘制矩形函数:
#img 为目标图片
#左上角坐标为(x,y),右下角坐标为(x+w,y+h),
#颜色(B,G,R),(255,0,0) 表示蓝色,(0,255,0) 表示绿色,(0,0,255) 表示红色,3 表示 BGR 三个通道。
# 2代表边框线粗度为 2。
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)

在这里插入图片描述

【 2. 绘制图片中人脸区域 】

使用 OpenCV 分类器检测人脸之后,一张图片中可能包含多个人脸,所以对每一个识别到的人脸都绘制对应的矩形框。

import cv2
image = cv2.imread('picture.jpg')# 读取图片
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)# 转换为灰度图片

#cv2.CascadeClassifier()为加载模型方法
face = cv2.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# 人脸检测器

# face_cascade.detectMultiScale() 为人脸检测方法, gray 为待检测灰度图, 1.1 表示检测框按 1.1 的比例放大, 3 表示一个目标至少要被检测到 3 次才算真正的目标。
faces = face.detectMultiScale(gray,1.1,3) # 识别人脸

for (x,y,w,h) in faces : # 标记人脸
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2) #绘制矩形
#上两句也可换成
#x, y, w, h = faces[0]
#cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2) 

cv2.imshow('cute boy',image)  # 显示图片

cv2.waitKey(0) # 等待用户关闭图片窗口
cv2.destroyAllWindows()# 关闭窗口

在这里插入图片描述

【 3. 绘制人脸区域中眼睛区域 】

进一步,我们在识别人脸的基础上,使用官方提供的path-of-haarcascade_eye.xml人眼检测模型,识别出人眼并绘制到图片上。

  • 不好的效果
    如果单独使用OpenCV人眼检测模型,来识别出整个图片中的人眼区域,效果不是很好。
import cv2
image = cv2.imread('picture.jpg')# 读取图片
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)# 转换为灰度图片

face = cv2.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# 人脸检测器
faces = face.detectMultiScale(gray,1.1,3) # 识别人脸

for (x,y,w,h) in faces : # 绘制人脸区域
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,0255),2) #绘制人脸矩形框

    eye_cascade = cv2.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_eye.xml')#人眼检测器
    eyes = eye_cascade.detectMultiScale(gray) #识别人眼
    for (ex, ey, ew, eh) in eyes: #绘制人眼
        cv2.rectangle(image, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) # 绘制人眼矩形框

cv2.imshow('img',image)  # 显示图片
cv2.waitKey(0) # 等待用户关闭图片窗口
cv2.destroyAllWindows()# 关闭窗口

在这里插入图片描述绿色框区域为眼睛,可以看出有识别错误的地方。

  • 好的效果

所以,一般情况下,我们会先检测出人脸区域,然后在人脸区域中使用眼睛区域检测模型得到眼睛区域,进而绘制。

import cv2
image = cv2.imread('picture.jpg')# 读取图片
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)# 转换为灰度图片

face = cv2.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# 人脸检测器
faces = face.detectMultiScale(gray,1.1,3) # 识别人脸

for (x,y,w,h) in faces : # 绘制人脸区域
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2) #绘制人脸矩形框

    face_gray = gray[y:y + h, x:x + w] # 灰度图片的脸部区域
    face_area = image[y:y + h, x:x + w] # 原图像的脸部区域

    eye_cascade = cv2.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_eye.xml')#人眼检测器
    eyes = eye_cascade.detectMultiScale(face_gray) #识别人眼
    for (ex, ey, ew, eh) in eyes: #绘制人眼
        cv2.rectangle(face_area, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) # 绘制人眼矩形框

cv2.imshow('img',image)  # 显示图片
cv2.waitKey(0) # 等待用户关闭图片窗口
cv2.destroyAllWindows()# 关闭窗口

在这里插入图片描述

原创文章 146 获赞 18 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44431690/article/details/106061162