news 2026/4/16 10:08:31

OpenCV视频实时跟踪目标,多种算法,python版

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCV视频实时跟踪目标,多种算法,python版
  • 测试结果

同等条件下对比:

'csrt', # 261.0ms, lost 0 'kcf', # 51.0ms, lost 157 'boosting', # 23.7ms, lost 0 'mil', # 273.1ms, lost 0 'tld', # 100.7ms, lost 0 'medianflow', # 6.6ms, lost 37 'mosse' # 10.7ms, lost 158
  • 具体代码
import cv2 import time def init_tracker(frame): # 创建跟踪器 if tracker_index == 0: tracker = cv2.legacy.TrackerCSRT_create() elif tracker_index == 1: tracker = cv2.legacy.TrackerKCF_create() elif tracker_index == 2: tracker = cv2.legacy.TrackerBoosting_create() elif tracker_index == 3: tracker = cv2.legacy.TrackerMIL_create() elif tracker_index == 4: tracker = cv2.legacy.TrackerTLD_create() elif tracker_index == 5: tracker = cv2.legacy.TrackerMedianFlow_create() elif tracker_index == 6: tracker = cv2.legacy.TrackerMOSSE_create() height, width = frame.shape[:2] bbox = [int(width*(1-check_ratio)/2), int(height*(1-check_ratio)/2), width*check_ratio, height*check_ratio] # 初始化跟踪器 ok = tracker.init(frame, bbox) return tracker, bbox def track_action(tracker, frame): current_time = time.time() result = frame.copy() # 更新跟踪器,获取新边界框 ok, bbox = tracker.update(result) lost = 0 if ok: # 跟踪成功:绘制边界框 (x, y, w, h) = [int(v) for v in bbox] cv2.rectangle(result, (x, y), (x+w, y+h), (0, 255, 0), 2) else: # 跟踪失败 lost = 1 cv2.putText(result, "Tracking failure", (50, 80), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,0,255), 2) cost_time = (time.time()-current_time) return result, cost_time, lost def track_video(input_video, output_video): # 读取视频 input = cv2.VideoCapture(input_video) ok, frame = input.read() if not ok: print("Cannot read video") return fps = int(input.get(cv2.CAP_PROP_FPS)) width = int(input.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(input.get(cv2.CAP_PROP_FRAME_HEIGHT)) tracker, bbox = init_tracker(frame) fourcc = cv2.VideoWriter_fourcc(*'mp4v') output = cv2.VideoWriter(output_video, fourcc, fps, (width*2, height)) frame_counter = 0 track_lost = 0 work_cost = 0 while True: ok, frame = input.read() if not ok: break frame_counter += 1 track_frame, cost, lost = track_action(tracker, frame) work_cost += cost track_lost += lost if (merge_video): track = cv2.hconcat([frame, track_frame]) output.write(track) if (frame_counter % 100 == 0): print(frame_counter) print('tracker(%s): cost per frame(ms)=%.2f' % (tracker_names[tracker_index], (work_cost/frame_counter*1000))) print('tracker(%s): track(lost/total)=%d/%d' % (tracker_names[tracker_index], track_lost, frame_counter)) output.release() input.release() # 跟踪器类型, total 527 frames # tracker name, cost per frame(ms), lost tracker_names = [ 'csrt', # 261.0ms, lost 0 'kcf', # 51.0ms, lost 157 'boosting', # 23.7ms, lost 0 'mil', # 273.1ms, lost 0 'tld', # 100.7ms, lost 0 'medianflow', # 6.6ms, lost 37 'mosse' # 10.7ms, lost 158 ] merge_video = True check_ratio = 1/10 tracker_index = 0 input_video = 'test.mp4' output_video = 'track.mp4' for index in range(7): tracker_index = index output_video = ("track%d.mp4" % tracker_index) track_video(input_video, output_video)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 12:13:15

工业环境USB协议电磁兼容性设计要点

工业USB通信的“抗干扰密码”:从芯片到电缆的EMC实战设计你有没有遇到过这样的场景?一台工业HMI设备,在实验室里USB连接稳定如钟,可一搬到车间现场,插上U盘或连接PC时就频繁断连、数据错乱,甚至接口芯片直接…

作者头像 李华
网站建设 2026/4/16 10:42:29

cc2530无线网络信道选择与跳频协议实现

如何让cc2530在“吵闹”的2.4 GHz频段中稳如磐石?——信道选择与跳频实战指南你有没有遇到过这种情况:ZigBee网络明明部署得好好的,突然数据掉包严重,设备失联,查来查去发现是隔壁办公室开了个Wi-Fi热点?这…

作者头像 李华
网站建设 2026/4/16 10:57:04

计算机毕业设计springboot牙科诊所管理系统 基于Spring Boot的牙科诊所信息化管理系统设计与实现 Spring Boot框架下的牙科诊所管理平台开发研究

计算机毕业设计springboot牙科诊所管理系统j84x1 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着人们对口腔健康的关注度不断提升,牙科诊所的业务量也在逐年增…

作者头像 李华
网站建设 2026/4/16 2:07:57

LVGL内存管理入门:了解堆与动态分配策略

LVGL内存管理实战指南:从堆分配到碎片治理的深度解析你有没有遇到过这样的情况?界面切换几次后,按钮突然不响应了;或者动画播放到一半卡住,系统莫名重启。查遍代码逻辑都正常,最后发现——是内存不够了。在…

作者头像 李华
网站建设 2026/4/16 10:53:51

车载SOA架构下UDS与SOME/IP融合方案探讨

车载SOA时代,诊断还能靠CAN“硬扛”吗?——UDS与SOME/IP融合实战解析你有没有遇到过这样的场景:OTA升级卡在98%,诊断仪连上一看,提示“安全访问未解锁”;自动驾驶系统报了个复合故障,排查一圈才…

作者头像 李华