粒子滤波的理论实在是太美妙了,用一组不同权重的随机状态来逼近复杂的概率密度函数。其再非线性、非高斯系统中具有优良的特性。opencv给出了一个实现,但是没有给出范例,学习过程中发现网络上也找不到。learning opencv一书中有介绍,但距离直接使用还是有些距离。在经过一番坎坷后,终于可以用了,希望对你有帮助。

本文中给出的例子跟 我的另一篇博文是同一个应用例子,都是对二维坐标进行平滑、预测

使用方法:

1.创建并初始化

const int stateNum=4;//状态数
 const int measureNum=2;//测量变量数
 const int sampleNum=2000;//粒子数

CvConDensation* condens = cvCreateConDensation(stateNum,measureNum,sampleNum);

在不影响性能的情况下,粒子数量越大,系统表现的越稳定

其他初始化内容请参考learning opencv

2.预测
3.更新例子可信度,也就是权重。本例中更新方法与learning opencv中有所不同,想看代码 
4.更新CvConDensation

代码:

[cpp] view plain copy
  1. #include <cv.h>
  2. #include <cxcore.h>
  3. #include <highgui.h>
  4. #include <cvaux.h>
  5. #include <cmath>
  6. #include <vector>
  7. #include <iostream>
  8. using namespace std;
  9. const int winHeight=600;
  10. const int winWidth=800;
  11. CvPoint mousePosition=cvPoint(winWidth>>1,winHeight>>1);
  12. //mouse event callback
  13. void mouseEvent(int event,int x,int y,int flags,void *param )
  14. {
  15. if (event==CV_EVENT_MOUSEMOVE) {
  16. mousePosition=cvPoint(x,y);
  17. }
  18. }
  19. int main (void)
  20. {
  21. //1.condensation setup
  22. const int stateNum=4;
  23. const int measureNum=2;
  24. const int sampleNum=2000;
  25. CvConDensation* condens = cvCreateConDensation(stateNum,measureNum,sampleNum);
  26. CvMat* lowerBound;
  27. CvMat* upperBound;
  28. lowerBound = cvCreateMat(stateNum, 1, CV_32F);
  29. upperBound = cvCreateMat(stateNum, 1, CV_32F);
  30. cvmSet(lowerBound,0,0,0.0 );
  31. cvmSet(upperBound,0,0,winWidth );
  32. cvmSet(lowerBound,1,0,0.0 );
  33. cvmSet(upperBound,1,0,winHeight );
  34. cvmSet(lowerBound,2,0,0.0 );
  35. cvmSet(upperBound,2,0,0.0 );
  36. cvmSet(lowerBound,3,0,0.0 );
  37. cvmSet(upperBound,3,0,0.0 );
  38. float A[stateNum][stateNum] ={
  39. 1,0,1,0,
  40. 0,1,0,1,
  41. 0,0,1,0,
  42. 0,0,0,1
  43. };
  44. memcpy(condens->DynamMatr,A,sizeof(A));
  45. cvConDensInitSampleSet(condens, lowerBound, upperBound);
  46. CvRNG rng_state = cvRNG(0xffffffff);
  47. for(int i=0; i < sampleNum; i++){
  48. condens->flSamples[i][0] = float(cvRandInt( &rng_state ) % winWidth); //width
  49. condens->flSamples[i][1] = float(cvRandInt( &rng_state ) % winHeight);//height
  50. }
  51. CvFont font;
  52. cvInitFont(&font,CV_FONT_HERSHEY_SCRIPT_COMPLEX,1,1);
  53. char* winName="condensation";
  54. cvNamedWindow(winName);
  55. cvSetMouseCallback(winName,mouseEvent);
  56. IplImage* img=cvCreateImage(cvSize(winWidth,winHeight),8,3);
  57. bool isPredictOnly=false;//trigger for prediction only,press SPACEBAR
  58. while (1){
  59. //2.condensation prediction
  60. CvPoint predict_pt=cvPoint((int)condens->State[0],(int)condens->State[1]);
  61. float variance[measureNum]={0};
  62. //get variance/standard deviation of each state
  63. for (int i=0;i<measureNum;i++) {
  64. //sum
  65. float sumState=0;
  66. for (int j=0;j<condens->SamplesNum;j++) {
  67. sumState+=condens->flSamples[i][j];
  68. }
  69. //average
  70. sumState/=sampleNum;
  71. //variance
  72. for (int j=0;j<condens->SamplesNum;j++) {
  73. variance[i]+=(condens->flSamples[i][j]-sumState)*
  74. (condens->flSamples[i][j]-sumState);
  75. }
  76. variance[i]/=sampleNum-1;
  77. }
  78. //3.update particals confidence
  79. CvPoint pt;
  80. if (isPredictOnly) {
  81. pt=predict_pt;
  82. }else{
  83. pt=mousePosition;
  84. }
  85. for (int i=0;i<condens->SamplesNum;i++) {
  86. float probX=(float)exp(-1*(pt.x-condens->flSamples[i][0])
  87. *(pt.x-condens->flSamples[i][0])/(2*variance[0]));
  88. float probY=(float)exp(-1*(pt.y-condens->flSamples[i][1])
  89. *(pt.y-condens->flSamples[i][1])/(2*variance[1]));
  90. condens->flConfidence[i]=probX*probY;
  91. }
  92. //4.update condensation
  93. cvConDensUpdateByTime(condens);
  94. //draw
  95. cvSet(img,cvScalar(255,255,255,0));
  96. cvCircle(img,predict_pt,5,CV_RGB(0,255,0),3);//predicted point with green
  97. char buf[256];
  98. sprintf_s(buf,256,"predicted position:(%3d,%3d)",predict_pt.x,predict_pt.y);
  99. cvPutText(img,buf,cvPoint(10,30),&font,CV_RGB(0,0,0));
  100. if (!isPredictOnly) {
  101. cvCircle(img,mousePosition,5,CV_RGB(255,0,0),3);//current position with red
  102. sprintf_s(buf,256,"real position :(%3d,%3d)",mousePosition.x,mousePosition.y);
  103. cvPutText(img,buf,cvPoint(10,60),&font,CV_RGB(0,0,0));
  104. }
  105. cvShowImage(winName, img);
  106. int key=cvWaitKey(30);
  107. if (key==27){//esc
  108. break;
  109. }else if (key==' ') {//trigger for prediction
  110. //isPredict=!isPredict;
  111. if (isPredictOnly) {
  112. isPredictOnly=false;
  113. }else{
  114. isPredictOnly=true;
  115. }
  116. }
  117. }
  118. cvReleaseImage(&img);
  119. cvReleaseConDensation(&condens);
  120. return 0;
  121. }

