MeanShift和Opencv移动简单目标跟踪

该博客介绍了MeanShift迭代原理及其在移动目标跟踪中的应用,包括直方图计算和反向投影。通过示例代码展示了从初始图到跟踪迭代图的过程,并提供了图片资源链接。作者计划进一步扩展和完善程序,增强其功能。
摘要由CSDN通过智能技术生成

一、储备知识

       1)MeanShift迭代原理、直方图的计算,反向投影等

       2)代码用到的函数:

void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, SparseMat&
hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=
false );
arrays:输入图像指针;
int arrays:输入图像个数
channels:通道数
Mat mask:掩码,一般为空
hist:计算出来的直方图
dims:计算出来的直方图的维数
histsize:直方图bins数目
ranges:每一个bin的范围
反向投影:

void cvCalcBackProject( IplImage** image, CvArr* back_project, const CvHistogram* hist );

image:输入图像 (也可以传递 CvMat** ).
back_project:反向投影图像,与输入图像具有同样类型.
hist:直方图
二、代码

#include <opencv2/opencv.hpp>  
#include<iostream>
using namespace std;
using namespace cv;

Mat frame, frameHSV, imgROI, dstHist, backproj;

int histSize[1] = { 256 };
float hranges[2] = { 0, 255 };//直方图每一个bins的范围  
const float* ranges[1] = { hranges };
int channels[1] = { 0};

int main()
{
	VideoCapture cap("E://Datasets//img%4d.jpg");
	cap >> frame;

	cvtColor(frame, frameHSV, COLOR_RGB2HSV);
	Rect rect(200, 115, 45, 45);//初始帧确定足球位置
	imgROI = frameHSV(rect);
	calcHist(&imgROI, 1, channels, Mat(), dstHist, 1, histSize, ranges);
	normalize(dstHist, dstHist, 0.0, 1.0, NORM_MINMAX);

	rectangle(frame, rect, Scalar(0, 255, 255));
	imshow("Frame", frame);
	waitKey(0);

	while (true)
	{
		cap >> frame;
		if (frame.empty()) break;

		cvtColor(frame, frameHSV, COLOR_RGB2HSV);
		calcBackProject(&frameHSV, 1, channels, dstHist, backproj, ranges, 255.0);

		//criteria初始化,这个类是对整个meanshift迭代过程进行控制的初始参量,最大迭代次数是10,收敛阈值是0.001
		TermCriteria criteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 10, 0.001);
		meanShift(backproj, rect, criteria);

		imgROI = frameHSV(rect);//此rect是meanshift迭代出来的新区域,新区域窗口大小不变
		calcHist(&imgROI, 1, channels, Mat(), dstHist, 1, histSize, ranges);
		normalize(dstHist, dstHist, 0.0, 1.0, NORM_MINMAX);

		rectangle(frame, rect, Scalar(0, 255, 0));
		imshow("Frame", frame);

		waitKey(30);
	}

	return 0;
}

三、结果

初始图:



跟踪迭代图:


四、图片资源如下:

链接:https://yunpan.cn/cq9GfQDrsDL7r  密码:b135

五、后续有时间对该程序进行扩展和完善,使之功能更强大。

六、参考资料

移动目标跟踪



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义Meanshift跟踪算法的实现步骤如下: 1. 获取视频帧,并选择要跟踪的目标区域。 2. 将目标区域转换为HSV色彩空间,并计算出该区域的直方图。 3. 对于每个后续帧,首先将其转换为HSV色彩空间,然后使用反向投影算法将其与目标直方图进行比较。 4. 对于每个像素,计算该像素的概率,即它属于目标区域的概率。 5. 使用MeanShift算法来计算下一个目标位置。在此算法中,计算出目标区域的质心,并将其用作新的目标位置。重复该过程,直到质心不再移动。 6. 将新的目标位置用矩形框标记在视频帧上,并将其显示出来。 下面是C++代码实现: ```c++ #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main(int argc, char** argv) { VideoCapture cap(0); if (!cap.isOpened()) { cout << "Error opening video stream or file" << endl; return -1; } // 选择目标区域 Rect trackWindow(0, 0, 0, 0); bool init = false; Mat frame, hsv, mask, hist, backproj; // 设置终止条件 TermCriteria termcrit(TermCriteria::EPS | TermCriteria::COUNT, 10, 1); // 设置HSV颜色范围 int hmin = 0, smin = 0, vmin = 0; int hmax = 180, smax = 255, vmax = 255; while (true) { cap >> frame; if (frame.empty()) break; // 将帧转换为HSV颜色空间 cvtColor(frame, hsv, COLOR_BGR2HSV); // 如果已经选择了初始目标区域,则执行跟踪 if (init) { // 计算反向投影 calcBackProject(&hsv, 1, 0, hist, backproj, &ranges); // 应用CAMShift算法来计算新的目标位置 meanShift(backproj, trackWindow, termcrit); // 绘制矩形框 rectangle(frame, trackWindow, Scalar(0, 0, 255), 3); } // 显示图像 imshow("Frame", frame); // 按下空格键来选择目标区域 if (waitKey(1) == ' ') { init = false; trackWindow = selectROI("Frame", frame, false, false); if (trackWindow.area() > 0) { Mat roi(hsv, trackWindow); calcHist(&roi, 1, 0, mask, hist, 1, &histSize, &ranges); normalize(hist, hist, 0, 255, NORM_MINMAX); init = true; } } } cap.release(); destroyAllWindows(); return 0; } ``` 需要注意的是,这个算法的效果可能不如OpenCV中的MeanShift算法,因为OpenCV中的算法使用了更复杂的技术来提高跟踪的准确性。但是,通过自定义算法,可以更好地理解MeanShift算法的原理和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值