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

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:[email protected]: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提供的目标跟踪器来追踪一个初始选择的目标在视频序列中的位置。目标跟踪在许多计算机视觉应用中都是非常重要的,希望本文能帮助你快速入门单目标跟踪的实现。如果你对此感兴趣,可以继续探索更多复杂的目标跟踪算法和应用。谢谢阅读!

猜你喜欢

转载自blog.csdn.net/cheungxiongwei/article/details/132163193