该操作是将haar_face.xml的代码加载到一个级联分类器中
haar_cascade = cv.CascadeClassifier('haar_face.xml')
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分别为各方向上的偏移量。
for (x,y,w,h) in faces_rect:
cv.rectangle(img, (x,y), (x+w,y+h), (0,255,0), thickness=2)
根据返回值的对应坐标信息,在指定坐标位置画矩形
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)
#转化为.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)
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 courses
OpenCV detectMultiScale()