OpenCV的应用:简单的人脸识别和检测

一.基础

人脸检测是计算机视觉领域的基础任务,核心目标是从图像或视频帧中自动定位并识别出人脸区域(通常用矩形边界框标记),不涉及身份识别,仅关注 "是否存在人脸" 及 "人脸在哪里"。其原理可分为传统方法现代深度学习方法两大体系,核心逻辑是 "特征提取 + 分类判断",但具体实现差异较大。

通用流程:从图像到人脸框的核心步骤

无论传统方法还是深度学习方法,人脸检测的基本流程可概括为以下四步:

  1. 图像预处理:统一输入格式(如灰度化、尺寸归一化),减少干扰信息(如降噪);
  2. 候选区域生成:通过滑动窗口、特征响应等方式,筛选出可能含有人脸的区域;
  3. 特征提取:从候选区域中提取能表征 "人脸" 的关键特征(如五官分布、边缘纹理等);
  4. 分类判断:通过分类器判断候选区域是否为人脸,最终输出所有为人脸的边界框。

二.实现

OpenCV中自带已训练好的检测器,包括面部、眼睛、猫脸等,都保存在xml文件中,通过以下方式找到他们

python 复制代码
import cv2 as cv
print(cv.__file__)

利用这些文件来识别人脸,眼睛等。检测流程如下:

1.读取图片,并转化成灰度图

2.实例化人脸和眼睛检测的分类器对象

#1实例化级联分类器

classifier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

#加载分类器

classifier.load("haarcascade_frontalface_default.xml")

3.进行人脸和眼睛的识别检测

rect = classifier.detectMultScale(gray,scaleFactor,minNeighbors,minSize,maxsize)

**gray:**要进行检测的人脸图片

**scaleFactor:**前后俩次扫描中,搜索窗口的比例系数

**minNeighbors:**目标被检测的次数才会被认为是检测的目标

**minSize,maxsize:**目标的最小尺寸和最大尺寸

4.将目标检测结果绘制出来

5.主程序

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

# 1.以灰度图的形式读取图片
img = cv.imread("C:\\Users\\JWTV\\Desktop\\111.png")
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 2.实例化OpenCV人脸和眼睛识别的分类器
face_cas = cv.CascadeClassifier("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")
face_cas.load('E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')
eyes_cas = cv.CascadeClassifier("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml")
eyes_cas.load("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml")

# 3.调用识别人脸
faceRects = face_cas.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
for faceRect in faceRects:
    x, y, w, h = faceRect
    # 框出人脸
    cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
    # 4.在识别出的人脸中进行眼睛的检测
    roi_color = img[y:y + h, x:x + w]
    roi_gray = gray[y:y + h, x:x + w]
    eyes = eyes_cas.detectMultiScale(roi_gray)
    for (ex, ey, ew, eh) in eyes:
        cv.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

# 检测结果的绘制
plt.figure(figsize=(8, 6), dpi=100)
plt.imshow(img[:, :, ::-1]), plt.title('result')
plt.xticks([]), plt.yticks([])
plt.show()

6.在视频中也可以进行类似的操作

python 复制代码
import cv2 as cv
import matplotlib.pyplot as plt
# 1.读取视频
cap = cv.VideoCapture("C:\\Users\\JWTV\\Desktop\\111.png")
# 2.在每一帧数据中进行人脸识别
while(cap.isOpened()):
    ret,frame = cap.read( )
    if ret==True:
        gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
        # 3.实例化OpenCV人脸识别的分类器
        face_cas = cv.CascadeClassifier("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")
        face_cas.load('E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')
        #4.调用识别人脸
        faceRects =face_cas.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32, 32))
        for faceRect in faceRects:
            x,y,w,h = faceRect
        # 框出人脸
            cv.rectangle(frame,(x,y),(x + h,y + w) , (0,255,0),3)
        cv.imshow("frame",frame)
        if cv.waitKey(1) & 0xFF == ord('q') :
            break
#5.释放资源
cap.release()
cv.destroyAllWindows()
相关推荐
叠层归一研究院25 分钟前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
IT_陈寒27 分钟前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
why-geo35 分钟前
Hermes Agent 与 Python 的会产生什么样的碰撞
人工智能·python·ai编程
正经教主43 分钟前
【FDE系列】阶段2:Day 29:FastAPI 进阶 — Pydantic 模型与完整 CRUD 实战
人工智能·python·fde
时速GEO系统1 小时前
初元 AI V1.1 版本升级,首个正式版发布一周・实现生成、部署、上线、优化全流程自动化闭环
人工智能·数据挖掘·node.js
咕泡科技1 小时前
咕泡科技FDE系列最新产品重磅发布!
人工智能·大模型·ai落地·fde·前沿部署工程师
犀利豆1 小时前
为什么全世界的 AI 都画不好一只骑自行车的鹈鹕
人工智能·llm·aigc
天天被压力1 小时前
【跨市场数据实战 #08】可转债折价机会怎么筛:3个接口抓比价、列表和实时盘口
java·人工智能·python
baopixiaoz2 小时前
BeeQuant × BeeAgent:用AI加速策略验证
大数据·人工智能·python·区块链
咸鱼老弟2 小时前
AI Agent 的"自主性悖论"——为什么给它的自由度越大,越要配一套更硬的护栏
前端·人工智能