OpenCV 案例三【人脸比对】

目录:

一、环境准备

1、Anaconda 环境配置

环境配置参考前面章节:

OpenCV 案例一【人脸检测】

2、添加依赖

powershell 复制代码
conda install -c conda-forge cmake pip
conda install -c conda-forge dlib
conda install -c conda-forge face_recognition

捋一下几个module的关系:

  • 主要用到 face_recognition,调用其中的api接口,完成人脸比对
  • face_recognition 的核心,来自于C++编写的 dlib库
  • 下载 dlib后,需要用到 c++编译工具进行编译,就用到了 cmake
  • pip ,pip 是 Python 的包管理工具‌,用于安装、管理和维护 Python 第三方库

二、代码案例

python 复制代码
import face_recognition
import cv2
import matplotlib.pyplot as plt
import time

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False# 正常显示负号


def face_comparison():
    print("开始加载图片...")
    source_image = face_recognition.load_image_file("datas/images/kobe_1.jpeg")
    target_image = face_recognition.load_image_file("datas/images/kobe_2.jpg")
    load_time = time.time()

    # 使用HOG模型进行快速人脸检测
    source_image_face_locations = face_recognition.face_locations(source_image, model="hog")
    target_image_face_locations = face_recognition.face_locations(target_image, model="hog")
    detection_time = time.time()
    print(f"人脸检测完成,耗时: {detection_time - load_time:.2f}秒")

    ifnot source_image_face_locations:
        print("图片1中未检测到人脸")
        return
    ifnot target_image_face_locations:
        print("图片2中未检测到人脸")
        return

    # 获取人脸编码
    print("正在提取人脸特征...")
    source_image_face_encodings = face_recognition.face_encodings(source_image, source_image_face_locations)
    target_image_face_encodings = face_recognition.face_encodings(target_image, target_image_face_locations)
    encoding_time = time.time()
    print(f"特征提取完成,耗时: {encoding_time - detection_time:.2f}秒")

    # 只比较第一个人脸
    source_face = source_image_face_encodings[0]
    target_face = target_image_face_encodings[0]

    # 比较人脸
    distance = face_recognition.face_distance([source_face], target_face)[0]
    is_match = distance < 0.6

    print("\n" + "=" * 50)
    print("人脸比对结果:")
    print("=" * 50)
    print(f"人脸距离: {distance:.4f}")
    print(f"是否匹配 (阈值0.6): {is_match}")
    print(f"相似度: {(1 - distance) * 100:.1f}%")

    if is_match:
        print("识别结果:是同一个人!")
    else:
        print("识别结果:不是同一个人!")

    # 绘制人脸框
    known_with_boxes = source_image.copy()
    for top, right, bottom, left in source_image_face_locations:
        cv2.rectangle(known_with_boxes, (left, top), (right, bottom), (0, 255, 0), 2)

    unknown_with_boxes = target_image.copy()
    for top, right, bottom, left in target_image_face_locations:
        cv2.rectangle(unknown_with_boxes, (left, top), (right, bottom), (0, 255, 0), 2)

    plt.figure(figsize=(12, 5))

    plt.subplot(1, 2, 1)
    plt.imshow(known_with_boxes)
    plt.title(f"图片1 - {len(source_image_face_locations)}人脸")
    plt.axis('off')

    plt.subplot(1, 2, 2)
    plt.imshow(unknown_with_boxes)
    plt.title(f"图片2 - {len(target_image_face_locations)}人脸")
    plt.axis('off')

    plt.tight_layout()
    plt.show()


if __name__ == "__main__":
    face_comparison()

三、运行结果



重点分析:

代码里面用的是 HOG 模型,出结果比较快,但是准确度可能不会太高。

也可以换成 CNN 模型,就是在代码里面改成:

python 复制代码
face_recognition.face_locations(source_image, model="cnn")
相关推荐
一点一木39 分钟前
深度体验TRAE SOLO移动端7天:作为独立开发者,我把工作流揣进了兜里
前端·人工智能·trae
Lee川2 小时前
mini-cursor 揭秘:从 Tool 定义到 Agent 循环的完整实现
前端·人工智能·后端
weelinking2 小时前
【产品】00_产品经理用Claude实现产品系列介绍
数据库·人工智能·sql·数据挖掘·github·产品经理
Agent产品评测局2 小时前
制造业模具管理AI系统,主流产品能力对比详解:2026年智能制造选型深度洞察
人工智能·ai·chatgpt·制造
研华科技Advantech3 小时前
如何用一套实训设备,打通工业AI预测性维护技术全流程?
人工智能
Lab_AI3 小时前
AI for Science: MaXFlow AI Agent+ 报告体验双升级,让AI智能体更高效易用!
人工智能·ai for science·ai agent·ai智能体
李坤3 小时前
让 Codex 和 Claude 互相 Review:告别手动复制
人工智能·openai·claude
南屹川3 小时前
【API设计】GraphQL实战:从REST到GraphQL的演进
人工智能
KJ_BioMed3 小时前
当计算生物学遇上生成式AI:从头设计生物分子的“新范式”初探
人工智能·从头设计·生命科学·生物医药·科研干货·科晶生物
明月醉窗台3 小时前
深度学习(17)YOLO训练中的超参数详解
人工智能·深度学习·yolo