项目布景

  现在一固定场一切相机处于敞开工作状况,在该场一切很多的人员的进出活动,每逢人员的进出时分相机都会有较长时刻继续性不断地拍到进出人员的人脸部分。人员都是逐个进出的。现在需求对该场所的进出人流量进行计算。

需求剖析

  因为设备是一向开端的状况,所以摄像头也会是一向处于启动的状况;那么这儿需求咱们完结一个人脸检测的model进行检测人脸(因为需求完结的使命是人流量计算工作)。

  在这儿咱们的重点在人流量的计算使命,关于人脸检测使命我们可以具体参阅巧借haarcascade系列frontalface_alt2完结人脸检测。我将稍微动下里边的检测代码进行人脸检测,后续的人流量

逻辑剖析

  在这儿我将分为功能模块和事务模块进行剖析。其间的功能逻辑是指对人脸检测的功能;事务逻辑部分是指对人流量计算。在逻辑剖析中我着重讲述人流量计算部分的事务逻辑。

人脸检测功能

  因为在需求剖析中对人脸检测部分提供量参阅部分。这儿对函数的return 新加一个逻辑:当检测到人类的时分(len(faces)>0)对 COUNT 赋值:1 ,其它状况COUNT赋值为:0。其他的函数return 值坚持不变。

def format_image(image):
    if len(image.shape) > 2 and image.shape[2] == 3:
        image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        CASC_PATH = './include/FindFace.xml'  #
        cascade_classifier = cv2.CascadeClassifier(CASC_PATH)
        faces = cascade_classifier.detectMultiScale(image, scaleFactor=1.1, minNeighbors=5)
    # 假如图片中没有检测到人脸,则返回None
    if not len(faces) > 0:
        return None, None, 0
    max_are_face = faces[0]
    for face in faces: # 在一切人脸中选一张最大的脸
        if face[2] * face[3] > max_are_face[2] * max_are_face[3]:
            max_are_face = face
    face_coor = max_are_face
    image = image[face_coor[1]:(face_coor[1] + face_coor[2]), face_coor[0]:(face_coor[0] + face_coor[3])]
    if len(faces) > 0:
        COUNT = 1
    else:COUNT  = 0
    return image, face_coor, COUNT

人流量计算功能

  进行计算人流量的进程中,相机是一向处于在获取实时画面的那么咱们的人脸检测函数同样是一向在执行的,这儿需求解决的一个问题就是:“每逢人员的进出时分相机都会有较长时刻继续性不断地拍到进出人员的人脸部分”
  相机可以长时刻继续性不断地拍到人脸,这儿既确保了人脸检测的精度(确保画面部分满意了人脸检测部分),可是咱们在事务逻辑这儿就有一个问题需求考虑的了,因为被检测的人的人脸是一向处于被检测的状况,可是咱们的检测函数又是一向处于运行状况,那么咱们就需求对一段检测到人脸的进程只对人脸总数+1操作 即可。

  规划的时分需求个给定一个状况值它的初始状况赋值为0同时对人脸总数初始状况也为0,当没有检测到人脸的时分状况值坚持为0,当检测到人脸的时分对人脸总数+1,此刻需求更改状况值了,更改状况后下一次的检测结果为1时(即:检测到了人脸)就会与状况值相同,从而不会对一段视频中的人脸检测进程中一向对人脸总数+1了。

示例检验思路demo

RawNum = 0  # 初始状况值&状况值
LabNum = 0  # 人脸总数
while True:
    a = int(input("请输入检测到的值:"))
    if RawNum != a:
        RawNum = a
        if a == 1:
            LabNum += 1
    else:
        RawNum = a
    print("此刻的检测到的人脸总数", LabNum)

总结

   在这儿咱们初步完结了人脸检测部分与人流量计算部分,其间难免有忽略的部分,还望我们多多指正。

完整事务逻辑代码

if __name__ == "__main__":
    capture = cv2.VideoCapture(0)
    fps = 0.0
    RawData = 0
    lab_num = 0
    while 1:
        t1 = time.time()
        # 读取某一帧
        ref, frame = capture.read()
        # 格式改变,BGRtoRGB
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        # 进行检测
        (p_image, face_coor, COUNT) = format_image(frame)
        if COUNT != RawData:
            RawData = COUNT
            if COUNT == 1:
                lab_num += 1
        else:
            RawData = COUNT
        if face_coor is not None:
            # 获取人脸的坐标,并用矩形框出
            [x, y, w, h] = face_coor
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 1)
        frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
        fps = (fps + (1. / (time.time() - t1))) / 2
        cv2.putText(frame, "fps= %.2f" % fps, (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
        cv2.putText(frame, "face_num= %.1f" % lab_num, (0, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
        cv2.imshow("video", frame)
        c = cv2.waitKey(1) & 0xff
        if c == 27:
            capture.release()
            break
    capture.release()
    cv2.destroyAllWindows()

示例视频

继续创作,加速生长!这是我参加「日新计划 10 月更文挑战」的第15天,点击查看活动概况