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

粒子滤波的理论实在是太美妙了,用一组不同权重的随机状态来逼近复杂的概率密度函数。其再非线性、非高斯系统中具有优良的特性。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

print?

  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:

//上面这一篇是演示点跟踪,原文http://blog.csdn.net/onezeros/article/details/6319180

//这一篇是上交的一哥们演示的窗口跟踪!(有code)

http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html

from: http://blog.csdn.net/yangtrees/article/details/7616483

时间: 2024-10-11 11:01:23

学习OpenCV——粒子滤波(网上两篇文章总结)的相关文章

两篇文章带你走入.NET Core 世界:Kestrel+Nginx+Supervisor 部署上云服务器(二)

背景: 上一篇:两篇文章带你走入.NET Core 世界:CentOS+Kestrel+Ngnix 虚拟机先走一遍(一) 已经交待了背景,这篇就省下背景了,这是第二篇文章了,看完就木有下篇了. 直接进入主题: 1.购买云服务器 之前在虚拟机跑了一下,感觉还不够真实,于是,准备买台服务器,认真的跑一下. 有阿里云,腾讯云,华为云,还有好多云,去哪买一个? 之前做为华为云的云享专家去参加了一下活动,本来也准备写篇文章,不过相同游记文太多, 这里就转一篇了:让华为云MVP告诉你——在华为的一天可以做什

使用余弦定理计算两篇文章的相似性

使用余弦定理计算两篇文章的相似性:(方法论,细致易懂版) http://blog.csdn.net/dearwind153/article/details/52316151 python 实现(代码): http://outofmemory.cn/code-snippet/35172/match-text-release (结巴分词下载及安装:http://www.cnblogs.com/kaituorensheng/p/3595879.html) java 实现(代码+方法描述): https

对张子阳先生对委托和事件的两篇文章的读后思考(说得很透,内附故事一篇)

第一篇 C#中的委托和事件 第二篇 C#中的委托和事件(续) 首先,张子阳先生的这是两篇关于委托和事件间关系的文章,是目前为止我读过的介绍委托和事件以及异步调用最简明清晰文章,作者通过非常有节奏的"标题"->"问题"->"思路"->"实现"->"讲解"的结构,分步骤一步一步地将委托和事件的实现.应用与原理阐述得非常清楚,并且在行文期间将自己有趣的思考过程通过生动的语言表达了出来,使人

看到关于JS线程的两篇文章

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 [javascript] view plaincopyprint? setTimeout( function(){ alert(’你好!’); } , 0); setInterval( callbackFunction , 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaS

两篇文章的相似度(文章相似度)

package com.etoak.simHash; import com.hankcs.hanlp.seg.common.Term; import com.hankcs.hanlp.tokenizer.StandardTokenizer; import org.apache.commons.lang3.StringUtils; import org.jsoup.Jsoup; import org.jsoup.safety.Whitelist; import java.math.BigInteg

学习OpenCV——Kalman滤波

背景: 卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器), 它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态.卡尔曼滤波的一个典型实例是从一组有限的,包含噪声的,对物体位置的观察序列(可能有偏差)预测出物体的位置的坐标及速度. 这种滤波方法以它的发明者鲁道夫.E.卡尔曼(Rudolph E. Kalman)命名,但是根据文献可知实际上Peter Swerling在更早之前就提出了一种类似的算法. 斯坦利.施密特(Stanley Schmidt)首次实现了卡尔曼滤波器.卡尔曼在NAS

学习OpenCV——Surf(特征点篇)&amp;flann

Surf(Speed Up Robust Feature) Surf算法的原理                                                                            1.构建Hessian矩阵构造高斯金字塔尺度空间 其实surf构造的金字塔图像与sift有很大不同,就是因为这些不同才加快了其检测的速度.Sift采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像.Hessian矩阵是Surf算法的核心,为了方便运

帮朋友写的两篇文章

理解万岁,心怀感恩,热爱生活 时间如白驹过隙,转眼之间又到毕业之际,回想去年刚刚毕业恍如昨日般历历在目,四年的大学生活充满了汗水.喜悦和感动,我成长了不少,也收获了很多.对我印象最深的是毕业季,感慨时间如此漫长,终于从小师妹熬到大师姐,如今已是陕师大的一名校友.虽说告别要趁早,但总是感觉人生已到垂暮之年,还有好多事情没来得及做.人总是后知后觉,人总是后知后觉后还没不愿行动.也不知道当时自己是怎么想的,总想以折腾的方式来对大学生活做最后的告别. 如今我已经在人生的A4纸上草草划去三分之一,未来的三

计算两篇文章相似度

[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)], [(0, 1), (4, 1), (5, 1), (7, 1), (8, 1), (9, 2), (10, 1)], [(0, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (10, 1)]] 例如(9,2)这个元素代表第二篇文档中id为9的单词“silver”出现了2次. 有了这些信息,我们就可以基于这些“训练文档”计算一个TF-IDF