背景
前日在刷视频的时候看到的
我觉得很有意思,简单实现一下
实现
第一步:实现实时获取摄像头图像
本次使用的是python的OpenCV库,引用
# 导入OpenCv人脸识别库
import cv2
因为我们要实现的是人脸追踪,所以需要导入OpenCV自带的人脸识别特征
# 读取人脸模型特征
face_cascade = cv2.CascadeClassifier(
'C:/Users/zhaowh/anaconda3/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
这个具体位置网上有教程可以自行搜索,因为我用的是Anaconda,所以大概在这个位置(推荐这个Anaconda,非常好用)
因为我们实现的是实时的识别追踪,所以需要使用摄像头
# 获取摄像头
cap = cv2.VideoCapture(0)
然后就是基本的循环了
while True:
# 显示窗口
cv2.imshow('Face Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 使用release()方法释放摄像头,并使用destroyAllWindows()方法关闭所有窗口
cap.release()
cv2.destroyAllWindows()
第二步:识别人脸并实时标记
首先读取帧
ret, frame = cap.read()
将图片格式转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
然后通过特征模型进行人脸识别
faces_rects = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
输出后可以发现,faces_rects的值在未识别到人脸时为空,识别到人脸是为一个数组
分析可以发现,这四个数字分别表示人脸的x,y,w,h坐标
因此我们写一个for循环,不断的刷新人脸数据,然后在其内部绘制图像
for (x, y, w, h) in faces_rects:
······
放置实时坐标文本
cv2.putText(frame, "X:"+str(x)+" Y:"+str(y), (3, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
在人脸处绘制一个矩形
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
计算人脸中心位置
face_center = (x + w // 2, y + h // 2)
在其中心位置画一个圆形
cv2.circle(frame, face_center, 10, (0, 0, 255), -1)
全部代码
import cv2
face_cascade = cv2.CascadeClassifier(
'C:/Users/zhaowh/anaconda3/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if ret:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces_rects = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
for (x, y, w, h) in faces_rects:
cv2.putText(frame, "X:"+str(x)+" Y:"+str(y), (3, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
face_center = (x + w // 2, y + h // 2)
cv2.circle(frame, face_center, 10, (0, 0, 255), -1)
cv2.imshow('Face Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
目录