meanshift基本原理:

给定d维空间 ​​ 个样本点 ​,​=1,2,...,n,在 ​点的mean shift向量的基本形式定义为:

其中, 是一个半径为h的高维球区域,满足以下关系的y点的集合,

k表示在这n个样本点 中落入 区域中。

是样本点 相对于点的偏移量,mean shift向量  就是对落入区域中的k个样本点相对于点x的偏移量求和然后再平均。 
mean shift 示意图:

可以看出平均偏移量 会指向样本分布最多的区域。公式中落入 的采样点,无论离中心x的远近,对最终计算的影响都一样。但现实跟踪过程中,较远的像素容易受背景或遮挡等因素的影响,因此靠近中心较近的像素应该更重要。故每个样本点的重要性应与其与中心的距离成反比。故引入核函数和权重系数来提高算法的鲁棒性。

核函数即窗口函数,在核估计中起到平滑的作用。常见的有: 
       Flat 核函数:

Gaussian 核函数:

部分核函数:

给出一个核函数:

该函数确定重新估计平均值的附近点的权重。当选择的搜索窗口类型为高斯核时:

概率分布近似为:

由K确定的窗口密度的加权平均值是:

其中:

求梯度:

表达式构成如图:

meanshift算法主要应用于聚类、平滑和跟踪。

meanshift跟踪算法:
       meanshift算法用于视觉跟踪时,将基于前一图像中的对象的颜色直方图在新图像中创建置信度图,并使用均值平移来找到靠近对象旧位置的置信度图的峰值。 置信度图是新图像上的概率密度函数,为新图像的每个像素指定一个概率,该概率是前一图像中的对象中出现的像素颜色的概率。

meanshift跟踪算法步骤: 
     ① 选择搜索窗口,包括窗口的初始位置、大小、形状(对称或歪斜,矩形或圆心)、类型(均匀、多项式、指数或高斯); 
     ② 计算窗口的重心; 
     ③ 将窗口的中心设置在计算出的重心处; 
     ④ 返回②步,直到窗口位置不再变化。
     设目标区域的中心为x,其中n个像素用 =1,...,n表示,特征值个数为m,则目标模型的特征值 u=1,...,m的概率密度估计为:

其中,k为权值系数,赋予靠近中心的像素一个较大权值,远离中心的像素给定较小的权值。 
 的作用是判断目标区域中像素值是否属于第u个特征值。属于时为1,不属于时为0;为灰度值索引函数。 
       C为一标准化的常量系数:
                                                              

这样可以使  

于是可以得到基于图像灰度特征的颜色直方图。

运动目标在第二帧以后的每帧中可能包含目标的区域称为候选区域,其中心坐标即核函数的中心坐标y。该区域中的像素用 =1,...,表示;候选模型的特征值 u=1,...,m的概率密度为:
                                                      

为标准化常量:

Bhattacharyya系数
       利用相似函数描述目标模型和候选模型之间的相似度,理想情况下两个模型的概率分布一样。使用Bhattacharyya系数作为相似函数。 
       令 为Bhattacharyya系数。 
       Bhattacharyya系数是衡量两个统计样本之间重叠量或相对接近度的指标。

对于离散概率分布: 
      对于连续概率分布:
      Bhattacharyya距离为: 
     模板区域: 
     候选区域: 
     相似性函数:

Bhattacharyya系数的值在0到1之间,值越大表示两个模型月相似。跟踪时选择使Bhattacharyya系数最大的候选区域作为当前帧中的目标位置。

camshift算法
       camshift算法就是将meanshift算法扩展到连续图像序列。camshift将视频的所有帧做meanshift运算,并将上一帧的结果(搜索窗的大小和中心),作为下一帧meanshift算法搜索窗的初始值。然后一直迭代下去,实现对目标的跟踪。

函数CamShift()参数说明:

//查找对象中心,大小和方向。
RotatedRect CamShift(
InputArray probImage,//对象直方图的反向投影
CV_IN_OUT Rect& window,//初始搜索窗口
TermCriteria criteria//底层meanShift的停止标准
);

