【目的】在实现视频监控的基础上,加入opencv的人脸检测模型,快速的实现人脸检测功能。
1、到opencv下载训练好的公版模型:opencv/opencv at master (github.com)
下载好后解压,把\opencv-master\data\haarcascades文件下面的xml拷贝到static目录下面:
2、修改视频监控代码如下:
# 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
# face_detect = cv2.CascadeClassifier(r'./static/haarcascade_frontalface_default.xml')
face_detect = cv2.CascadeClassifier(r'./static/haarcascade_frontalcatface.xml')
def get_image_dataurl():
# (1).从摄像头读取数据, 读取成功 ret为True,否则为False,frame里面就是一个三维数组保存图像
ret, frame = cap.read()
# 灰度处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 多个尺度空间进行人脸检测 返回检测到的人脸区域坐标信息
face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=8)
# 绘制矩形和圆形检测人脸
for x, y, w, h in face_zone:
cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
# cv2.circle(frame, center=(x + w // 2, y + h // 2), radius=w // 2, color=[0, 255, 0], thickness=2)
# 显示图片
# (2).先将数组类型编码成 jepg 类型的数据,然后转字节数组,最后将其用base64编码
r, buf = cv2.imencode(".jpeg", frame)
dat = Image.fromarray(np.uint8(buf)).tobytes()
img_date_url = JPEG_HEADER + str(base64.b64encode(dat))[2:-1]
return img_date_url
添加代码后,重新启动服务,打开网页,当图像中出现人脸时就可以检测出来了:
CPU占用情况如下图,占用率非常小。
【小结】tornado的服务+opencv的很快就可以实现人脸检测。而且RK3588处理人脸检测也非常的轻松。
更多回帖