浅尝OpenCV-Python人脸检测

文章目录

    • 1.Cascade分类器
      • 1.1加载haar_face面部识别参数
      • 1.2detectMultiScale()函数
      • 1.3 识别加框
    • 2.Face-Recognition
      • 2.1创建训练集
      • 2.2保存参数
      • 2.3 读取参数进行人脸识别

1.Cascade分类器

1.1加载haar_face面部识别参数

该操作是将haar_face.xml的代码加载到一个级联分类器中

haar_cascade = cv.CascadeClassifier('haar_face.xml')

1.2detectMultiScale()函数

detectMultiScale(image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)

Param Description
image 一个uint8形式的图片矩阵(一般采用灰度照片)
scaleFactor scaleFactor为设定的搜索窗口的比例系数,即以多大的窗口去读取照片的数据,越大,则训练越快,但也可能会存在信息遗失,过小,则也可能会放大噪声
minNeighbors minNeighbors表示构成检测目标的相邻矩形的最小个数。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。 m i n N e i g h b o r 值 越 大 , 则 检 测 对 噪 声 敏 感 性 越 低 。 \color{red}minNeighbor值越大,则检测对噪声敏感性越低。 minNeighbor
flag 1、CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多或过少的区域。
2、CV_HAAR_SCALE_IMAGE 函数不进行分类器缩放,而是进行缩放图像,按比例正常检测。
3、CV_HAAR_FIND_BIGGEST_OBJECTS 只返回最大目标
4、CV_HAAR_DO_ROUGH_SEARCH 只做粗略检测,即只要第一个候选者被发现则结束寻找
faces_rect = haar_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3)
print(f'Number of faces found = {len(faces_rect)}')#打印列表长度,即找到几张人脸

该函数返回值为一个(x,y,w,h)的列表,x,y为坐标点,w,h分别为各方向上的偏移量。

浅尝OpenCV-Python人脸检测_第1张图片

1.3 识别加框

for (x,y,w,h) in faces_rect:
     cv.rectangle(img, (x,y), (x+w,y+h), (0,255,0), thickness=2)

根据返回值的对应坐标信息,在指定坐标位置画矩形

浅尝OpenCV-Python人脸检测_第2张图片

2.Face-Recognition

2.1创建训练集

people = ['Ben Afflek', 'Elton John', 'Jerry Seinfield', 'Madonna', 'Mindy Kaling']#识别分类的种类

haar_cascade = cv.CascadeClassifier('haar_face.xml')#加载级联分类器

features = []#图片ROI(Region of image)列表
labels = []#图片标签列表

def create_train():
    for person in people:#遍历数据集文件夹每一个分类文件
        path = os.path.join(DIR, person)
        label = people.index(person)

        for img in os.listdir(path):#遍历同一个文件夹的人像图片
            img_path = os.path.join(path,img)

            img_array = cv.imread(img_path)
            if img_array is None:
                continue 
                
            gray = cv.cvtColor(img_array, cv.COLOR_BGR2GRAY)#图片灰度化

            faces_rect = haar_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=4)#通过人脸识别加框选择ROI区域

            for (x,y,w,h) in faces_rect:
                faces_roi = gray[y:y+h, x:x+w]#添加ROI区域
                features.append(faces_roi)
                labels.append(label)

2.2保存参数

#转化为.npm格式方便存储
features = np.array(features, dtype='object')
labels = np.array(labels)

face_recognizer = cv.face.LBPHFaceRecognizer_create()#可能需要在命令行中运行,否则报错cv没用face这个类

#通过特征和标签进行对face_recognizer进行训练
face_recognizer.train(features,labels)

#保存训练参数,及相关数据
face_recognizer.save('face_trained.yml')
np.save('features.npy', features)
np.save('labels.npy', labels)

2.3 读取参数进行人脸识别

haar_cascade = cv.CascadeClassifier('haar_face.xml')#加载级联分类器用于找到预测图片的ROI区域

people = ['Ben Afflek', 'Elton John', 'Jerry Seinfield', 'Madonna', 'Mindy Kaling']#方便标签进行映射
# features = np.load('features.npy', allow_pickle=True)
# labels = np.load('labels.npy')

face_recognizer = cv.face.LBPHFaceRecognizer_create()
face_recognizer.read('face_trained.yml')

img = cv.imread(r'../Resources\Faces\val\elton_john/1.jpg')#读取图片

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('Person', gray)


faces_rect = haar_cascade.detectMultiScale(gray, 1.1, 4)

for (x,y,w,h) in faces_rect:
    faces_roi = gray[y:y+h,x:x+w]

    label, confidence = face_recognizer.predict(faces_roi)#predict返回参数为标签名以及判断的置信度
    print(f'Label = {people[label]} with a confidence of {confidence}')

    cv.putText(img, str(people[label]), (20,20), cv.FONT_HERSHEY_COMPLEX, 1.0, (0,255,0), thickness=2)
    cv.rectangle(img, (x,y), (x+w,y+h), (0,255,0), thickness=2)

浅尝OpenCV-Python人脸检测_第3张图片


参考资料

opencv courses

OpenCV detectMultiScale()

你可能感兴趣的:(Python,计算机视觉,python,opencv,学习)