OpenCV3 camshift跟踪:

#include<opencv2/opencv.hpp>
#include<opencv2/tracking.hpp>
using namespace cv;int main()
{VideoCapture capture;Mat frame;//保存目标轨迹  std::vector<Point> pt; capture.open(0);if (!capture.isOpened()){printf("can not open camera \n");return -1;}namedWindow("input", WINDOW_AUTOSIZE);namedWindow("output", WINDOW_AUTOSIZE);capture.read(frame);if (frame.empty())return -1;Rect2d first = selectROI("output", frame);Rect selectionROI;selectionROI.width = first.width;selectionROI.height = first.height;selectionROI.x = first.x;selectionROI.y = first.y;printf("x= %d, y=%d, width=%d, height=%d",selectionROI.x,selectionROI.y,selectionROI.width,selectionROI.height);Mat mask, hist, backproject;int bins = 120;Mat drawImg = Mat::zeros(300, 300, CV_8UC3);while (capture.read(frame)){Mat hsvimage;cvtColor(frame, hsvimage, CV_BGR2HSV);inRange(hsvimage, Scalar(25, 43, 46), Scalar(35, 256, 256), mask);Mat hue = Mat(hsvimage.size(), hsvimage.depth());int channels[] = {0, 0};mixChannels(&hsvimage, 1, &hue, 1, channels, 1);//ROI直方图计算Mat roi(hue, first);Mat maskroi(mask, first);float hrange[] = {0, 180};const float* hranges = hrange;//直方图calcHist(&roi, 1, 0, maskroi, hist, 1, &bins, &hranges);normalize(hist, hist, 0, 255, NORM_MINMAX);int binw = drawImg.cols/ bins;Mat colorIndex = Mat(1, bins, CV_8UC3);for (int i = 0; i < bins; i++){colorIndex.at<Vec3b>(0, i) = Vec3b(saturate_cast<uchar>(i * 180 / bins), 255, 255);}cvtColor(colorIndex, colorIndex, COLOR_HSV2BGR);for (int i = 0; i < bins; i++){int val = saturate_cast<int>(hist.at<float>(i)*drawImg.rows/255);rectangle(drawImg, Point(i*binw, drawImg.rows), Point((i+1)*binw, drawImg.rows * val), Scalar(colorIndex.at<Vec3b>(0, i)), -1, 8, 0);}//计算直方图的反投影calcBackProject(&hue, 1, 0, hist, backproject, &hranges);backproject &= mask;RotatedRect trackBox = CamShift(backproject, selectionROI, TermCriteria((TermCriteria::COUNT | TermCriteria::EPS), 10, 1));Rect rect; rect.x = trackBox.center.x - trackBox.size.width/2.0;rect.y = trackBox.center.y - trackBox.size.height/2.0;rect.width = trackBox.size.width;rect.height = trackBox.size.height;rectangle(frame, rect, Scalar(255, 255, 0),3);pt.push_back(Point(rect.x+rect.width/2,rect.y+rect.height/2));  for(int i=0;i<pt.size()-1;i++) {    line(frame,pt[i],pt[i+1],Scalar(0,255,0),2.5);    } imshow("input", frame);imshow("output", drawImg);waitKey(10);}capture.release();return 0;
}

转载:https://blog.csdn.net/akadiao/article/details/78991095

