• 大小: 10.88MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-10-09
  • 语言: C/C++
  • 标签: meanShift  目标跟踪  

资源简介

使用C++实现了meanShift跟踪算法,通过跟踪视频中的物体验证了其可行性。文档中包含源代码和一个meanShift原理讲解文档

资源截图

代码片段和文件信息

#include “core/core.hpp“    
#include “highgui/highgui.hpp“    
#include “imgproc/imgproc.hpp“
#include “video/tracking.hpp“
#include    
#include 
using namespace cv;    
using namespace std;    

Mat image;
bool leftButtonDown = false;// 鼠标左键是否按下
bool videoPauseFlag = false;// 是否暂停视频
bool trackingFlag = false;// 是否开始meanShift跟踪
Point pt1 pt2;// 记录选择区域的左上点/右下点
Rect rect;// 跟踪区域
vector dstRegionDensity;// 目标跟踪区域的核函数估计密度向量
vector testRegionDensity;// 候选区域的核函数估计密度向量
vector w;// meanShift公式中的权值计算
int densityNum = 4096;// 对于每一帧图像的R/G/B三通道,每个通道按照值的大小分为16个区间,所以密度向量为16*16*16=4096维
void onMouse(int eventint xint yint flags void* ustc); //鼠标回调函数  
void calcKernelDensity(Mat imageSrc vector&density int densityNum); // 计算图像的核函数估计密度向量
void meanShiftTracking(Mat& imageSrc int iteration double eps Rect& rect);// meanShift算法跟踪


int main()
{
// 打开视频文件
VideoCapture cap(“768X576.avi“);
if(!cap.isOpened())
{
cout<<“cannot open avi file“< return -1;
}
// 全局链表分配空间
dstRegionDensity.resize(densityNum);
testRegionDensity.resize(densityNum);
w.resize(densityNum);

double fps = cap.get(CV_CAP_PROP_FPS);// 获取图像帧率
int pauseTime = (int)(1000.f/fps);
namedWindow(“video“);
setMouseCallback(“video“ onMouse);

while(1)
{
if(waitKey(pauseTime) == ‘p‘)
{
videoPauseFlag = !videoPauseFlag;
}
if(videoPauseFlag)// 暂停视频时不会更新图像帧
continue;
else
{
cap>>image;
if(trackingFlag)
{
meanShiftTracking(image 30 0.2 rect);// meanShift跟踪
int num = 0;

/*for(int n = 0; n < densityNum; n++)
{
dstRegionDensity[n] = testRegionDensity[n];
}*/
rectangle(image rect Scalar(0 0 0));// 绘制出计算得到的跟踪位置

}
}
imshow(“video“ image);

}

}

void onMouse(int eventint xint yint flags void* ustc)
{
Mat imageROI;
// 鼠标左键按下获取区域起始点
if(event == CV_EVENT_LBUTTONDOWN&&!trackingFlag)
{
leftButtonDown = true;
pt1 = Point(xy);
}
// 拖动选取区域并使用黑色线框显示选择区域
else if(event == CV_EVENT_MOUSEMOVE && leftButtonDown)
{
Mat image_tmp;
image.copyTo(image_tmp);
pt2 = Point(xy);
rectangle(image_tmp pt1 pt2 Scalar(0 0 0));
imshow(“video“ image_tmp);
}
// 左键松开获取区域结束点,确定目标跟踪区域
else if(event == CV_EVENT_LBUTTONUP && leftButtonDown)
{
leftButtonDown = false;
pt2 = Point(xy);
image(Rect(pt1 pt2)).copyTo(imageROI);
rect.x = std::min(pt1.x pt2.x);
rect.y = std::min(pt1.y pt2.y);
rect.width = pt1.x > pt2.x ? pt1.x - pt2.x : pt2.x - pt1.x;
rect.height = pt1.y > pt2.y ? pt1.y - pt2.y : pt2.y - pt1.y;

namedWindow(“imageROI“);
imshow(“imageROI“ imageROI);
// 计算目标跟踪区域的核函数估计密度向量
calcKernelDensity(imageROI dstRegionDensity densityNum);
waitKey(2000);
destroyWindow(“imageROI“);
trackingFlag = true;
}

}


void calcKernelDensity(Mat imageSrc vector&density int densityNum)
{
/* 选取的核函数轮廓函数为k(x) = 1-x^2,其中x为图

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件     8131690  2013-11-13 17:44  meanShift\768x576.avi
     文件        5645  2017-11-06 16:23  meanShift\meanShiftTracking.cpp
     文件     3790678  2017-11-06 15:49  meanShift\meanshift算法简介.pdf
     目录           0  2017-11-06 16:25  meanShift\

评论

共有 条评论