- 通过 OpenCV 的 Harr 分类器检测人脸,并输出识别结果(x,y,w,h)。
图片坐标以左上角为原点;
(x,y)代表人脸区域左上角坐标;
w代表人脸区域的宽度(width);
h代表人脸区域的高度(height)。- 例如:
#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)
使用 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()# 关闭窗口
进一步,我们在识别人脸的基础上,使用官方提供的path-of-haarcascade_eye.xml人眼检测模型,识别出人眼并绘制到图片上。
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) #绘制人脸矩形框
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()# 关闭窗口