首页 > 技术知识 > 正文

上一篇文章AI社交距离检测器:在视频帧中检测人我们学习了如何在视频帧中去除并不是人的对象,检测特定目标对象,以便只检测人这个对象。

在本文中,将计算每个对象边界框中心点的位置,这将作为计算距离的基础。

到目前为止,我们学习了如何检测人和找到包围框来指示人们的位置。通常,可以使用边界框的最近顶点来估计距离,但是为了保持准确性,我使用边界框的中心,如下图所示。然后,我用Euclidean(欧几里德公式)计算了它们之间的距离。

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

矩形中心的计算

当前应用程序可以返回检测对象的列表,该列表中的每个元素都提供标签、矩形(边框)和识别信任值。下面就使用矩形的左上角和右下角来计算中心点。

为了计算矩形的中心,我们计算它的宽度和高度,然后将它们除以2:

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像素的黄色圆圈的示例。我把厚度设为-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)

上面的函数是作为Image_helper模块中的静态方法实现的。

把东西放在一起

我们现在已经准备好把一切都整合在一起。我们实现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后,您将得到上述结果。

总结

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

猜你喜欢