Opencv——目标跟踪Tracker

Opencv——目标跟踪Tracker

OpenCV有八种不同的目标追踪工具,他们都可以运用到计算机视觉领域中。本文只用了以下六种对我现有数据的测试

MIL Tracker:追踪器精确,但是失败率比较高。(最低支持OpenCV 3.0.0)

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

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

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

TLD Tracker:我不确定是不是OpenCV和TLD有什么不兼容的问题,但是TLD的误报非常多,所以不推荐。(最低支持OpenCV 3.0.0)

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

经过本人你的一番测试,发现与其他五种相比较CSRT Tracker这个跟踪效果最好,即使在遮挡的情况下,但是有一缺点就是处理速度慢,慢到你能很明显看出来是一帧一帧场景的播放。其他几个速度快的精度差,精度好的速度慢。

GOTURN Tracker:这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行。这个本人这次没有测试。

用到的函数

返回值是rect,选区的坐标和大小
selectROI(const String& windowName,   //窗口的名字
				InputArray img,       //输入图片
				bool showCrosshair = true, //显示矩形
				bool fromCenter = false);  //选择矩形为初始位置。

cv::Ptr<cv::Tracker> tracker = cv::TrackerMIL::create();
cv::Ptr<cv::Tracker> tracker = cv::TrackerKCF::create();
cv::Ptr<cv::Tracker> tracker = cv::TrackerCSRT::create();
cv::Ptr<cv::Tracker> tracker = cv::TrackerMedianFlow::create();
cv::Ptr<cv::Tracker> tracker = cv::TrackerMOSSE::create();
cv::Ptr<cv::Tracker> tracker = cv::TrackerTLD::create();
tracker->init(InputArray image, const Rect2d& boundingBox);
tracker->update(InputArray image, CV_OUT Rect2d& boundingBox );

代码

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/video/tracking.hpp>
#include <opencv2/tracking/tracker.hpp>

using namespace std;

cv::Mat frame, image1, output;
bool roi = false;
bool video = true;
cv::Rect2d rect;

int main()
{	
	cv::VideoCapture capture;
	capture.open("vtest.avi");
	if (!capture.isOpened())
	{
		cout << "the video isn't opened" << endl;
	}
	//capture.read(image2);
	capture >> image1;
	
	cv::Ptr<cv::Tracker> tracker = cv::TrackerCSRT::create();
	
	while (true)
	{
		
		capture >> image1; 	
		if (cv::waitKey(30) == 112)
		{
			rect = cv::selectROI("image1", image1);
			roi = true;
			video = false;
		}
	
		if (roi)
		{
		    tracker->init(image1, rect);
			tracker->update(image1, rect);
			image1.copyTo(output);
			cv::rectangle(output, rect, cv::Scalar(255, 255, 255), 2);
			cout << rect.x << "-" << rect.y << endl;
			cv::imshow("image1", output);
		}
		if (video)
		{
			cv::imshow("image1", image1);
		}
		    if(cv::waitKey(60) == 27)
				break;
			cv::waitKey(60);
	}
		
	cv::waitKey();
}

CSRT效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### 如何在 Android 中使用 OpenCV 实现物体跟踪 #### 准备工作 要在 Android 平台上利用 OpenCV 进行物体跟踪,首先需要设置好开发环境。这涉及到配置 Android Studio 和集成 OpenCV SDK 到项目中[^3]。 对于项目的构建脚本 `build.gradle` 文件以及 C/C++ 构建配置文件 `CMakeLists.txt` 需要做出相应调整以便正确引入 OpenCV 库并确保应用程序可以访问这些库的功能。 #### 物体检测与初始化追踪器 一旦完成了上述准备工作,则可以通过加载预训练模型或自定义特征描述符来进行初始的目标识别。这里介绍一种简单的方法——通过颜色空间分割来定位感兴趣区域 (ROI),即假设目标具有独特的色彩特性从而易于与其他部分区分开来。 ```cpp // 加载摄像头帧作为输入图像 img Mat hsvImg; cvtColor(img, hsvImg, COLOR_BGR2HSV); // 将 BGR 转换为 HSV 格式 Scalar lowerBound(0, 100, 100), upperBound(20, 255, 255); inRange(hsvImg, lowerBound, upperBound, mask); // 创建掩码 findNonZero(mask, points); // 查找非零像素点集合作为目标位置 Rect bbox = boundingRect(points); // 获取边界框矩形 ``` 这段代码片段展示了如何转换图像到不同的颜色空间,并应用阈值处理得到特定范围内的颜色成分,进而确定对象的位置轮廓。 #### 使用多尺度模板匹配或其他高级技术 如果希望提高鲁棒性和准确性,还可以考虑采用更复杂的算法比如 SIFT/SURF 关键点提取、光流法或是深度学习框架下的卷积神经网络(CNNs) 来代替简单的颜色过滤方式完成初次捕捉任务。 当已经获得了待跟蹤的对象之后就可以创建一个合适的追踪实例: ```java Tracker tracker = TrackerKCF.create(); // 或者选择其他类型的追踪器如 MOSSE, CSRT 等 tracker.init(frame, new Rect(x,y,w,h)); // 初始化追踪器状态 while(camera.isOpened()){ Mat frame; camera >> frame; boolean isTracked = tracker.update(frame,bbox); } ``` 以上 Java 代码说明了怎样建立 KCF(Kernelized Correlation Filters)追踪器并将之前获得的 ROI 设置为其起始条件,在循环体内不断更新当前画面中的目标位置直至结束采集流程为止。 #### 后续优化建议 考虑到移动设备资源有限的特点,应该尽可能减少不必要的计算开销;另外也可以探索一些专门针对嵌入式的轻量化解决方案以适应不同硬件平台的要求。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值