这里的“简单”指的是使用现有的、成熟的第三方库,而不是从零开始编写复杂的机器学习算法,对于初学者和大多数应用场景来说,这是最实际、最高效的方法。

我们将使用 Python 语言和两个非常流行的库:
- OpenCV (
opencv-python):用于图像和视频处理,比如打开摄像头、检测人脸。 face_recognition:这是一个基于dlib的强大库,它封装了复杂的深度学习模型,能非常简单地实现人脸检测和人脸识别(特征编码和比对)。
第一步:安装必要的库
你需要安装这些库,打开你的终端或命令行工具,运行以下命令:
# 安装 OpenCV pip install opencv-python # 安装 face_recognition 库 pip install face_recognition # (可选) face_recognition 的底层依赖 dlib,如果安装 face_recognition 时失败,可能需要单独安装 # Windows: 可能需要下载预编译的 wheel 文件 # macOS: brew install dlib # Linux: sudo apt-get install build-essential cmake libboost-python-dev python3-dev pip install dlib
第二步:准备数据
人脸识别系统需要一个“已知人员”的数据库,这个数据库通常包含:
- 一张或多张每个人的清晰正面照片。
- 照片中人脸的“特征编码”(Embedding),这是一个数学向量,可以代表人脸的独特特征。
我们先来创建一个简单的数据库,在你的项目文件夹下,创建一个名为 known_faces 的文件夹,并在里面放入几张不同人的照片,

known_faces/elon_musk.jpgknown_faces/tim_cook.jpgknown_faces/sundar_pichai.jpg
重要提示:确保照片中的人脸清晰、正面,光照良好,并且只包含一张人脸,这样效果最好。
第三步:编写代码
我们将分两步来写代码:
- 初始化阶段:加载已知照片,计算并存储人脸特征编码。
- 实时识别阶段:打开摄像头,实时捕获画面,检测人脸,并与已知数据库进行比对。
创建一个 Python 文件,face_recognition_app.py,并粘贴以下代码:
import cv2
import face_recognition
import numpy as np
# --- 1. 初始化阶段:加载已知人脸 ---
# 创建一个字典来存储已知人脸的编码和名字
known_face_encodings = []
known_face_names = []
# 指定已知人脸图片的文件夹路径
known_faces_path = "known_faces/"
# 遍历文件夹中的所有图片
for filename in os.listdir(known_faces_path):
if filename.endswith((".jpg", ".jpeg", ".png")):
# 加载图片
image_path = os.path.join(known_faces_path, filename)
image = face_recognition.load_image_file(image_path)
try:
# 获取图片中第一个人脸的编码(假设每张图只有一张人脸)
face_encoding = face_recognition.face_encodings(image)[0]
# 使用文件名(不带扩展名)作为人名
name = os.path.splitext(filename)[0]
known_face_encodings.append(face_encoding)
known_face_names.append(name)
print(f"已加载人脸: {name}")
except IndexError:
print(f"警告: {filename} 中未检测到人脸,已跳过。")
# --- 2. 实时识别阶段:打开摄像头进行实时检测 ---
# 打开默认摄像头 (0)
# 如果你的摄像头是别的编号,可以尝试 1, 2, ...
video_capture = cv2.VideoCapture(0)
while True:
# 读取摄像头的一帧画面
ret, frame = video_capture.read()
if not ret:
print("无法获取摄像头画面,退出。")
break
# 将 BGR 格式的 OpenCV 图像转换为 RGB 格式,因为 face_recognition 使用 RGB
rgb_frame = frame[:, :, ::-1]
# 在当前帧中查找所有人脸的位置
# 返回人脸的边界框列表
face_locations = face_recognition.face_locations(rgb_frame)
# 获取当前帧中所有人脸的编码
face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
# 遍历当前帧中的每一张人脸
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
# 将当前人脸与已知人脸进行比对
# 返回一个布尔值的列表,表示是否匹配
matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=0.5)
name = "Unknown" # 默认名字为 "Unknown"
# 如果找到匹配项
if True in matches:
# 找到所有匹配的索引
matched_indices = [i for i, match in enumerate(matches) if match]
# 获取第一个匹配的名字(如果有多张照片是同一个人,取第一个)
name = known_face_names[matched_indices[0]]
# --- 在画面上绘制结果 ---
# 画一个矩形框住人脸
cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
# 在人脸下方显示名字
cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 255, 0), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (0, 0, 0), 1)
# 显示结果画面
cv2.imshow('Face Recognition', frame)
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头资源并关闭所有窗口
video_capture.release()
cv2.destroyAllWindows()
注意:代码开头需要导入 os 模块,请确保在文件顶部添加 import os。

第四步:运行和测试
- 确保你的电脑已连接摄像头。
- 将准备好的照片放入
known_faces文件夹。 - 运行你的 Python 脚本:
python face_recognition_app.py
- 一个窗口会弹出,显示你的摄像头画面,当你把脸对准摄像头时,程序会检测到你的脸,并在下方标注出它认识的人的名字("elon_musk"),如果它不认识,就会显示 "Unknown"。
按 q 键可以退出程序。
代码详解与扩展
-
face_recognition.face_encodings(image):- 这是核心步骤,它使用一个深度学习模型(ResNet-based)将人脸图像转换成一个 128 维的向量(编码)。
- 这个向量可以看作是这张脸的“数学指纹”,相似的人脸,其向量在空间中的距离也相近。
-
face_recognition.compare_faces(known_encodings, face_encoding, tolerance):- 这个函数会比较当前人脸编码和所有已知编码。
- 它通过计算欧氏距离来判断是否为同一个人。
tolerance参数是阈值,值越小越严格,容错率越低,0.5 是一个不错的起点。
-
cv2.rectangle()和cv2.putText():这是 OpenCV 的基本绘图功能,用于在视频帧上画出矩形框和文字,让结果可视化。
如何扩展这个简单实现?
- 处理多张照片:在上面的代码中,我们假设每张已知照片只有一张人脸,如果你想为同一个人提供多张照片以提高识别率,可以在初始化阶段收集所有照片的编码,并在
compare_faces时,如果当前人脸与这个人的任意一张照片匹配,就认为是他。 - 保存和加载编码:每次启动程序都重新计算已知人脸的编码会很慢,你可以将计算出的编码和名字保存到一个文件(如
json或pickle)中,下次启动时直接加载,跳过计算步骤。 - 处理不同光照和角度:为了提高鲁棒性,可以在初始化时对图片进行一些预处理,如调整大小、转换为灰度图(虽然
face_recognition内部处理了,但可以尝试其他方法),或者使用更多的人脸角度照片。 - 人脸对齐:更高级的系统会先进行人脸对齐,确保检测到的人脸是标准化的,这能显著提升识别准确率。
这个“简单实现”已经涵盖了人脸识别的核心逻辑,通过它,你可以快速搭建一个基础的人脸识别应用,并在此基础上进行更复杂的功能开发。
