OpenCV单目标跟踪:实现目标追踪的简易指南
了解如何使用OpenCV库实现单目标跟踪。本指南介绍了OpenCV中主要的目标跟踪算法,包括CSRT、KCF、MIL、GOTURN和DaSiamRPN。通过选择初始目标区域并使用适当的跟踪器,在视频中准确地追踪目标位置。快速掌握单目标跟踪技术,适用于视频监控、自动驾驶和行人跟踪等应用场景。
目录:
- 什么是单目标跟踪?
- OpenCV中的目标跟踪器
- 实现单目标跟踪的步骤
- 完整的代码实现
- 结论
单目标跟踪:使用OpenCV实现目标跟踪
在本篇博客中,我们将使用OpenCV库实现单目标跟踪。目标跟踪是计算机视觉中的一个重要任务,它允许我们在视频中追踪一个特定的目标,并且在视频序列中跟踪它的位置。
什么是单目标跟踪?
单目标跟踪是一种计算机视觉技术,它允许我们在视频中选择一个初始区域,然后通过不断追踪目标来预测它在后续帧中的位置。这对于许多应用来说都非常有用,比如视频监控、自动驾驶、行人跟踪等。
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
的追踪器。
实现单目标跟踪的步骤
以下是实现单目标跟踪的步骤:
- 导入必要的库和头文件
- 创建一个目标跟踪器工厂类TrackerFactory,用于根据指定的名称创建相应的目标跟踪器对象
- 设置输入视频并选择初始目标区域
- 初始化目标跟踪器,并开始跟踪过程
- 在每一帧中更新跟踪器,并将跟踪结果显示在图像中
- 当按下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 跟踪器跟船文章来源:https://www.toymoban.com/news/detail-758418.html
结论
本篇博文介绍了使用OpenCV实现单目标跟踪的方法。我们使用了OpenCV提供的目标跟踪器来追踪一个初始选择的目标在视频序列中的位置。目标跟踪在许多计算机视觉应用中都是非常重要的,希望本文能帮助你快速入门单目标跟踪的实现。如果你对此感兴趣,可以继续探索更多复杂的目标跟踪算法和应用。谢谢阅读!文章来源地址https://www.toymoban.com/news/detail-758418.html
到了这里,关于OpenCV单目标跟踪:实现目标追踪的简易指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!