import numpy as np
import cv2 as cv
import operator
from os import listdir
def imgVector(filename):
img = cv.imread(filename, cv.IMREAD_GRAYSCALE)
resize_img = cv.resize(img, dsize=(32, 32))
imgVector = resize_img.reshape(1,1024)
return imgVector
def kNN(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2
sqDistance = sqDiffMat.sum(axis=1)
distances = sqDistance**0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
def faceRec():
resultList = ['许嵩', '汪苏泷', '徐良']
Labels = []
trainingFileList = listdir('trainingFaces')
m = len(trainingFileList)
trainingMat = np.zeros((m,1024))
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
Labels.append(classNumStr)
trainingMat[i,:] = imgVector('trainingFaces/%s' % fileNameStr)
testFileList = listdir('testFaces')
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = imgVector('testFaces/%s' % fileNameStr)
classifierResult = kNN(vectorUnderTest, trainingMat, Labels, 5)
print("分类结果: %s, 正确答案: %s" % (resultList[classifierResult], resultList[classNumStr]))
if (classifierResult != classNumStr):
errorCount += 1.0
print("\n分错总数: %d" % errorCount)
print("\n准确率: %f" % (1-errorCount/float(mTest)))
if __name__ == "__main__":
faceRec()