OpenCV 人脸检测及运动追踪

实验内容:

  • 通过笔记电脑摄像头进行逐帧的人脸检测,检测其中出现的人脸(可出现多个人脸);
  • 根据检测出的人脸,对其运动进行人脸追踪;
  • 对检测结果进行后处理,将结果在图像中进行标注,并实时播放。

实验思路

通过opencv人脸库特征进行人脸检测,获取人脸位置参数,通过人脸中心点的变化进行运动追踪

核心代码说明:

全局变量说明

# 运动点坐标列表
point_array = []
# 每张人脸运动点最大存储量
point_max = 15

打开摄像头,也可以替换为视频流

cap = cv.VideoCapture(0)

设置镜头宽度和高度

cap.set(cv.CAP_PROP_FRAME_WIDTH,800)
cap.set(cv.CAP_PROP_FRAME_HEIGHT,640)

人脸检测,获取人脸位置参数

faces = face_detector.detectMultiScale(gray_image)

加载本地opencv的人脸库特征

face_detector = cv.CascadeClassifier(
        "D:\Anaconda\envs\PyTorch\Lib\site-packages\cv2\data"
        "/haarcascade_frontalface_default.xml")

标出每个人脸位置

for x,y,w,h in faces:
        cv.rectangle(image, (x,y),(x+w,y+h), color=(0,0,255), thickness=2)
        cv.putText(image,"face",(x,y),cv.FONT_HERSHEY_SIMPLEX, 0.75, (0,0,255), 2)

每一帧人脸中心位置,追踪中心点的变化

point_array.append([int((x+x+w)/2),int((y+y+h)/2)])

确保运动点不超过设定上限(point_max)

if (len(faces)*point_max) < len(point_array):
            point_array = point_array[len(faces)::]

源代码

import cv2 as cv

# 运动点坐标列表
point_array = []
# 运动点最大存储量
point_max = 15

def face_detect(image):
    global point_array
    global point_max
    
    # 灰度转换
    gray_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    
    # 加载库特征
    face_detector = cv.CascadeClassifier(
        "D:\Anaconda\envs\PyTorch\Lib\site-packages\cv2\data"
        "/haarcascade_frontalface_default.xml")

    # 调用内置检测函数
    faces = face_detector.detectMultiScale(gray_image)
    
    # 人脸检测
    for x,y,w,h in faces:
        cv.rectangle(image, (x,y),(x+w,y+h), color=(0,0,255), thickness=2)
        cv.putText(image,"face",(x,y),cv.FONT_HERSHEY_SIMPLEX, 0.75, (0,0,255), 2)
        
        # 添加新的运动点
        point_array.append([int((x+x+w)/2),int((y+y+h)/2)])
        # 存储运动点达到设定上限
        if (len(faces)*point_max) < len(point_array):
            #删除前len(faces)个元素
            point_array = point_array[len(faces)::]
            
    # 运动追踪      
    for x,y in point_array:
        cv.circle(image,(x,y),2,(255,0,0),3)


# 打开摄像头
cap = cv.VideoCapture(0)
# 设置宽度和高度
cap.set(cv.CAP_PROP_FRAME_WIDTH,800)
cap.set(cv.CAP_PROP_FRAME_HEIGHT,640)

while True:
    # 每次读取一帧摄像头或者视频
    flag, image = cap.read()
    
    # 检测摄像头识别到的人脸
    face_detect(image)

    # 输出显示
    cv.imshow('result',image)
    
    #ESC关闭,ESC键值为27
    if(cv.waitKey(1)&0xff) == 27:
        break
    
#释放资源
cap.release()
cv.destroyAllWindows()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值