1、简述
方法:使用opecv中,CascadeClassifier 级联分类器实现人脸检测,CascadeClassifier就是opencv下objdetect模块中用来做目标检测的级联分类器的一个类,它可以帮助我们检测例如车牌、眼睛、人脸等物体。它的大概原理就是判别某个物体是否属于某个分类。以人脸为例,我们可以把眼睛、鼻子、眉毛、嘴巴等属性定义成一个分类器,如果检测到一个模型符合定义人脸的所有属性,那么就认为它是一个人脸。
当我们预测的是离散值时,进行的是“分类”。对于只涉及两个类别的“二分类”任务,我们通常将其中一个类称为“正类”(正样本),另一个类称为“负类”(反类、负样本)。在人脸检测中,主要任务是构造能够区分包含人脸实例和不包含人脸实例的分类器。这些实例被称为“正类”(包含人脸图像)和“负类”(不包含人脸图像)。
2、基本步骤
- 导入分类器文件
我们这次实现的人脸识别功能,需要先导入一个后缀名为.xml的分类器文件,它是前人已经创建好的分类器,我们可以直接使用
- 读入图片
img1 = cv2.imread('Photos/MHT.png')
- 转为灰度图
imgGray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
- 调用detectMultiScale()函数进行检测
faces = face_cascade.detectMultiScale(cframe_data, 1.3, 5)
- 绘制方框
for (x, y, w, h) in faces:
cframe_data = cv2.rectangle(cframe_data, (x, y), (x+w, y+h), (255, 0, 0), 2)
3、代码
from openni import openni2
import numpy as np
import cv2
def mousecallback(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
print(y, x, dpt[y,x])
if __name__ == "__main__":
openni2.initialize()
dev = openni2.Device.open_any()
print(dev.get_device_info())
depth_stream = dev.create_depth_stream()
depth_stream.start()
color_stream = dev.create_color_stream()
color_stream.start()
#cap = cv2.VideoCapture(0)
cv2.namedWindow('depth')
cv2.setMouseCallback('depth',mousecallback)
cv2.namedWindow('color')
cv2.setMouseCallback('color',mousecallback)
#使用目标检测的级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#导入分类器文件
while True:
frame = depth_stream.read_frame()
dframe_data = np.array(frame.get_buffer_as_triplet()).reshape([480, 640, 2])
dpt1 = np.asarray(dframe_data[:, :, 0], dtype='float32')
dpt2 = np.asarray(dframe_data[:, :, 1], dtype='float32')
dpt2 *= 255
dpt = dpt1 + dpt2
cv2.imshow('depth', dpt)
cframe = color_stream.read_frame()
cframe_data = np.array(cframe.get_buffer_as_triplet()).reshape([480, 640, 3])
R = cframe_data[:, :, 0]
G = cframe_data[:, :, 1]
B = cframe_data[:, :, 2]
cframe_data = np.transpose(np.array([B, G, R]), [1, 2, 0])
cframe_data = cframe_data.copy()
#调用detectMultiScale()函数进行检测
faces = face_cascade.detectMultiScale(cframe_data, 1.3, 5)
#绘制矩形框标记人脸
for (x, y, w, h) in faces:
cframe_data = cv2.rectangle(cframe_data, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.imshow('color', cframe_data)
key = cv2.waitKey(1)
if int(key) == ord('q'):
break
depth_stream.stop()
color_stream.stop()
dev.close()
4、截图
感谢Musk美照,早晚高低提一辆特斯拉,respect!!