分享一下自己做这个小程序的笔记!
使用工具:PyCharm,python版本3.7,opencv3
使用的包:
原理和功能
使用opencv3调用摄像头,获取图像保存,对保存的图片进行OPENCVLBHP算法训练,利用训练集和分类器实现人脸识别。使用语音模块进行人机交互,使用数据库相关操作保存和读取数据库!
详细设计
由于保存人脸信息和训练集需要文件夹,这里先进行检测环境,如果没有就进行创建。
def makeDir(engine,x):
if not os.path.exists("face_trainer"):
print("创建预训练环境")
engine.say('检测到第一次启动,正在创建预训练环境')
os.mkdir("face_trainer")
engine.say('创建成功')
engine.runAndWait()
x=2
if not os.path.exists("Facedata"):
print("创建训练环境")
engine.say('正在创建训练环境')
os.mkdir("Facedata")
engine.say('创建成功')
engine.runAndWait()
x=2
return x
通过摄像头采集人脸信息
def getFace(cap,face_id):
face_detector = cv2.CascadeClassifier('./lib/haarcascade_frontalface_default.xml')
print('\n Initializing face capture. Look at the camera and wait ...')
count = 0
while True:
sucess, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+w), (255, 0, 0))
count += 1
cv2.imwrite("Facedata/User." + str(face_id) + '.' + str(count) + '.jpg', gray[y: y + h, x: x + w])
cv2.imshow('image', img)
# 保持画面的持续。
k = cv2.waitKey(1)
if k == 27: # 通过esc键退出摄像
break
elif count >= 1000: # 得到1000个样本后退出摄像
break
cv2.destroyAllWindows()
cv2.CascadeClassifier中加载分类器,使用官方给定的xml分类器进行识别。
接着后面会用到路径有关的读取函数实现如下:
def getImagesAndLabels(path,detector):
imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
faceSamples = []
ids = []
for imagePath in imagePaths:
PIL_img = Image.open(imagePath).convert('L')
img_numpy = np.array(PIL_img, 'uint8'