CamShift算法,OpenCV实现1--Back Projection

news/2024/7/21 3:53:08 标签: 算法, null, byte, 图像处理, email, 360
CamShift算法,OpenCV实现1--Back Projection

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/计算机图形学

----------------------------------------------------------------------------------------


【来源】

http://www.niftyadmin.cn/n/1089671.html

相关文章

The servlet name already exists.解决方法

The servlet name already exists.解决方法 当我们建立过同名的servlet文件,然后又将其删掉后再用同类名字建一个servlet时就会报错。解决办法:web.xml里面存有servlet的映射关系,需要自己手动删除web.xml里面的映射关系。 删除,保…

如何使用Vue-cli搭建和运行vue项目

此文章 主要参考:https://jingyan.baidu.com/article/5225f26bbb430fe6fa0908ce.html 在vue init webpack my-project卡住的问题:在vue init webpack my-project卡住的问题 手把手教你用vue-cli搭建vue项目:https://www.cnblogs.com/liaoanr…

CamShift算法,OpenCV实现2-Mean Shift算法

CamShift算法,OpenCV实现2-Mean Shift算法这里来到了CamShift算法,OpenCV实现的第二部分,这一次重点讨论Mean Shift算法。在讨论Mean Shift算法之前,首先讨论在2D概率分布图像中,如何计算某个区域的重心(Ma…

CustomizaitonSpec Clone_VM

克隆虚拟机可以加上CustomizationSpec来自动配置好:IP地址、DNS、Domain等信息 1、可以利用PyVmimo中的vim模块在python中完全自定义CustomizationSpec(比较复杂) 2、可以首先在vSphere Web Client中创建好一个CustomizationSpec,…

CamShift算法,OpenCV实现(3):CamShift算法

CamShift算法,OpenCV实现(3):CamShift算法1.原理在了解了MeanShift算法以后,我们将 MeanShift算法扩展到连续图像序列(一般都是指视频图像序列),这样就形成了CamShift算法。CamShift算法的全称是 "Continuously Apaptive Mea…

gecode中自定义brancher

实际应用中&#xff0c;往往要比官方的示例复杂很多&#xff0c;这里对变量的选择等往往需要以自定义的方式进行选择&#xff0c;这个时候就需要自定义brancher&#xff0c;相关注释在代码中 #include <gecode/int.hh>using namespace Gecode;class NoneMin : public Bra…

oracle约束

约束 Including Constraints在数据库中使用约束(constraints)是为了在该数据库中实施所谓的"业务规则"其实就是防止非法信息进入数据库,满足管理员和应用开发人员所定义的规则集.ORACLE 使用完整性约束(integrity constraints)防止不合法的数据写入数据库,管理员和开…

201671010110 2016-2017 2《java程序设计》

从开学到现在已经是第二周学习java这个新语言了&#xff0c;从开始的完全陌生到现在慢慢了解了它的很多基本知识。就拿标识符来说吧&#xff01;和c语言有相同也有不同&#xff0c;java的标识符由字母下划线&#xff0c;最特别的就是它还有美元符号&#xff0c;数字组成&#x…