import numpy as np
import cv2
import os
from sklearn.model_selection import train_test_split
def open_img(path):
imgList = [] #图片
labels = [] #各图片对应的表情
label = [] #仅表情(无重复)
for file in os.listdir(path):
if file == '.anonr' or file == '.htaccess':
continue
position = path+'/'+file
for parent, dirnames, filenames in os.walk(position):
for filename in filenames:
if filename == '.htaccess':
continue
fileList = filename.split('_')
if fileList[2] not in label:
label.append(fileList[2])
labels.append(label.index(fileList[2]))
img = cv2.imread(position+'/'+filename,cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (250, 350))
imgList.append(img)
return imgList,labels
def train_and_test(imgList,labels):
x_train,x_test,y_train,y_test = train_test_split(imgList,np.array(labels),test_size=0.3,random_state=42,stratify=np.array(labels))
recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(x_train,y_train)
right = 0
false = 0
for cnt in range(len(y_test)):
test_label = recognizer.predict(x_test[cnt])
if((test_label == y_test[cnt]).any()):
right += 1
else:
false += 1
return right/(right+false)
if __name__ == '__main__':
path = "../faces"
imgList,labels = open_img(path)
print('表情识别的准确率为:',train_and_test(imgList,labels))