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")
相关推荐
程序员cxuan1 分钟前
Cursor 掀桌子了,Grok 4.5 这次要上天了?
人工智能·后端·程序员
2zcode6 分钟前
基于MATLAB同态滤波的医学图像增强系统设计与实现
开发语言·计算机视觉·matlab
沪漂阿龙10 分钟前
大模型网关框架与工程落地
人工智能
量化吞吐机15 分钟前
近期AI量化开发,先跑最小流程再谈复杂功能
人工智能·python
hengcaib23 分钟前
2026年本地生活智能电话系统推荐哪个好?
人工智能·生活
智写-AI29 分钟前
推荐一下好用的降英文AI工具工具
人工智能·python
tq108640 分钟前
市场比资本主义更深刻——从主体、市场与制度三个层次理解人类社会
人工智能
岁月宁静41 分钟前
DeepSeek Harness 团队 招聘 :JD反推:新手如何系统掌握AI Agent开发技术?
前端·人工智能·后端
本王是暴君1 小时前
AutoMem:把 Agent Memory 变成可训练的记忆管理技能
人工智能·算法·数据挖掘
2601_963016261 小时前
统一消息与事件调用:如何用微信接口把微信自动化做成稳健中台?
大数据·运维·人工智能·微信·自动化