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,写的简洁一些了。
|