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")
相关推荐
lucas_AI4 小时前
多跳 RAG 不用花大价钱建知识图谱了:纯几何方法,成本为零还更准
人工智能
AIGS0014 小时前
AI问数能问什么问题?——跨ERP、MES的数据一句话查出来,每个数字带出处
人工智能·数字员工·流程优化·智能问数·企业ai落地·ai问数·本体语义
山东孙燕姿4 小时前
前端框架升级:不敢动的组件怎么办
大数据·运维·服务器·网络·人工智能·前端框架
u1301304 小时前
AI 日报(2026年10月23日)
人工智能
瓶瓶持续学习中4 小时前
物理AI与数字孪生如何协同:从三维建模到仿真训练
人工智能
AAA小肥杨4 小时前
大模型量化简介
人工智能·大模型
七牛开发者11 小时前
从 GLM 到 GPT,HarnessPro 如何用 RSI 降低 Agent 成本
人工智能·gpt·agent·harness·rsi
何以解忧唯有撸码11 小时前
c# + YOLODotNet+OpenCVSharp 实现物品轨迹追踪
计算机视觉·c#·winform·yolov8·opencvsharp
跨境卫士-小汪12 小时前
TikTokShop欧洲商品接口架构调整跨境技术团队需要做好哪些准备
大数据·人工智能·新媒体运营·跨境电商·跨境·营销策略
康小汪13 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践