MeanShift算法(均值漂移)
假设有一堆数据,不均匀的在平面空间分布,首先通过均值计算,评估中心点在哪里,然后中心向密度的地方平移最后找到密度最高的地方。
MeanShift算法使用的直方图比较与模板匹配类似,这两个算法只能匹配Windows固定的roi区域。
如果视频中选择的roi区域的移动忽远忽近(甚至变形),这两种算法就不能再准确的跟踪到roi区域这时候用CAMShift
:窗口尺寸自动变化
:适合变形目标检测
步骤:
是第一帧的话则:
- 读取第一帧
- 选择ROI区域
- HSV空间H通道直方图
- 直方图反向映射
- CAMShift位置跟踪
- 绘制位置更新显示
不是第一帧的话则:
- 直方图反向映射
- CAMShift位置跟踪
- 绘制位置更新显示
相关API:
mixChannels( // 将输入数组的指定通道复制到输出数组的指定通道
const Mat* src, //输入数组或向量矩阵,所有矩阵的大小和深度必须相同。
size_t nsrcs, //矩阵的数量
Mat* dst, //输出数组或矩阵向量,大小和深度必须与src相同
size_t ndsts,//矩阵的数量
const int* fromTo,//指定被复制通道与要复制到的位置组成的索引对
size_t npairs //fromTo中索引对的数目
);
calcHist(// 计算直方图
const Mat* images,//输入图像指针
int images,// 图像数目
const int* channels,// 要计算的通道数的下标,可以传一个数组 {0, 1} 表示计算第0通道与第1通道的直方图,此数组长度要与histsize ranges 数组长度一致
InputArray mask,// 输入mask,可选,如有,则表示只计算mask元素值为255的位置的直方图
OutputArray hist,//输出的直方图数据
int dims,// 维数
const int* histsize,// 直方图级数, 对应 bins
const float** ranges,// 值域范围
bool uniform,// true by default 是否归一化到 0-1 之间
bool accumulate// false by defaut 多通道时true
)
calcBackProject ( // 反向投影
const Mat * images, // 输入图像,图像深度必须位CV_8U,CV_16U或CV_32F中的一种,尺寸相同,每一幅图像都可以有任意的通道数
int nimages, // 输入图像的数量
const int * channels,