python调用astra进行人脸检测(使用CascadeClassifier)

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!!

python调用astra进行人脸检测(使用CascadeClassifier)_第1张图片

 

你可能感兴趣的:(三维重建,python,python,opencv)