目标检测(二): meanshift与camshift算法相关推荐

  1. OpenCV均值移位(Meanshift)和Camshift算法

    OpenCV Meanshift和Camshift算法 Meanshift和Camshift算法 目标 均值漂移Meanshift OpenCV中的Meanshift Camshift OpenCV中 ...

  2. opencv python 多帧降噪算法_OpenCV-Python中用于视频跟踪的Meanshift和Camshift算法介绍...

    学习目标 在本章中, 我们将学习用于跟踪视频中对象的Meanshift和Camshift算法. Meanshift Meanshift背后的直觉很简单,假设你有点的集合.(它可以是像素分布,例如直方图 ...

  3. CVPR2018 目标检测(object detection)算法总览

    CVPR2018上关于目标检测(object detection)的论文比去年要多很多,而且大部分都有亮点.从其中挑了几篇非常有意思的文章,特来分享,每篇文章都有详细的博客笔记,可以点击链接阅读. 1 ...

  4. 【AI面试】目标检测中one-stage、two-stage算法的内容和优缺点对比汇总

    在深度学习领域中,图像分类,目标检测和目标分割是三个相对来说较为基础的任务了.再加上图像生成(GAN,VAE,扩散模型),keypoints关键点检测等等,基本上涵盖了图像领域大部分场景了. 尤其是在 ...

  5. 使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象

    使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象 1. 效果图 2. 源码 2.1 MeanShift 2.2 Camshift(Continuo ...

  6. ECCV2018目标检测(object detection)算法总览

    ECCV2018目标检测(object detection)算法总览 原文:https://blog.csdn.net/u014380165/article/details/82025720 1.IO ...

  7. 目标检测之DSOD:SSD算法的优化

    github代码:https://github.com/szq0214/DSOD 由于深度学习需要大量的训练数据,而针对特定任务需求的训练样本往往是有限的,通常情况下,目标检测算法会先使用在海量数据( ...

  8. tensorflow精进之路(二十三)——Object Detection API目标检测(上)(Fast R-CNN算法)

    1.概述 上一讲,我们使用slim库对图片进行检测,每个物品用同一种颜色标注,显得乱七八糟的.这一讲,我们来学习目标检测.目标检测就是,输入一张图片,输出是将该图片中所含的所有目标物体识别,并标记出他 ...

  9. python opencv入门 Meanshift 和 Camshift 算法(40)

    内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 在本章,学习Meanshift算法和Camshift算法来寻找和追踪视频中的目标物体. Meanshift算法: mean ...

  10. 目标检测 | 清晰易懂的SSD算法原理综述

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 SSD(Single Shot Detection)是一个流行且强 ...

最新文章

  1. 基于FAST-RCNN深度学习的目标识别算法的MATLAB仿真
  2. 读书笔记《单核工作法》_3原理2,3
  3. Linux 查看磁盘分区、文件系统、磁盘的使用情况相关的命令和工具介绍
  4. 使用canvas绘制动画时钟
  5. Ajax 实现在WebForm中拖动控件并即时在服务端保存状态数据 (Asp.net 2.0)(示例代码下载)...
  6. ES6学习笔记(三)—— Set 和 Map
  7. luoguP1090 合并果子 (贪心+优先队列)
  8. mysql能将查询结果与表左查询_mysql重点,表查询操作和多表查询
  9. 2022全球量子通信产业发展报告
  10. 《哈佛大学幸福课》笔记
  11. 只有1kb的清理软件_1kb文件夹快捷方式病毒专杀工具下载
  12. 【附资料】PMP证书有用吗?
  13. Dolphinscheduler/海豚调度器的安装
  14. 【视野】解密腾讯完整前端技术体系
  15. 艾永亮:超级产品战略实现企业超级增长,五个案例给出最佳答案!
  16. 2020-10-30
  17. 三农经济的空缺,农业理财平台还能回暖吗?
  18. 2018 ACM-ICPC青岛现场赛 B题 Kawa Exam 题解 ZOJ 4059
  19. 流媒体并发量与宽带、码率计算详解
  20. 医药数字化的中国实践

热门文章

  1. 微型计算机中的存储容量1TB等于,自考计算机应用基础_通关宝典
  2. python语法详解大全_Python语法大全
  3. 亲测可用企业级自动发卡平台系统源码
  4. c++代码打印爱心图(适用初学者)
  5. 「企业架构」TOGAF的权威指南
  6. RF接口测试中的重复执行
  7. RedHat 7 更换 yum 源为 CentOS 或网易镜像源
  8. 【安装sql 2008步骤】
  9. 使用C#调用P6 Primavera WebService(自建服务IntegrationAPI)
  10. 施乐S2011设置IP地址,打印自检页方法