65.9K
CodeProject 正在变化。 阅读更多。
Home

AI 社交距离检测器:计算已检测到的人的中心点

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2020 年 12 月 9 日

CPOL

2分钟阅读

viewsIcon

8213

downloadIcon

133

在本文中,我们将计算每个检测到的边界框的中心点,这将作为计算距离的基础。

计算矩形的中心

请记住,我们的应用程序返回检测到的对象列表。该列表中的每个元素都提供标签、矩形(边界框)和识别分数。在这里,我们使用矩形。有两个参数代表它:左上角和右下角。这两个角都由平面中的 x 和 y 坐标组成。

为了计算矩形的中心,我们计算其宽度和高度,然后将每个值除以 2。我将此功能实现在 DistanceAnalyzer 类的 get_rectangle_center 中(请参阅 distance_analyzer.py 文件在 Part_06 文件夹中)。

def get_rectangle_center(rectangle):
    # Get top and bottom right corner of the rectangle
    top_left_corner = rectangle[0]
    bottom_right_corner = rectangle[1] 

    # Calculate width and height of the rectangle
    width = bottom_right_corner[0] - top_left_corner[0]
    height = bottom_right_corner[1] - top_left_corner[1]

    # Calculate and return the center
    center = (int(width/2 + top_left_corner[0]), int(height/2 + top_left_corner[1]))

    return center

如上所述,该函数恢复左上角和右下角,然后执行计算。有了 get_rectangle_center 函数,我又添加了另一个函数 get_rectangle_centers,它遍历检测结果列表。

@staticmethod
def get_rectangle_centers(detection_results):
    # Prepare the list
    rectangle_centers = []

    # Iterate over detection results, and determine center of each rectangle
    for i in range(len(detection_results)):
        rectangle = detection_results[i]['rectangle']            

        center = DistanceAnalyzer.get_rectangle_center(rectangle)

        rectangle_centers.append(center)

    # Return rectangle centers
    return rectangle_centers

为了确保正确计算中心点,我将使用 OpenCV 在视频序列帧上绘制这些位置。

显示边界框的中心

有了矩形中心点列表,我可以使用 OpenCV 的圆形函数在图像上绘制它们。该函数的工作方式类似于矩形,它接受输入图像、圆心、粗细、颜色等作为参数。

以下是使用该函数绘制半径为 15 像素的黄色圆形的示例(请参阅 Part_03 中的 common.py)。我将粗细设置为 -1 以填充圆形。

def draw_rectangle_centers(image, rectangle_centers):        
    for i in range(len(rectangle_centers)):  
        opencv.circle(image, 
            rectangle_centers[i], 
            common.CIRCLE_RADIUS, 
            common.YELLOW, 
            common.THICKNESS_FILL)

上述函数作为图像助手模块中的静态方法实现(请参阅 Part_03/image_helper.py)。

整合

现在我们准备将所有内容放在一起。我们按如下方式实现 main.py 文件

import sys
sys.path.insert(1, '../Part_03/')
sys.path.insert(1, '../Part_05/')

from inference import Inference as model
from image_helper import ImageHelper as imgHelper
from video_reader import VideoReader as videoReader
from distance_analyzer import DistanceAnalyzer as analyzer

if __name__ == "__main__": 
    # Load and prepare model
    model_file_path = '../Models/01_model.tflite'
    labels_file_path = '../Models/02_labels.txt'

    # Initialize model
    ai_model = model(model_file_path, labels_file_path)    

    # Initialize video reader
    video_file_path = '../Videos/01.mp4'
    video_reader = videoReader(video_file_path)

    # Detection and preview parameters
    score_threshold = 0.4    
    delay_between_frames = 5

    # Perform object detection in the video sequence
    while(True):
        # Get frame from the video file
        frame = video_reader.read_next_frame()

        # If frame is None, then break the loop
        if(frame is None):
            break
        
        # Perform detection        
        results = ai_model.detect_people(frame, score_threshold)
        
        # Get centers of the bounding boxes (rectangle centers)
        rectangle_centers = analyzer.get_rectangle_centers(results)

        # Draw centers before displaying results
        imgHelper.draw_rectangle_centers(frame, rectangle_centers)   

        # Display detection results
        imgHelper.display_image_with_detected_objects(frame, results, delay_between_frames)

在配置之前开发的模块的输入路径后,我们初始化 AI 模型并执行推理以检测人员。然后,将结果检测传递给 DistanceAnalyzer 类实例的 get_rectangle_centers。有了中心点列表,我们就在视频帧上绘制它们(draw_rectangle_centers),以及边界框和标签(display_image_with_detected_objects)。运行 main.py 后,您将获得上述结果。

总结

在本文中,我们学习了如何计算视频序列中检测到的人员的中心位置。在下一篇文章中,我们将使用这些中心点来估计人与人之间的距离,并指示距离太近的人员。

© . All rights reserved.