本文主要是代码展示,如果想看详细教程请移步(上)篇
1.数据的收集#使用之前请现在根目录创建data文件夹,然后改你自己的分类器路径
#使用方法,填入ID号和姓名,然后看摄像头就行
def get_data(id,name):
camera = cv2.VideoCapture(0)
flag, img = camera.read()
face_cascade = cv2.CascadeClassifier('G:/opencv/build/etc/haarcascades/haarcascade_frontalface_default.xml')
print("开始记录数据 \n")
num = 0 # 设置录入照片的初始值
num_picture = 50 #要读取的照片数量
while True:
ret, frame = camera.read()
if ret is True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
break
face_detector = face_cascade
faces = face_detector.detectMultiScale(gray, 1.3, 5,minSize=(100,100))
check = np.array(faces) #防止未检测到人脸导致数据不全
if check.sum() > 0:
num += 1
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x + w, y + w), (255, 0, 0))
gray = gray[y:y + h, x:x + w]
gray = cv2.resize(gray, dsize=(500, 500))
cv2.imwrite("./data/" + str(id) + str(name) + '.' + str(num) + '.jpg', gray)
if num > num_picture:
break
2.数据训练
(1)整合ID与图像
def get_id_img():
path = 'data/'
facesamples = []
ids = []
imagepaths = [os.path.join(path, f) for f in os.listdir(path)] # 储存图片信息
face_detector = cv2.CascadeClassifier('G:/opencv/build/etc/haarcascades/haarcascade_frontalface_default.xml')
for imagePath in imagepaths:
gray = cv2.imread(imagePath,cv2.IMREAD_GRAYSCALE)
img_numpy = np.array(gray, 'uint8')
id = int(os.path.split(imagePath)[1].split('.')[0])
ids.append(id)
facesamples.append(img_numpy)
return facesamples, ids
#用法:
images,id = get_id_img()
(2)训练函数
#使用前在根目录下创建 trainer文件夹
def train():
images,ids = get_id_img()
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.train(images, np.array(ids))
recognizer.write('trainer/trainer.yml') # 保存生成的人脸特征数据文件
3.部署
def predict(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
face_detector = cv2.CascadeClassifier('G:/opencv/build/etc/haarcascades/haarcascade_frontalface_default.xml') # 加载分类器
recogizer = cv2.face.LBPHFaceRecognizer_create()
recogizer.read('trainer/trainer.yml')
face = face_detector.detectMultiScale(gray, 1.3, 5, cv2.CASCADE_SCALE_IMAGE)
check = np.array(face)
if check.sum() > 0:
for x, y, w, h in face:
cv2.rectangle(img, (x, y), (x+w, y+h), color=(0, 0, 255), thickness=2)
gray = gray[y:y + h, x:x + w]
gray = cv2.resize(gray,dsize=(500,500))
id, confidence = recogizer.predict(gray)
print(id)
print(confidence)
if (confidence > 50):
cv2.putText(img,'unknow', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
else:
cv2.putText(img,str(names[id-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
cv2.imshow('result', img)
然后读取图片啥的我就不说了,相信大家都明白。
4.结语这个分类效果吧,说实话非常一般,但是可以用,过几天我会用百度paddle深度学习框架,给大家搭建一个自己的网络训练,大家有什么问题也可以在底下评论区留言。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)