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 cv2def 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 *= 255dpt = dpt1 + dpt2cv2.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'):breakdepth_stream.stop()color_stream.stop()dev.close()
4、截图
感谢Musk美照,早晚高低提一辆特斯拉,respect!!