文章目录

  • 1.先前Opencv人脸检测
  • 2.python下的级联分类器
  • 3.首先了解Opencv中Haar 特征的Cascade级联分类器
  • 4.Adaboost算法
  • 5.使用图片简单测试一下
  • 6.使用Opencv中自带的级联分类器进行人脸实时检测
  • 7.使用Opencv中自带的级联分类器进行人脸微笑检测
  • 8.使用Opencv中自带的级联分类器进行人脸微笑实时检测


1.先前Opencv人脸检测



2.python下的级联分类器


opencv 人脸识别率底 opencv人脸识别优化_级联分类器


3.首先了解Opencv中Haar 特征的Cascade级联分类器

使用基于 Haar 特征的级联分类器进行对象检测是 Paul Viola 和 Michael Jones 在其 2001 年的论文“Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一种有效的对象检测方法。它是一种基于机器学习的方法,其中级联函数是从大量正负图像中训练出来的。然后它用于检测其他图像中的对象。

最初,该算法需要大量的正图像(人脸图像)和负图像(没有人脸的图像)来训练分类器。然后我们需要从中提取特征。为此,使用了下图中显示的 Haar 特征。它们就像我们的卷积核。每个特征都是通过从黑色矩形下的像素总和中减去白色矩形下的像素总和而获得的单个值

opencv 人脸识别率底 opencv人脸识别优化_计算机视觉_02


4.Adaboost算法

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。Adaboost算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次得到的分类器最后融合起来,作为最后的决策分类器。

opencv 人脸识别率底 opencv人脸识别优化_opencv_03


5.使用图片简单测试一下

#Opencv人脸检测
import os
import cv2

#导入人脸检测级联分类器,.xml包含训练出来的人脸特征
detect_face=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')

#导入图片
#filename:需要打开图片的路径,可以是绝对路径或者相对路径,路径中不能出现中文。
#flag:图像的通道和色彩信息(默认值为1)。
frame=cv2.imread('images/face1.jpg',flags=1)

# 使用detect_face进行人脸检测,返回包含的内容是人脸位置的坐标,scaleFactor人脸框的放大比例,minNeighbors表示检测的最小次数
detect = detect_face.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=15)

#遍历图中的人脸画框
for (x0,y0,w,h) in detect:
    #对人脸进行画框
    frame=cv2.rectangle(frame,pt1=(x0,y0),pt2=(x0+w,y0+h),color=(255,0,0),thickness=2)
    #图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
    cv2.putText(frame,text='person',org=(x0+w//4,y0-10),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1.2,color=(0,255,0),thickness=2)
cv2.imshow('face',frame)
cv2.destroyAllWindows()


if __name__ == '__main__':
    print('Pycharm')

opencv 人脸识别率底 opencv人脸识别优化_人脸检测_04


6.使用Opencv中自带的级联分类器进行人脸实时检测

#Opencv人脸检测
import os
import cv2

#导入人脸检测级联分类器
detect_face=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')


#打开摄像头
cap=cv2.VideoCapture(0)

while cap.isOpened():
    OK,frame=cap.read()
    # 使用detect_face进行人脸检测,返回包含的内容是人脸位置的坐标,scaleFactor人脸框的放大比例,minNeighbors表示检测的最小次数
    detect = detect_face.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=15)
    #遍历图中的人脸画框
    for (x0,y0,w,h) in detect:
        #对人脸进行画框
        frame=cv2.rectangle(frame,pt1=(x0,y0),pt2=(x0+w,y0+h),color=(255,0,0),thickness=2)
        #图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
        cv2.putText(frame,text='person',org=(x0+w//4,y0-10),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1.2,color=(0,255,0),thickness=2)
    if cv2.waitKey(1)&0xFF==27:
        break
    cv2.imshow('face',frame)
cap.release()
cv2.destroyAllWindows()


if __name__ == '__main__':
    print('Pycharm')

7.使用Opencv中自带的级联分类器进行人脸微笑检测

#Opencv人脸检测
import os
import cv2

#导入人脸检测级联分类器
detect_face=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')

#导入人脸检测级联分类器
detect_smile=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_smile.xml')

#导入图片
#filename:需要打开图片的路径,可以是绝对路径或者相对路径,路径中不能出现中文。
#flag:图像的通道和色彩信息(默认值为1)。
frame=cv2.imread('images/smile.jpg',flags=1)
#使用detect_face进行人脸检测,返回包含的内容是人脸位置的坐标,scaleFactor人脸框的放大比例,minNeighbors表示检测的最小次数
detect = detect_face.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=15)


#遍历图中的人脸画框
for (x0,y0,w,h) in detect:
    #对人脸进行画框
    frame=cv2.rectangle(frame,pt1=(x0,y0),pt2=(x0+w,y0+h),color=(255,0,0),thickness=2)

    #首先将人的检测出来之后检测人的微笑情况
    frame_smile=frame[x0:x0+w,y0:y0+h]
    # 对人的进行检测
    smile=detect_smile.detectMultiScale(frame_smile,scaleFactor=1.2,minNeighbors=15)
    for (sx, sy, sw, sh) in smile:
        # 图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
        cv2.putText(frame, text='smile', org=(x0 + w // 4, y0 - 10), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                    fontScale=1.2,
                    color=(0, 255, 0), thickness=2)

cv2.imshow('face',frame)
cv2.waitKey(0)
cv2.destroyAllWindows()


if __name__ == '__main__':
    print('Pycharm')

8.使用Opencv中自带的级联分类器进行人脸微笑实时检测

#Opencv人脸检测
import os
import cv2

#导入人脸检测级联分类器
detect_face=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')

#导入人脸检测级联分类器
detect_smile=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_smile.xml')

#打开摄像头
cap=cv2.VideoCapture(0)

while cap.isOpened():
    OK,frame=cap.read()
    # 使用detect_face进行人脸检测,返回包含的内容是人脸位置的坐标,scaleFactor人脸框的放大比例,minNeighbors表示检测的最小次数
    detect = detect_face.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=15)
    #遍历图中的人脸画框
    for (x0,y0,w,h) in detect:
        #对人脸进行画框
        frame=cv2.rectangle(frame,pt1=(x0,y0),pt2=(x0+w,y0+h),color=(255,0,0),thickness=2)
        #图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
        cv2.putText(frame,text='person',org=(x0+w//4,y0-40),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1.2,
                    color=(0,255,0),thickness=2)

        #首先将人的检测出来之后检测人的微笑情况
        frame_smile=frame[x0:x0+w,y0:y0+h]
        # 对人的进行检测
        smile=detect_smile.detectMultiScale(frame_smile,scaleFactor=1.2,minNeighbors=15)
        for (sx, sy, sw, sh) in smile:
            # 图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
            cv2.putText(frame, text='smile', org=(x0 + w // 4, y0 - 10), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                        fontScale=1.2,
                        color=(0, 255, 0), thickness=2)

    if cv2.waitKey(1)&0xFF==27:
        break
    cv2.imshow('face',frame)
cap.release()
cv2.destroyAllWindows()


if __name__ == '__main__':
    print('Pycharm')