OpenCV单目标跟踪:实现目标追踪的简易指南

2023-11-15

OpenCV单目标跟踪:实现目标追踪的简易指南

了解如何使用OpenCV库实现单目标跟踪。本指南介绍了OpenCV中主要的目标跟踪算法,包括CSRT、KCF、MIL、GOTURN和DaSiamRPN。通过选择初始目标区域并使用适当的跟踪器,在视频中准确地追踪目标位置。快速掌握单目标跟踪技术,适用于视频监控、自动驾驶和行人跟踪等应用场景。
TrackerKCF boat

目录:

  1. 什么是单目标跟踪?
  2. OpenCV中的目标跟踪器
  3. 实现单目标跟踪的步骤
  4. 完整的代码实现
  5. 结论

单目标跟踪:使用OpenCV实现目标跟踪

在本篇博客中,我们将使用OpenCV库实现单目标跟踪。目标跟踪是计算机视觉中的一个重要任务,它允许我们在视频中追踪一个特定的目标,并且在视频序列中跟踪它的位置。
TrackerKCF car

什么是单目标跟踪?

单目标跟踪是一种计算机视觉技术,它允许我们在视频中选择一个初始区域,然后通过不断追踪目标来预测它在后续帧中的位置。这对于许多应用来说都非常有用,比如视频监控、自动驾驶、行人跟踪等。

OpenCV中的目标跟踪器

OpenCV是一个流行的开源计算机视觉库,它提供了各种目标跟踪算法。在本文中,我们将使用OpenCV的目标跟踪器来实现单目标跟踪。截至OpenCV 4.6.0版本,它提供了以下几种主要的目标跟踪算法:

  • TrackerCSRT : CSRT (Channel and Spatial Reliability Tracker)跟踪器
  • TrackerKCF: KCF (Kernelized Correlation Filters)跟踪器
  • TrackerMIL: MIL (Multiple Instance Learning)跟踪器
  • TrackerGOTURN: GOTURN (Generic Object Tracking Using Regression Networks)跟踪器
  • TrackerDaSiamRPN: DaSiamRPN (Deep Fully Convolutional Siamese Networks for Object Tracking)跟踪器
    在OpenCV 4.7.0版本中,还添加了一个名为TrackerNano的追踪器。

Opencv 4.8 tracker

实现单目标跟踪的步骤

以下是实现单目标跟踪的步骤:

  1. 导入必要的库和头文件
  2. 创建一个目标跟踪器工厂类TrackerFactory,用于根据指定的名称创建相应的目标跟踪器对象
  3. 设置输入视频并选择初始目标区域
  4. 初始化目标跟踪器,并开始跟踪过程
  5. 在每一帧中更新跟踪器,并将跟踪结果显示在图像中
  6. 当按下ESC键时,退出跟踪过程

完整的代码实现

#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>

class TrackerFactory
{
public:
	 /*
     * 截至 opencv 4.6.0 版本
     * ["TrackerCSRT","TrackerKCF","TrackerMIL","TrackerGOTURN","TrackerDaSiamRPN"]
     * 其中 TrackerMIL、TrackerGOTURN、TrackerDaSiamRPN 属于 Main modules / Video Analysis / Object Tracking 模块。opencv 4.7.0 版本添加了一个 TrackerNano 追踪器。
     * TrackerCSRT、TrackerKCF 属于 Extra modules / Tracking API 模块。Extra modules 部分自行编译源代码。
     */
    static cv::Ptr<cv::Tracker> create(const std::string& name) {
        do {
            if(name.compare("TrackerCSRT") == 0) {
                return cv::TrackerCSRT::create();
            }
            if(name.compare("TrackerKCF") == 0) {
                return cv::TrackerKCF::create();
            }
            if(name.compare("TrackerMIL") == 0) {
                return cv::TrackerMIL::create();
            }
            if(name.compare("TrackerGOTURN") == 0) {
                return cv::TrackerGOTURN::create();// 需要下载 goturn.caffemodel 模型和 goturn.prototxt 模型定义文件。
            }
            if(name.compare("TrackerDaSiamRPN") == 0) {
                return cv::TrackerDaSiamRPN::create();// 需要下载模型 dasiamrpn_model.onnx 模型和dasiamrpn_kernel_r1.onnx、dasiamrpn_kernel_cls1.onnx参数配置文件。
            }
        } while(false);

        return nullptr;
    }
};

