opencv---人脸识别

基本原理:

xml中存放的是训练后的特征池,特征size大小根据训练时的参数而定,检测的时候可以简单理解为就是将每个固定size特征(检测窗口)与输入图像的同样大小区域比较,如果匹配那么就记录这个矩形区域的位置,然后滑动窗口,检测图像的另一个区域,重复操作。
由于输入的图像中特征大小不定,比如在输入图像中眼睛是50x50的区域,而训练时的是25x25,那么只有当输入图像缩小到一半的时候,才能匹配上,所以这里还有一个逐步缩小图像,也就是制作图像金字塔的流程。

import cv2 as cv
import numpy as np

def face_detect_demo(image):
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    face_detector=cv.CascadeClassifier("E:/files/face_detect_files/opencv-master/data/haarcascades/haarcascade_frontalface_alt_tree.xml")

    # 第一个参数是灰度图像
    # 第二个参数是尺度变换,就是向上或者向下每次是原来的多少倍,这里是1.1倍
    # 第三个参数是人脸检测次数,设置越高,误检率越低,但是对于模糊图片,我们设置越高,越不易检测出来,要适当降低
    #第二个和第三个参数的设置会影响检测的速度和视频的帧数,选择合适的数值更为重要
    faces=face_detector.detectMultiScale(gray,1.1,2)  #faces返回的是矩形框
    for x,y,w,h in faces:
        cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
    cv.imshow("result",image)

print("----Hello Opencv----")
src=cv.imread("D:/pythonprograms/tutorial1/images/face_detect.png")
capture=cv.VideoCapture(0)
cv.namedWindow("Input Image",cv.WINDOW_AUTOSIZE)
cv.namedWindow("result",cv.WINDOW_AUTOSIZE)
cv.imshow("Input Image",src)
face_detect_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行截图:
在这里插入图片描述

在摄像头中进行人脸识别:

import cv2 as cv
import numpy as np

def face_detect_demo(image):
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    # face_detector=cv.CascadeClassifier("E:/files/face_detect_files/opencv-master/data/haarcascades/haarcascade_frontalface_alt_tree.xml")
    face_detector=cv.CascadeClassifier("E:/files/face_detect_files/opencv-master/data/haarcascades/haarcascade_frontalface_alt_tree.xml")   #级联检测器获取文件

    faces=face_detector.detectMultiScale(gray,1.1,2)  #faces返回的是矩形框
    for x,y,w,h in faces:
        cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
    cv.imshow("result",image)

print("----Hello Opencv----")
# src=cv.imread("D:/pythonprograms/tutorial1/images/face_detect.png")
capture=cv.VideoCapture(0)
# cv.namedWindow("Input Image",cv.WINDOW_AUTOSIZE)
cv.namedWindow("result",cv.WINDOW_AUTOSIZE)
#检测视频中的人脸

while(True):
    ret,frame=capture.read()
    frame=cv.flip(frame,1)
    face_detect_demo(frame)
    c=cv.waitKey(10)
    if c==27:           #ESC
        break
# cv.imshow("Input Image",src)
# face_detect_demo()
cv.waitKey(0)
cv.destroyAllWindows()

部分注释参考此blog

猜你喜欢

转载自blog.csdn.net/Forest_2Cat/article/details/105565274