视频序列中检测对象中心点的计算

在视频分析和处理中,检测视频中的对象并计算其位置是常见的任务。本文将介绍如何计算视频序列中检测到的对象的中心点,并使用这些中心点来估计人与人之间的距离。将使用Python编程语言和OpenCV库来实现这一功能。

计算边界框中心点

目标检测任务中,检测到的对象通常由边界框(bounding box)表示。边界框由两个参数定义:左上角和右下角。这两个参数都由平面上的x和y坐标组成。要计算边界框的中心,需要计算其宽度和高度,然后将每个值除以2。

以下是计算边界框中心点的Python代码示例:

def get_rectangle_center(rectangle): # 获取矩形的左上角和右下角 top_left_corner = rectangle[0] bottom_right_corner = rectangle[1] # 计算矩形的宽度和高度 width = bottom_right_corner[0] - top_left_corner[0] height = bottom_right_corner[1] - top_left_corner[1] # 计算并返回中心点 center = (int(width/2 + top_left_corner[0]), int(height/2 + top_left_corner[1])) return center

上述函数首先获取矩形的左上角和右下角坐标,然后计算矩形的宽度和高度,最后计算中心点坐标。

批量计算边界框中心点

为了批量处理检测结果,可以实现一个函数来迭代检测结果列表,并计算每个矩形的中心点。

@staticmethod def get_rectangle_centers(detection_results): # 准备列表 rectangle_centers = [] # 迭代检测结果,确定每个矩形的中心 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

这个函数通过迭代检测结果列表,使用之前定义的get_rectangle_center函数来计算每个矩形的中心点,并将这些中心点存储在列表中。

在图像上显示中心点

有了矩形中心点的列表后,可以使用OpenCV的circle函数在图像上绘制这些位置。这个函数类似于绘制矩形,接受输入图像、圆心、厚度、颜色等参数。

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)

上述函数在图像上为每个中心点绘制一个黄色的圆圈,圆圈的半径为15像素,并将厚度设置为-1以填充圆圈。

整合所有功能

现在已经准备好将所有功能整合到一起。以下是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__": # 加载并准备模型 model_file_path = '../Models/01_model.tflite' labels_file_path = '../Models/02_labels.txt' # 初始化模型 ai_model = model(model_file_path, labels_file_path) # 初始化视频读取器 video_file_path = '../Videos/01.mp4' video_reader = videoReader(video_file_path) # 检测和预览参数 score_threshold = 0.4 delay_between_frames = 5 # 在视频序列中执行对象检测 while True: # 从视频文件中获取帧 frame = video_reader.read_next_frame() # 如果帧为None,则跳出循环 if frame is None: break # 执行检测 results = ai_model.detect_people(frame, score_threshold) # 获取边界框的中心点(矩形中心) rectangle_centers = analyzer.get_rectangle_centers(results) # 在显示结果之前绘制中心点 imgHelper.draw_rectangle_centers(frame, rectangle_centers) # 显示检测结果 imgHelper.display_image_with_detected_objects(frame, results, delay_between_frames)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485