int main(int argc, char** argv) {
    cv::namedWindow("tracker", cv::WINDOW_NORMAL);
    cv::resizeWindow("tracker", {640, 480});

    cv::Rect roi;
    cv::Mat frame;

    // 创建一个跟踪器对象
    cv::Ptr<cv::Tracker> tracker = TrackerFactory::create("TrackerKCF");

    // 设置输入视频
    std::string video = "rtsp://admin:admin12345@192.168.1.108:554/Stream/Live/101";
    cv::VideoCapture cap(video);

    // 获取初始边界框
    cap >> frame;
    roi = selectROI("tracker", frame);

    // 如果没有选择ROI,则退出程序
    if(roi.width == 0 || roi.height == 0) return 0;

    // 初始化跟踪器
    tracker->init(frame, roi);

    // 开始跟踪过程
    printf("Start the tracking process, press ESC to quit.\n");

    for(;;) {
        // 从视频中获取一帧
        cap >> frame;

        // 如果没有更多图像,则退出
        if(frame.rows == 0 || frame.cols == 0) break;

        // 更新跟踪结果
        cv::TickMeter cost;
        cost.start();
        auto tracking = tracker->update(frame, roi);
        cost.stop();
        // 计算耗时时间
        printf("cost:%.2f tracking:%s", cost.getTimeMilli(), tracking ? "true" : "false");

        // 在图像中绘制跟踪的对象
        cv::rectangle(frame, roi, cv::Scalar(255, 0, 0), 3, 1);

        // 显示带有跟踪对象的图像
        cv::imshow("tracker", frame);

        // 按下ESC键退出
        if(cv::waitKey(1) == 27) break;
    }

    return 0;
}

注意:运行 TrackerDaSiamRPN 和 TrackerGOTURN 需要下载对应的模型文件。
dasiamrpn-model.onnx 模型文件:https://download.csdn.net/download/cheungxiongwei/88188476
goturn.caffemodel 模型文件:https://download.csdn.net/download/cheungxiongwei/88188478
下载后解压到程序同级目录,opencv 跟踪器会自动加载,你也可以在跟踪器 create 方法中指定参数来加载。

opencv TrackerKCF 跟踪器跟车

opencv TrackerKCF 跟踪器跟船

结论