kalman filter 视频演示:

演示中粒子数分别为100,200,2000

请仔细观测效果

http://v.youku.com/v_show/id_XMjU4MzE0ODgw.html

demo snapshot:

粒子滤波 演示与opencv代码相关推荐

  1. kalman 滤波 演示与opencv代码

    在机器视觉中追踪时常会用到预测算法,kalman是你一定知道的.它可以用来预测各种状态,比如说位置,速度等.关于它的理论有很多很好的文献可以参考.opencv给出了kalman filter的一个实现 ...

  2. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  3. 粒子滤波算法(Matlab代码实现)

  4. 非线性非高斯模型的改进粒子滤波算法(Matlab代码实现)

  5. 粒子滤波和蒙特卡洛定位

    算法主要过程如下: 1.根据观测更新粒子权重 2.根据权重resample,也就是根据权重更新所有粒子位置,并使得所有粒子权重恢复到一样. 3.利用一个模型让所有粒子随着robot的移动而移动. 无公 ...

  6. 学习OpenCV——粒子滤波(网上两篇文章总结)

    粒子滤波的理论实在是太美妙了,用一组不同权重的随机状态来逼近复杂的概率密度函数.其再非线性.非高斯系统中具有优良的特性.opencv给出了一个实现,但是没有给出范例,学习过程中发现网络上也找不到.le ...

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

    目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方 ...

  8. OpenCV3学习(12.5) opencv实现粒子滤波目标跟踪

    OpenCV高版本已经把粒子滤波的CV方面的condensation算法给去掉了,以前学的condensation算法不能用C++开发还是只能用C版本,(OpenCV3学习(12.4) 粒子滤波Con ...

  9. 【回归预测】基于粒子滤波实现锂离子电池寿命预测附matlab代码

    1 内容介绍 随着现代生产生活对系统设备可靠性.安全性要求的提高,从成本.可靠 性的角度考虑,电子系统正逐步由原来的定期维修变成视情维修(CBM, Condition Based Maintenanc ...

最新文章

  1. 刚刚,华为重磅宣布:无人驾驶正式上高速!
  2. jtree 默认展开树的全部节点
  3. 互斥信号量的等待与通知
  4. django-oscar-paypal出现UnicodeEncodeError: 'latin-1' codec can't encode characters in position XXXX
  5. linux中用户与组的概念,Linux用户和组的概念
  6. 传360以原彩虹QQ研发团队为班底拟强推IM
  7. Leetcode--1014. 最佳观光组合(java)
  8. 在CentOs7上yum安装redis
  9. 不思议迷宫c语言基础,不思议迷宫——新手入门所学
  10. iPhone应用中APNS推送通知流程代码实现案例
  11. MySQL 计算字段长度函数LENGTH()与CHAR_LENGTH()
  12. 【GPT-3】第1章 大型语言模型时代
  13. 2019-05-15过了这么久我才写了这么点Hhhhhhhh今天也没有刷题我真的不是偷懒啊只是想赶紧弄完老师给的任务今天写的也很匆忙一会儿回去给姥姥姥爷打个电话然后买个晚餐回宿舍洗澡找妈妈视频啦啦啦了
  14. 漫谈京东(一)——自营手机类商品数据分析
  15. 在c51语言中当while语句中条件,在C51语言中,当do-while语句中的条件为( )时,结束循环。...
  16. 停车还能360全方位影像_路虎(揽胜运动星脉极光发现)车主如何选购360全景安全辅助系统...
  17. 计算机漏洞英语怎么说,游戏漏洞英文怎么写
  18. 记录一下自己写的小工具:shell 调度 SQL 批处理,递归查找调度路径
  19. clang vectorization
  20. 使用CRM客户关系管理软件有哪些优势?

热门文章

  1. c/c++中typedef详解(此文对typedef用于结构体的定义说明得很清楚到位)
  2. 在浏览器输入URL回车之后发生了什么
  3. C++中std::function和std::bind
  4. html模板存储在mysql_Python爬虫架构5模板 | 你真的会写爬虫吗?
  5. .Net转Java自学之路—Hibernate框架篇三(查询方式)
  6. 智能家庭本周锋闻:进击的情趣
  7. Cocos2dx学习笔记9:cocos2dx锚点(Anchor Point)
  8. ubuntu12.04下android开发环境搭建两个注意事项
  9. 免费阿里云服务器超爽体验(为阿里做个广告吧)
  10. 通过ajax调用WebService服务