计算机视觉——Opencv(物体跟踪)

发布时间:2026/7/3 7:53:02

计算机视觉——Opencv(物体跟踪) 什么是物体跟踪物体跟踪Object Tracking是指在视频序列中对预先选定的目标物体进行连续的位置定位输出目标在每一帧中的坐标、尺寸信息。与目标检测不同目标检测逐帧独立识别画面中的所有目标无前后帧关联物体跟踪仅初始化时选定目标后续通过帧间关联算法持续追踪速度更快、资源消耗更低。简单来说检测是 “找目标”跟踪是 “跟目标”。OpenCV 内置跟踪器对比OpenCV 3.x 及以上版本内置了多种经典跟踪器适配不同场景核心跟踪器特性如下跟踪器类型核心优势局限性适用场景BOOSTING算法简单兼容性强速度慢遮挡后易丢失低分辨率、简单场景MIL精度较高抗轻微遮挡速度一般无法处理快速运动静态目标、慢速运动目标KCF速度极快精度高无法处理完全遮挡、尺度变化实时性要求高的场景CSRT精度极高抗遮挡、抗尺度变化速度较慢高精度要求、复杂场景MEDIANFLOW运动轨迹平滑遮挡后完全失效运动规律的目标TLD抗长期遮挡速度慢易误跟踪长期跟踪场景本文选择 CSRT 跟踪器的原因它在精度和鲁棒性上表现最优能应对目标尺度变化、轻微遮挡非常适合入门学习和实际简单场景使用是物体跟踪入门的首选跟踪器。ROI物体跟踪的核心前提ROIRegion of Interest即感兴趣区域是物体跟踪的 “起点”。我们需要手动框选视频帧中的目标区域告诉跟踪器你需要追踪的目标就是这个区域。跟踪器会基于 ROI 的特征在后续帧中匹配并更新位置。完整代码解析导入库与初始化跟踪器import cv2 # 创建一个CSRT跟踪器实例 tracker cv2.TrackerCSRT_create()cv2.TrackerCSRT_create()创建 CSRT 跟踪器对象这是 OpenCV 提供的标准化 API无需手动实现算法。定义状态变量与打开摄像头# 跟踪标志默认为False tracking False # 打开默认摄像头通常编号为0 cap cv2.VideoCapture(0)tracking布尔型标志位控制跟踪的开启与关闭False表示未开始跟踪cv2.VideoCapture(0)打开摄像头设备。参数0代表默认摄像头若有多个摄像头可改为 1、2 切换若要处理视频文件可传入视频路径如cv2.VideoCapture(test.mp4)。主循环读取视频帧while True: # 从摄像头读取一帧图像 ret, frame cap.read() # 如果没有正确读取到图像则退出循环 if not ret: breakhile True无限循环持续读取摄像头帧实现实时视频流cap.read()读取一帧数据返回两个值ret布尔值True表示读取帧成功False表示读取失败摄像头断开、视频结束frame读取到的视频帧三维数组存储图像像素信息if not ret: break异常处理读取失败时退出循环避免程序崩溃。按键触发框选目标并初始化跟踪if cv2.waitKey(1) ord(s): tracking True # 让用户在当前帧中选择一个矩形区域作为要跟踪的对象 roi cv2.selectROI(Tracking, frame, False) # 初始化跟踪器传入当前帧和选定的ROI tracker.init(frame, roi)cv2.waitKey(1)监听键盘按键每 1 毫秒刷新一次ord(s)获取按键 S 的 ASCII 码按下 S 键时触发跟踪tracking True将跟踪标志置为真启动跟踪cv2.selectROI()弹出窗口允许用户用鼠标框选目标第一个参数窗口名称第二个参数要框选的帧第三个参数False表示不显示十字线兼容所有 OpenCV 版本返回值roi框选区域的坐标(x, y, w, h)x 左上角横坐标y 左上角纵坐标w 宽度h 高度tracker.init(frame, roi)跟踪器初始化告诉跟踪器 “要跟踪的目标是这个区域”。实时更新跟踪结果if tracking: success, box tracker.update(frame) if success: x, y, w, h [int(v) for v in box] cv2.rectangle(frame, (x, y), (x w, y h), (0, 255, 0), 2)仅当trackingTrue时执行跟踪更新tracker.update(frame)跟踪器根据当前帧更新目标位置返回两个值success布尔值True表示跟踪成功False表示目标丢失box跟踪到的目标坐标(x, y, w, h)坐标转换box返回的是浮点数需转为整数才能绘制矩形cv2.rectangle()在视频帧上绘制绿色矩形标记跟踪目标颜色(0,255,0)线条宽度2。显示画面与退出程序cv2.imshow(Tracking, frame) if cv2.waitKey(1) 27: breakcv2.waitKey(1) 27监听 ESC 键ASCII 码 27按下后退出循环资源释放cap.release() cv2.destroyAllWindows()

相关新闻