本篇博文介绍了使用OpenCV实现单目标跟踪的方法。我们使用了OpenCV提供的目标跟踪器来追踪一个初始选择的目标在视频序列中的位置。目标跟踪在许多计算机视觉应用中都是非常重要的,希望本文能帮助你快速入门单目标跟踪的实现。如果你对此感兴趣,可以继续探索更多复杂的目标跟踪算法和应用。谢谢阅读!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV单目标跟踪:实现目标追踪的简易指南 的相关文章

  • 查找彼此接近的对象边界

    我正在研究一个计算机视觉问题 其中问题的第一步是找到物体彼此靠近的位置 例如 在下图中 我感兴趣的是找到灰色标记的区域 Input Output 我目前的方法是首先反转图像 然后通过侵蚀进行形态梯度跟随 然后删除一些不感兴趣的轮廓 脚本如下
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • OpenCV:视频结束后如何重新启动?

    我正在播放视频文件 但播放完毕后如何再次播放 Javier 如果您想一遍又一遍地重新启动视频 也称为循环播放 可以通过在帧数达到时使用 if 语句来实现cap get cv2 cv CV CAP PROP FRAME COUNT 然后重置帧
  • Opencv matchTemplate 和 np.where():仅保留唯一值

    继带有马里奥硬币的 opencv 教程 https opencv python tutroals readthedocs io en latest py tutorials py imgproc py template matching p
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 在 RGB 图像上绘制多类语义分割透明叠加

    我有语义分割掩码的结果 值在 0 1 之间 需要大津阈值来确定什么是积极的 我想直接在 RGB 图像上绘制 在 RGB 图像上每个预测类具有不同的随机颜色 我使用以下内容绘制了具有单一颜色的单个蒙版 是否有一个包或简单的策略可以为多类别做到
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 如何计算图像中的 RGB 或 HSV 通道组合?

    我使用 python opencv 加载形状为 30 100 3 的图像 现在想要按颜色计算所有颜色的频率 我不是指单个通道 而是指通道组合 含义 3 个频道列表 例如 255 0 0 表示红色 255 255 0 表示黄色 100 100
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 来自连接到远程机器的相机的 Opencv 流

    我正在用 python 开发一个 wx 应用程序 用于流式传输和显示来自两个不同网络摄像头的视频 这工作正常 但现在我需要在不同的场景中执行此操作 其中两个摄像头连接在通过网络连接的 Windows 上运行的单独计算机中 我的应用程序将在机
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg
  • 为什么我无法在 Mac 12.0.1 (Monterey) 上使用 pip 安装 OpenCV? [复制]

    这个问题在这里已经有答案了 当我尝试使用 python pip 安装 OpenCV 时 它显示了以下内容 Remainder of file ignored Requirement already satisfied pip in Libr
  • 如何使用 python、openCV 计算图像中的行数

    我想数纸张 所以我正在考虑使用线条检测 我尝试过一些方法 例如Canny HoughLines and FLD 但我只得到处理过的照片 我不知道如何计算 有一些小线段就是我们想要的线 我用过len lines or len contours
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 如何使用 Python 裁剪图像中的矩形

    谁能给我关于如何裁剪两个矩形框并保存它的建议 我已经尝试过这段代码 但效果不佳 import cv2 import numpy as np Run the code with the image name keep pressing spa
  • 如何确定与视频中物体的距离?

    我有一个从行驶中的车辆前面录制的视频文件 我将使用 OpenCV 进行对象检测和识别 但我停留在一方面 如何确定距已识别物体的距离 我可以知道我当前的速度和现实世界的 GPS 位置 但仅此而已 我无法对我正在跟踪的对象做出任何假设 我计划用
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • “没有名为‘cv2’的模块”,但已安装

    我已经安装了包含 opencv 贡献的 whl 文件 因为我想使用 SIFT 算法 我在 conda 环境中使用 pip 安装了它 所以当我在 conda list 中提示时 它会向我显示 opencv python 3 4 5 contr
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 997. 找到小镇的法官

    题目描述 小镇里有 n 个人 按从 1 到 n 的顺序编号 传言称 这些人中有一个暗地里是小镇法官 如果小镇法官真的存在 那么 小镇法官不会信任任何人 每个人 除了小镇法官 都信任这位小镇法官 只有一个人同时满足属性 1 和属性 2 给你一
  • 从0开始的 TypeScriptの十四:内置工具类型

    序 在之前的 从0开始的TypeScript 十三 中 已经对typescript的工具类型中的关键字infer extends keyof typeof in这些有所了解了 那么接下来为了使用更加方便 可以对typescript中内置的工
  • 【MATLAB】【函数介绍】cp2tform函数从控制点对推断空间变换

    官方链接 https ww2 mathworks cn help images ref cp2tform html s tid doc ta cp2tform函数的作用是根据传入的控制点对的坐标推断空间变换参数 函数语法如下 从控制点对推断
  • 【华为OD机试】服务失效判断【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 某系统中有众多服务 每个服务用字符串 只包含字母和数字 长度 lt 10 唯一标识 服务间可能有依赖关系 如A依赖B 则当B故障时导致A也故障 依赖具有传递性 如A依
  • QSettings修改配置文件的bug

    QT 使用QSettings类的bug 问题描述 原因分析 解决方案 问题描述 settings beginGroup mainwindow settings setValue size win gt size settings setVa
  • [转]shell中wait命令详解

    wait命令介绍 wait 作业指示或进程号 1 等待作业号或者进程号制定的进程退出 返回最后一个作业或进程的退出状态状态 如果没有制定参数 则等待所有子进程的退出 其退出状态为0 2 如果是shell中等待使用wait 则不会等待调用函数
  • Python 百分比计算

    遇到计算百分比的情况 查了一下 有两种方式 具体实现方式见下面代码 方式1 格式化为float 然后 处理成 格式 需要对分子 分母 100如下 percentList append 2f format member denominator
  • 51单片机蓝桥杯学习记录2独立按键

    51单片机蓝桥杯学习记录 独立按键这一块是比较简单的 就是读一下io口的高低电平 用普通函数写和用中断写还是有些不一样的 要注意的还是消抖和重复触发的问题 不说了 上码 author 风行天 time 2020 01 16 include
  • 初识云计算————虚拟化背景

    VM 虚拟机 Virtual Machine 虚拟化背景 美国环境保护署 EPA 报告的一组有趣的统计数据就证明了其好处 EPA 研究服务器和数据中心的能源效率时发现 实际上服务器只有 5 的时间是在工作的 在其他时间 服务器都处于 休眠
  • 字节和比特简单介绍

    字节 byte 字节为Byte 多数用B表示 字节为计算机中数据处理的基本单位 比特 bit 又称位 表示二进制位 为计算内部数据存储的最小单位 关系 1Byte 8bit 其他单位 1B Byte 字节 8bit 1KB Kilobyte
  • redis的数据类型string和list

    学习笔记记录 方便以后查看 一 Redis简介 1 关于关系型数据库和nosql数据库 关系型数据库是基于关系表的数据库 最终会将数据持久化到磁盘上 而nosql数据 库是基于特殊的结构 并将数据存储到内存的数据库 从性能上而言 nosql
  • 文献精讲-弱小目标检测-ADMD方法

    分享一下个人对于近期读过的一篇文献 Fast and robust small infrared target detection using absolute directional mean difference algorithm 的
  • Python打包的艺术(二)- Packaging Tools的昨天,今天,明天

    本文转载至 http blog chinaunix net uid 15174104 id 4036539 html 截至今年3月 Python的打包工具链处于的状态可以用 非常混乱 来形容 除了官方的distutils 第三方有setup
  • Python 包发布

    包结构 准备工作 twine 安装 pip3 install twine pypi 账号注册 https pypi org account register 注册成功后 记得到邮箱激活 否则无法使用 三个文件 setup py import
  • 【华为OD机试真题】MVP争夺战(python)100%通过率 超详细代码注释 代码解读

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 MVP争夺战 知识点DFS搜索 时间限制 1s 空间限制 256MB 限定语言 不限 题目描
  • 【Java数据结构】Map和Set的使用

    章节目标 掌握Map Set及实际实现类 HashMap TreeMap HashSet TreeSet的使用 掌握 TreeMap 和 TreeSet 背后的数据结构搜索树的原理和简单实现 掌握 HashMap 和 HashSet 背后的
  • Ant Desgin Pro v6 正式版本企业级从零开始实现动态菜单与权限视频教程(28 个视频)

    Ant Desgin Pro v6 正式版本企业级从零开始实现动态菜单与权限视频教程 28 个视频 欢迎加入我们的Ant Design Pro v6视频教程 如果您正在寻找一门教您如何从零开始构建企业级动态菜单和权限管理的课程 那么这个视频
  • spring boot学习(十二)整合Druid

    Druid简介 Java程序很大一部分要操作数据库 为了提高性能操作数据库的时候 又不得不使用数据库连接池 Druid 是阿里巴巴开源平台上一个数据库连接池实现 结合了 C3P0 DBCP 等 DB 池的优点 同时加入了日志监控 Druid
  • linux上zookeeper单机搭建伪集群

    Zookeeper 一 下载zookeeper 解压到指定文件夹下 tar zxvf apache zookeeper 3 5 8 bin tar gz C home zk 改个名字 这个随意 mv apache zookeeper 3 5
  • OpenCV单目标跟踪:实现目标追踪的简易指南

    OpenCV单目标跟踪 实现目标追踪的简易指南 了解如何使用OpenCV库实现单目标跟踪 本指南介绍了OpenCV中主要的目标跟踪算法 包括CSRT KCF MIL GOTURN和DaSiamRPN 通过选择初始目标区域并使用适当的跟踪器