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)

相关推荐
晚霞的不甘6 小时前
CANN 编译器深度解析:TBE 自定义算子开发实战
人工智能·架构·开源·音视频
愚公搬代码6 小时前
【愚公系列】《AI短视频创作一本通》016-AI短视频的生成(AI短视频运镜方法)
人工智能·音视频
格林威6 小时前
Baumer相机玻璃制品裂纹自动检测:提高透明材质检测精度的 6 个关键步骤,附 OpenCV+Halcon 实战代码!
人工智能·opencv·视觉检测·材质·工业相机·sdk开发·堡盟相机
dazzle7 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵7 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强7 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发7 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
张登杰踩7 小时前
MCR ALS 多元曲线分辨算法详解
算法
那个村的李富贵7 小时前
CANN赋能AIGC“数字人”革命:实时视频换脸与表情驱动实战
aigc·音视频
晚霞的不甘7 小时前
CANN 支持强化学习:从 Isaac Gym 仿真到机械臂真机控制
人工智能·神经网络·架构·开源·音视频