有关meanshift跟踪的理解(在opencv中实现)(转载)

meanshift算法思想其实很简单:利用概率密度的梯度爬升来寻找局部最优。它要做的就是输入一个在图像的范围,然后一直迭代(朝着重心迭代)直到满足你的要求为止。但是他是怎么用于做图像跟踪的呢?这是我自从学习meanshift以来,一直的困惑。而且网上也没有合理的解释。经过这几天的思考,和对反向投影的理解使得我对它的原理有了大致的认识。

在opencv中,进行meanshift其实很简单,输入一张图像(imgProb),再输入一个开始迭代的方框(windowIn)和一个迭代条件(criteria),输出的是迭代完成的位置(comp )。

这是函数原型:

int cvMeanShift( const void* imgProb, CvRect windowIn,CvTermCriteria criteria, CvConnectedComp* comp )

但是当它用于跟踪时,这张输入的图像就必须是反向投影图了。

为什么必须是反向投影图呢?首先我们要理解什么是反向投影图。

简单理解它其实实际上是一张概率密度图。经过反向投影时的输入是一个目标图像的直方图(也可以认为是目标图像),还一个输入是当前图像就是你要跟踪的全图,输出大小与全图一样大,它上像素点表征着一种概率,就是全图上这个点是目标图像一部分的概率。如果这个点越亮,就说明这个点属于物体的概率越大。现在我们明白了这原来是一张概率图了。当用meanshift跟踪时,输入的原来是这样一幅图像,那也不难怪它可以进行跟踪了。

半自动跟踪思路:输入视频,用画笔圈出要跟踪的目标,然后对物体跟踪。

用过opencv的都知道,这其实是camshiftdemo的工作过程。

第一步:选中物体,记录你输入的方框和物体。

第二步:求出视频中有关物体的反向投影图。

第三步:根据反向投影图和输入的方框进行meanshift迭代,由于它是向重心移动,即向反向投影图中概率大的地方移动,所以始终会移动到目标上。

第四步:然后下一帧图像时用上一帧输出的方框来迭代即可。

全自动跟踪思路:输入视频,对运动物体进行跟踪。

第一步:运用运动检测算法将运动的物体与背景分割开来。

第二步:提取运动物体的轮廓,并从原图中获取运动图像的信息。

第三步:对这个信息进行反向投影,获取反向投影图。

第四步:根据反向投影图和物体的轮廓(也就是输入的方框)进行meanshift迭代,由于它是向重心移动,即向反向投影图中概率大的地方移动,所以始终会移动到物体上。

第五步:然后下一帧图像时用上一帧输出的方框来迭代即可。

总结:用meanshift进行跟踪最重要的一点是输入图像的把握,也就是要让它的迭代能越来越迭代到目标上。这种图像也不一定就是反向投影图,只要是一幅反映当前图像中每个像素点含有目标概率图就可以了,其实反向投影图就是这样的一幅图而已。

时间: 2024-10-23 09:14:40

有关meanshift跟踪的理解(在opencv中实现)(转载)的相关文章

目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)

在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行opencv中给的sample并稍加修改. Camshift函数的原型为:RotatedRect CamShift(InputArray probImage, Rect& window, TermCriteria criteria). 其中probImage为输入图像直方图的反向投影图,window为要

[OpenCV-Python] OpenCV 中视频分析 部分 VI

部分 VI视频分析 39 Meanshift 和 和 Camshift 目标 ? 本节我们要学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象39.1 Meanshift Meanshift 算法的基本原理是和很简单的.假设我们有一堆点(比如直方图反向投影得到的点),和一个小的圆形窗口,我们要完成的任务就是将这个窗口移动到最大灰度密度处(或者是点最多的地方).如下图所示: 初始窗口是蓝色的"C1",它的圆心为蓝色方框"C1_o",而窗

opencv中的meanshift图像切割

Meanshift(均值漂移)是一种在一组数据的密度分布中寻找局部极值的稳定的方法.Meanshift不仅能够用于图像滤波,视频跟踪,还能够用于图像切割. 通过给出一组多维数据点,其维数是(x,y,r,g,b),均值漂移能够用一个窗体扫描空间来找到数据密度最大的区域,能够理解为数据分布最集中的区域. 在这里须要注意,因为空间位置(也就是上面的x和y)的变化范围与颜色的变化范围(上面的r,g,b)有极大的不同,所以,meanshift对这两个维数要採用不同的窗体半径.在opencv自带的means

对OpenCV中3种乘法操作的理解掌握

参考了<Opencv中Mat矩阵相乘--点乘.dot.mul运算详解 >"http://blog.csdn.net/dcrmg/article/details/52404580"的相关内容. 乘法是线性代数的基本操作,在OpenCV中有三种方法实现了乘法. 一.向量乘法 这两幅图像说明的就是向量乘法.在OpenCV中采用" . "来实现,要求是第一个矩阵的列值等于第二个矩阵的行值.且每个矩阵都是float结构. Mat A = Mat(3,3,CV_32

OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 (转)

cv::Matdepth/dims/channels/step/data/elemSizeThe class Mat represents an n-dimensional dense numerical single-channel or multi-channel array. It can be used to store (Mat类的对象用于表示一个多维度的单通道或者多通道稠密数组,它可以用来存储以下东西)real or complex-valued vectors or matrice

目标跟踪之粒子滤波---Opencv实现粒子滤波算法

目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方面的问题.所以本次的代码与前几次改变比较小.当然这些code基本也是参考网上的.代码写得很不规范,时间不够,等以后有机会将其优化并整理成类的形式.)              Opencv实现粒子滤波算法            摘要 本文通过opencv实现了一种目标跟踪算法——粒子滤波算法,算法的

图像金字塔及其在 OpenCV 中的应用范例(下)

前言 本文将主要讲解如何使用 OpenCV 实现图像分割,这也是图像金字塔在 OpenCV 中的一个重要应用. 关于图像分割 在计算机视觉领域,图像分割(Segmentation)指的是将数字图像细分为多个图像子区域(像素的集合)(也被称作超像素)的过程.图像分割的目的是简化或改变图像的表示形式,使得图像更容易理解和分析.[1]图像分割通常用于定位图像中的物体和边界(线,曲线等).更精确的,图像分割是对图像中的每个像素加标签的一个过程,这一过程使得具有相同标签的像素具有某种共同视觉特性. 图像分

meanShift跟踪

这种跟踪和我之前想的一样,应该是首先鼠标选中要跟踪的目标,然后计算其直方图.接下来就根据这个原始直方图计算每一帧的反向投影.(反向投影:opencv docs给出的概念是"一种记录给定图像中的像素点如何适应直方图模型像素分布的方式.简单的讲, 所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征.) 然后根据反向投影用meanshift跟踪  meanShift(backproj, trackWindow,TermCriteria(CV_TERMCRIT_EPS |

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

部分 V图像特征提取与描述 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相信你们大多数人都玩过拼图游戏吧.首先你们拿到一张图片的一堆碎片,要做的就是把这些碎片以正确的方式排列起来从而重建这幅图像.问题是,你怎样做到的呢?如果把你做游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了.如果计算机可以玩拼图,我们就可以给计算机一大堆自然图片,然后就可以让计算机把它拼成一张大图了.如果计算机可以自动拼接自然图片,那我们是不是可