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





5.00/5 (1投票)
在本文中,我们将计算每个检测到的边界框的中心点,这将作为计算距离的基础。
计算矩形的中心
请记住,我们的应用程序返回检测到的对象列表。该列表中的每个元素都提供标签、矩形(边界框)和识别分数。在这里,我们使用矩形。有两个参数代表它:左上角和右下角。这两个角都由平面中的 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 后,您将获得上述结果。
总结
在本文中,我们学习了如何计算视频序列中检测到的人员的中心位置。在下一篇文章中,我们将使用这些中心点来估计人与人之间的距离,并指示距离太近的人员。