我正在为我的本科论文编写一个应用程序,该应用程序从根本上允许使用 OpenCV 库跟踪视频源中的多个对象。为了进一步发展这个想法,我希望能够在屏幕上画一条线,显示边界框在我正在跟踪的对象周围的历史记录。
我注意到没有排序用于执行此操作的内置函数,因此任何有关制作此类内容的指针都会有用,因为网上关于此主题的信息不多。
在 OpenCV 中没有内置函数可以在边界框后绘制轨迹线。但是,可以使用 OpenCV 函数和一些 Python 代码轻松实现这一点。以下是如何操作:
import cv2
# 初始化一个列表来存储边界框历史记录
bbox_history = []
# 定义要绘制的轨迹线颜色(例如,绿色)
trail_color = (0, 255, 0)
# 打开视频流
cap = cv2.VideoCapture(0)
while True:
# 从流中读取帧
ret, frame = cap.read()
# 在这里执行对象检测(例如,使用 YOLO、Haar Cascades 等)
# ...
# 假设获得了名为 'bbox' 的检测到的对象的边界框坐标
# bbox = [x, y, w, h]
# 将边界框添加到历史记录列表中
bbox_history.append(bbox)
# 绘制轨迹线
for i in range(1, len(bbox_history)):
# 从历史记录中获取前一个和当前的边界框坐标
prev_bbox = bbox_history[i-1]
curr_bbox = bbox_history[i]
# 计算边界框中心点的坐标
prev_center = (prev_bbox[0] + prev_bbox[2] // 2, prev_bbox[1] + prev_bbox[3] // 2)
curr_center = (curr_bbox[0] + curr_bbox[2] // 2, curr_bbox[1] + curr_bbox[3] // 2)
# 在两个中心点之间画一条线
cv2.line(frame, prev_center, curr_center, trail_color, 2)
# 在帧上绘制当前边界框
cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[0]+bbox[2], bbox[1]+bbox[3]), (255, 0, 0), 2)
# 显示结果帧
cv2.imshow("Object Tracking", frame)
# 按 'q' 退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
这段代码通过将每个检测到的边界框存储到一个列表中来工作,从而维护边界框的历史记录。然后,它遍历历史记录并在每个连续的边界框中心点之间画一条线,从而有效地创建了一个轨迹线。
可以根据需要调整轨迹线的颜色和厚度。此外,可以通过实现一种机制来限制历史记录列表的大小,以防止其无限增长,从而潜在地优化代码。这可以通过使用
del
关键字删除旧的边界框条目,或者通过使用具有最大大小的
collections.deque
来实现。