用Python语言写一个人脸识别系统
时间: 2023-05-24 07:02:52 浏览: 121
A:
实现一个简单的人脸识别系统,需要经过以下步骤:
1. 安装OpenCV库,它是一个计算机视觉库,可以帮助我们处理图像和视频。使用pip install opencv-python即可安装。
2. 实现人脸检测,使用OpenCV中已经训练好的Haar级联检测器,该检测器利用基础的Haar特征对图像进行分类,从而识别人脸。代码如下:
```python
import cv2
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()
```
其中,haarcascade_frontalface_default.xml是OpenCV自带的人脸检测器,可通过安装包中的文件找到。
3. 实现人脸识别,可以使用OpenCV中的人脸识别器来训练和识别人脸。首先需要准备好训练数据集,用来训练识别器。使用下列代码进行训练:
```python
import cv2
import os
data_path = 'faces'
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
recognizer = cv2.face.LBPHFaceRecognizer_create()
def get_images_and_labels():
images = []
labels = []
for subdir, dirs, files in os.walk(data_path):
for file in files:
if file.endswith('.jpg'):
faces = []
img_path = os.path.join(subdir, file)
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
img_roi = gray[y:y+h, x:x+w]
images.append(img_roi)
labels.append(int(subdir.split('/')[-1]))
return images, labels
images, labels = get_images_and_labels()
recognizer.train(images, np.array(labels))
recognizer.write('trainer.yml')
```
其中,函数get_images_and_labels()会遍历数据集目录中的所有图片,将每张图片中的人脸截取出来,并将其转为灰度图像,最后保存到一个images的列表中。每个人脸对应一个标签,标签用子目录名表示,由os.walk方法遍历得到。用这些人脸图像和对应的标签进行训练,得到一个trainer.yml文件,这个文件包含了人脸识别器的训练结果和参数。
4. 使用训练结果进行人脸识别。下列代码可以实现用训练数据中的人脸来进行识别:
```python
import cv2
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer.yml')
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
img_roi = gray[y:y+h, x:x+w]
label, confidence = recognizer.predict(img_roi)
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.putText(img, str(label), (x, y-10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()
```
在检测到人脸的位置上,将该位置的图像截取出来,送入训练得到的人脸识别器进行预测。预测结果即为识别的标签和置信度,将标签和置信度打印到图片上,可用于验证识别效果。
总的来说,以上代码实现了一个简单的人脸识别系统,需要提前准备好训练数据集,才能进行模型的训练和测试。
阅读全文