CamShift算法,即"Continuously Apative Mean-Shift"算法,是一种运动跟踪算法。它主要通过视频图像中运动物体的颜色信息来达到跟踪的目的。我把这个算法分解成三个部分,便于理解:
1) Back Projection计算
2) Mean Shift算法
3) CamShift算法
在这里主要讨论Back Projection,在随后的文章中继续讨论后面两个算法。

Back Projection
计算Back Projection的步骤是这样的:
1. 计算被跟踪目标的色彩直方图。在各种色彩空间中,只有HSI空间(或与HSI类似的色彩空间)中的H分量可以表示颜色信息。所以在具体的计算过程中,首先将其他的色彩空间的值转化到HSI空间,然后会其中的H分量做1D直方图计算。
2. 根据获得的色彩直方图将原始图像转化成色彩概率分布图像,这个过程就被称作"Back Projection"。
在OpenCV中的直方图函数中,包含Back Projection的函数,函数原型是:
   void cvCalcBackProject(IplImage** img, CvArr** backproject, const CvHistogram* hist);
传递给这个函数的参数有三个:
1. IplImage** img:存放原始图像,输入。
2. CvArr** backproject:存放Back Projection结果,输出。
3. CvHistogram* hist:存放直方图,输入

下面就给出计算Back Projection的OpenCV代码。
1.准备一张只包含被跟踪目标的图片,将色彩空间转化到HSI空间,获得其中的H分量:
  IplImage* target=cvLoadImage("target.bmp",-1);  //装载图片
  IplImage* target_hsv=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 );
  IplImage* target_hue=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 );
  cvCvtColor(target,target_hsv,CV_BGR2HSV);       //转化到HSV空间
  cvSplit( target_hsv, target_hue, NULL, NULL, NULL );    //获得H分量
2.计算H分量的直方图,即1D直方图:
  IplImage* h_plane=cvCreateImage( cvGetSize(target_hsv),IPL_DEPTH_8U,1 );
  int hist_size[]={255};          //将H分量的值量化到[0,255]
  float* ranges[]={ {0,360} };    //H分量的取值范围是[0,360)
  CvHistogram* hist=cvCreateHist(1, hist_size, ranges, 1);
  cvCalcHist(&target_hue, hist, 0, NULL);
在这里需要考虑H分量的取值范围的问题,H分量的取值范围是[0,360),这个取值范围的值不能用一个byte来表示,为了能用一个byte表示,需要将H值做适当的量化处理,在这里我们将H分量的范围量化到[0,255].
4.计算Back Projection:
  IplImage* rawImage;
  //----------------------------------------------
  //get from video frame,unsigned byte,one channel
  //----------------------------------------------
  IplImage* result=cvCreateImage(cvGetSize(rawImage),IPL_DEPTH_8U,1);
  cvCalcBackProject(&rawImage,result,hist);
5.结果:result即为我们需要的.

算法分析
用在cvCalcBackProject处理中的模板是目标图像色调(HUE)的直方图,而直方图可以看作是一种概率分布图。在处理前,目标图像中的每一个象素的值描述的在这一点的颜色信息,而处理后,图像中每一个象素的值就变成了这个颜色信息出现在此处的可能性的一种离散化的度量,出现的可能性大,象素的值就大,反之则小。这样就为后面的匹配和跟踪提供了线索。

-----------------------------致力于多媒体技术,成为有思想的软件工程师------------------------

此文章为我原创作品,若要转载,请和本人联系,或注明出处。
欢迎大家对文章内容提出宝贵意见,同时希望大家及时指出文中的错误之处,这样我可以及时更正。
我的联系方式:
QQ: 7578420
Email: shichongdong80@gmail.com
注:由于现在本人已经上班,没有时间挂在QQ上,所以我很乐意和大家用Email交流以下研究领域:
  图像处理/视频处理/OpenCV/计算机图形学

CamShift算法,OpenCV实现1--Back Projection相关推荐

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

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

  2. OpenCV camshift算法的实例(附完整代码)

    OpenCV camshift算法的实例 OpenCV camshift算法的实例 OpenCV camshift算法的实例 #include <iostream> #include &l ...

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

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

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

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

  5. OpenCV总结:目标跟踪之CamShift算法

    CamShift算法全称是"Continuously Adaptive Mean-Shift"(连续的自适应MeanShift算法),是对MeanShift算法的改进算法,可以在跟 ...

  6. Camshift算法原理及其Opencv实现

    Camshift原理 camshift利用目标的颜色直方图模型将图像转换为颜色概率分布图,初始化一个搜索窗的大小和位置,并根据上一帧得到的结果自适应调整搜索窗口的位置和大小,从而定位出当前图像中目标的 ...

  7. opencv实现camshift算法,以及代码详解

    大家好哦,小编来讲程序啦,好好看哦,慢慢体会...一.说明实验介绍本次实验将使用利用 OpenCV 来实现对视频中感兴趣的动态物体的追踪. 首先我贴出我的水下追踪效果图吧 在图中我们可以看到鱼的追踪轨 ...

  8. Opencv目标跟踪—CamShift算法

    CamShift算法全称是"Continuously Adaptive Mean-Shift"(连续的自适应MeanShift算法),是对MeanShift算法的改进算法,可以在跟 ...

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

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

  10. Camshift 算法原理

    1.基于MeanShift的Camshift算法原理详解(整理) meanshift算法思想其实很简单:利用概率密度的梯度爬升来寻找局部最优.它要做的就是输入一个在图像的范围,然后一直迭代(朝着重心迭 ...

最新文章

  1. softsign与tanh的比较
  2. PDU (Protocol Data Unit) - 协议数据单元
  3. LeetCode 136. 只出现一次的数字(异或^)
  4. mysql-5.7在CentOS-7下的rpm安装
  5. php 英文引号转义,如何用引号转义php exec()命令
  6. ftp安装包_【干货分享】原来cisco通过FTP,TFTP系统升级是这样做的?
  7. Action三种编写方式
  8. java备忘录模式应用场景_Java描述设计模式(24):备忘录模式
  9. 《HTML5+CSS3网页设计入门必读》——1.11 小结
  10. 医学流体力学血流动力学仿真模拟计算及临床应用
  11. 大数据司法时代的立言、立功与立德
  12. 计算机控制教师端,摆脱学校机房教师端控制的方法汇总
  13. java.lang.IllegalArgumentException: The number of object passed must be even but was [1]
  14. 创业之前必须要做的八个测试(上)
  15. 利用nero 8刻录DVD教程
  16. c语言布尔变量逻辑运算,在C ++中对布尔值使用按位运算符
  17. 【社会经验】如何高效的学习?
  18. python学习 -女神或者男神把微信消息撤回后好慌,有了这个妈妈再也不担心你看不到女神或者男神撤回的消息了(超详解)...
  19. 必收藏的实用网站(一)
  20. Servlet转发和重定向的异同

热门文章

  1. [转]asp导入excel数据到sql 2000
  2. [转]C#加密解密源码
  3. 阿里云服务器Java+Mysql+Tomcat环境搭建(Mac OS下配置)
  4. Excel GET.DOCUMENT说明
  5. Hibernate读书笔记-----Hibernate的关联映射之N-1关联映射
  6. .Net中的设计模式——Strategy模式
  7. 一分钟搭建Spring Boot
  8. cmd 编码修改。 牛阿。 解决问题
  9. 修改tomcat的部署名称
  10. 如何优雅的输出PHP调试信息