浅析cv2.CascadeClassifier()函数

最近开始学习Opencv以及相关的代码,看了一些网上的解释,总结一下CascadeClassifier()这个函数,方便以后加深印象。

 

CascadeClassifier,是Opencv中做人脸检测的时候的一个级联分类器。并且既可以使用Haar,也可以使用LBP特征。

Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征。用黑白两种矩形框组合成特征模板,在特征模板内用 黑色矩形像素和 减去 白色矩形像素和来表示这个模版的特征值。例如:脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。这样就可以进行区分人脸。

LBP特征原理:http://www.360doc.com/content/18/0202/11/18306241_727150014.shtml

这是我从github上下载的一部分示例代码:

def getfacefromcamera(outdir):
    createdir(outdir)
    #获取摄像头
    camera = cv2.VideoCapture(0)
    #要检测cascade文件是否在路径下,最后一般使用绝对路径。
    haar = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    n = 1
    while 1:
        if (n <= 200):
            print('It`s processing %s image.' % n)
            # 读帧(从摄像头当中读取照片)
            success, img = camera.read()
            # 将图片进行转灰
            gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            faces = haar.detectMultiScale(gray_img, 1.3, 5)
            for f_x, f_y, f_w, f_h in faces:
                face = img[f_y:f_y+f_h, f_x:f_x+f_w]
                face = cv2.resize(face, (IMGSIZE, IMGSIZE))
                #could deal with face to train
                face = relight(face, random.uniform(0.5, 1.5), random.randint(-50, 50))
                cv2.imwrite(os.path.join(outdir, str(n)+'.jpg'), face)

                cv2.putText(img, 'haha', (f_x, f_y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)  #显示名字
                img = cv2.rectangle(img, (f_x, f_y), (f_x + f_w, f_y + f_h), (255, 0, 0), 2)
                n+=1
            cv2.imshow('img', img)
            key = cv2.waitKey(30) & 0xff
            if key == 27:
                break
        else:
            break
    camera.release()
    cv2.destroyAllWindows()

子函数detectMultiScale()介绍

void detectMultiScale(
    const Mat& image,                //待检测图像
    CV_OUT vector& objects,    //被检测物体的矩形框向量
    double scaleFactor = 1.1,        //前后两次相继的扫描中搜索窗口的比例系数,默认为1.1 即每次搜索窗口扩大10%
    int minNeighbors = 3,            //构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于minneighbors - 1 都会被排除
                                     //如果minneighbors为0 则函数不做任何操作就返回所有被检候选矩形框
    int flags = 0,                   //若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多或过少的区域 
    Size minSize = Size(),              
    Size maxSize = Size()            //最后两个参数用来限制得到的目标区域的范围     
);

对于flags,有以下取值:
CV_HAAR_DO_CANNY_PRUNING:利用Canny边缘检测器来排除一些边缘很少或者很多的图像区域;
CV_HAAR_SCALE_IMAGE:按比例正常检测;
CV_HAAR_FIND_BIGGEST_OBJECT:只检测最大的物体;
CV_HAAR_DO_ROUGH_SEARCH:只做初略检测。

你可能感兴趣的:(人工智能,Opencv)