在视频分析和处理中,检测视频中的对象并计算其位置是常见的任务。本文将介绍如何计算视频序列中检测到的对象的中心点,并使用这些中心点来估计人与人之间的距离。将使用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)