• OpenCV图像处理——目标追踪


    总目录

    图像处理总目录←点击这里

    二十四、目标追踪

    24.1、多目标(手动检测)追踪

    24.1.1、原理

    目标检测:运行之后按下s,通过鼠标对某个目标进行检测,然后点击空格或者回车

    目标追踪:opencv的八种追踪算法

    • BOOSTING Tracker:助推跟踪器
      给定一个新的帧,分类器在前一个位置附近的每个像素上运行,并记录分类器的得分。对象的新位置是得分最大的位置

    • MIL Tracker:密尔跟踪器
      它不会像助推跟踪器那样漂移,并且在部分遮挡下也能正常工作
      比助推跟踪器更精确,但是失败率比较高。(最低支持OpenCV 3.0.0)

    • KCF Tracker:kernelized correlation filters
      比BOOSTING和MIL都快,但是在有遮挡的情况下表现不佳。(最低支持OpenCV 3.1.0)

    • CSRT Tracker:比KCF稍精确,但速度不如后者。(最低支持OpenCV 3.4.2)

    • MedianFlow Tracker:在报错方面表现得很好,但是对于快速跳动或快速移动的物体,模型会失效。(最低支持OpenCV 3.0.0)

    • TLD Tracker:TLD的误报非常多,所以不推荐。(最低支持OpenCV 3.0.0)

    • MOSSE Tracker:速度真心快,但是不如CSRT和KCF的准确率那么高,如果追求速度选它准没错。(最低支持OpenCV 3.4.1)

    • GOTURN Tracker:一种基于深度学习的对象跟踪算法。最初的实现是在Caffe,目前已经移植到OpenCV跟踪API

    24.1.2、代码

    配置
    –tracker 上面的追踪算法

    --video ./videos/soccer_01.mp4
    --tracker kcf
    
    • 1
    • 2

    源码:github或者gitee

    24.1.3、效果

    在这里插入图片描述

    24.2、多目标(自动检测)追踪

    24.2.1、原理

    目标检测

    • Faster-RCNN
    • SSD:本代码中使用的(速度快)
    • YOLO v5
    • Mask-RCNN

    目标追踪

    24.2.2、源码

    配置

    --prototxt mobilenet_ssd/MobileNetSSD_deploy.prototxt 
    --model mobilenet_ssd/MobileNetSSD_deploy.caffemodel 
    --video race.mp4
    
    • 1
    • 2
    • 3

    对应源码中的multi_object_tracking_slow.py文件

    源码:github或者gitee

    24.2.3、效果

    在这里插入图片描述

    24.2.4、改进

    对应源码中的multi_object_tracking_fast.py文件

    多线程实现

    def start_tracker(box, label, rgb, inputQueue, outputQueue):
        t = dlib.correlation_tracker()
        rect = dlib.rectangle(int(box[0]), int(box[1]), int(box[2]), int(box[3]))
        t.start_track(rgb, rect)
    
        while True:
            # 获取下一帧
            rgb = inputQueue.get()
    
            # 非空就开始处理
            if rgb is not None:
                # 更新追踪器
                t.update(rgb)
                pos = t.get_position()
    
                startX = int(pos.left())
                startY = int(pos.top())
                endX = int(pos.right())
                endY = int(pos.bottom())
    
                # 把结果放到输出q
                outputQueue.put((label, (startX, startY, endX, endY)))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    Qt扫盲-QJsonDocument理论总结
    huggingface笔记: accelerate estimate-memory 命令
    UE 4.27.2 和 UE 5.3.1 自定义模块出现的问题
    软考高级系统架构设计师系列论文真题四:论高可靠性系统中软件容错技术的应用
    委派设计模式
    (附源码)python电影院信息管理系统 毕业设计 021844
    UnityShader数学基础篇
    机器人学DH参数及利用matlab符号运算推导
    C++20开发工程师 系列 笔记 环境搭建篇(2022/11/30)
    融云观察:AI Agent 是不是游戏赛道的下一个「赛点」?
  • 原文地址:https://blog.csdn.net/weixin_44635198/article/details/128135961