1、概述
最近看到一个很简洁的人脸检测代码,很感兴趣,想尝试是不是可以在线对人脸检测并对人数统计,比如在商场的出入口,学校的出入口等,因为我本身对人脸检测研究少,但知道有很多人脸检测方法。写这个博客是为了记录自己的实验,后续可能继续会基于其他人脸检测方法实现自己的想法。本文基于前辈文章暂时实现实时访问摄像头IP并尝试在线检测人脸。
2、代码实现
首先要安装两个库:
opencv-python
cvlib
原代码:
import cv2
import cvlib as cv
img = cv2.imread('000000011699.jpg')
cv2.imshow('img', img)
cv2.waitKey()
faces, confidences = cv.detect_face(img)
# 循环遍历检测到的人脸并添加边界框
for face in faces:
(startX, startY) = face[0], face[1]
(endX, endY) = face[2], face[3]
# 在人脸上绘制矩形边界框
cv2.rectangle(img, (startX, startY), (endX, endY), (0, 255, 0), 2)
# 显示结果
cv2.imshow('img_detect', img)
cv2.waitKey()
检测图片为:
检测结果为:
人脸在线检测代码:
from threading import Thread
from collections import deque
import cv2
import cvlib as cv
#################################################
# 摄像头IP地址
url='rtsp://admin:[email protected]'
def producer(cap, q):
while True:
print('producer execuation')
if cap.isOpened():
ret, img = cap.read()
q.append(img)
def consumer(q):
while True:
if len(q) == 0:
pass
else:
img = q.pop()
print('consumer execuation')
faces, confidences = cv.detect_face(img)
# 循环遍历检测到的人脸并添加边界框
for face in faces:
(startX, startY) = face[0], face[1]
(endX, endY) = face[2], face[3]
# 在人脸上绘制矩形边界框
cv2.rectangle(img, (startX, startY), (endX, endY), (0, 255, 0), 2)
# 显示结果
cv2.imshow('img', img)
cv2.waitKey(1)
if __name__ == '__main__':
frame_deque = deque(maxlen=10)
cap = cv2.VideoCapture(url)
p1 = Thread(target=producer, args=(cap, frame_deque))
p2 = Thread(target=consumer, args=(frame_deque,) )
p1.start()
p2.start()
p1.join()
p2.join()
3、后记
由于手上测试的环境是安装在天花板上的鱼眼摄像头,成像图片为俯视图,人脸在其中占比较小,而自己在单张测试时的图片,人脸清晰、在图像中占比较大而且是正视图;自己在线跑起来发现检测不到人脸,记录于此,后续继续研究。