【New direction】人脸追踪Tips 附原文代码

Face tracking

Opencv tips

1.opencv-python 模块从清华镜像导入
代码操作:打开cmd,输入下面命令。

pip install -i https://mirrors.tuna.tsinghua.edu.cn/simple  opencv-python

Tips1:PIL与CV2读取的方法不一样,注意类型,一个是ndarry另一个是np类型。
Tips2:opencv的图像矩阵与我们所见的不同,即原图像矩阵转置之后。
即为方便矩阵运算用。

Method——Adaptive embedded image tracking

1、模块加载部分:

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

2、识别框嵌入文字方法(这里我参考了别人的代码)

def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=2):
    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型,因为PIL与CV2读取的方法不一样,注意类型,一个是ndarry另一个是np类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 创建绘图对象
    draw = ImageDraw.Draw(img)
    # 嵌入字体的格式
    fontStyle = ImageFont.truetype(
        "simsun.ttc", textSize, encoding="utf-8")
    # draw对象上绘制文本
    draw.text((left, top), text, textColor, font=fontStyle)
    # 最后转换为OpenCV格式
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

3、设计模型加载器,其内部包含定义电脑摄像头(外部摄像头的参数为0),设计加载人脸识别模型对象,并加载该对象。

capture= cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml') # 加载人脸特征库
face_cascade.load('haarcascade_frontalface_default.xml')

4、定义循环并在后台输出人脸具体信息及人脸出现个数。
Tips:图像融合方法我参考了一下论坛的,有人采用的融合方法过于复杂化,这里opencv的addWeighted方法可以将两张图片根据用户定义权重进行比例融合,其内部的计算方法就是线性函数式相加,时间复杂度较之论坛上的方法更为高效。

while (True):
    ret, frame = capture.read()  # 读取每一帧的图像
    faces = face_cascade.detectMultiScale(frame, scaleFactor=1.15, minNeighbors=5, minSize=(5, 5))  # 检测人脸
    sum_num=0
    for (x, y, w, h) in faces:
        sum_num=sum_num+1 #对每一帧人脸计数(人脸计数器)
        focus = cv2.imread("focus.png")
        focus=cv2.resize(focus,(h,w),interpolation=cv2.INTER_NEAREST)# opencv的图像矩阵与我们所见的不同,即原图像矩阵转置之后。
        try:
            frame[ y:y + h,x:x + w] = cv2.addWeighted(focus[0:h,0:w], 0.2, frame[ y:y + h,x:x + w], 0.8, 0)#图像融合
        except cv2.error:
            continue
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 用矩形圈出人脸1
        frame=cv2ImgAddText(frame, "锁定目标 focus", x+w/4, y-40, (0, 255, 0), 20)
        print(str(x) + ' ' + str(y) + ' ' + str(w) + ' ' + str(h))

    print("当前出现"+str(sum_num)+"人")
    cv2.namedWindow('Face Recognition',0)
    cv2.imshow('Face Recognition', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

5、关闭摄像头并销毁所有opencv窗口对象。

capture.release()  # release# 摄像头
cv2.destroyAllWindows()

实验效果如下:
在这里插入图片描述
在这里插入图片描述
请添加图片描述
Vote,写的简洁一些了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炼丹小白师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值