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

filter的一个实现,而且有范例,但估计不少人对它的使用并不清楚,因为我也是其中一个。本文的应用是对二维坐标进行预测和平滑

使用方法:

1、初始化

const int stateNum=4;//状态数,包括(x,y,dx,dy)坐标及速度(每次移动的距离)

const int measureNum=2;//观测量,能看到的是坐标值,当然也可以自己计算速度,但没必要

Kalman* kalman = cvCreateKalman( stateNum, measureNum, 0

);//state(x,y,detaX,detaY)

转移矩阵或者说增益矩阵的值好像有点莫名其妙

floatA[stateNum][stateNum] ={//transition matrix

1,0,1,0,

0,1,0,1,

0,0,1,0,

0,0,0,1

};

看下图就清楚了

X1=X+dx,依次类推

所以这个矩阵还是很容易却确定的,可以根据自己的实际情况定制转移矩阵

同样的方法,三维坐标的转移矩阵可以如下

floatA[stateNum][stateNum] ={//transition matrix

1,0,0,1,0,0,

0,1,0,0,1,0,

0,0,1,0,0,1,

0,0,0,1,0,0,

0,0,0,0,1,0,

0,0,0,0,0,1

};

当然并不一定得是1和0

2.预测cvKalmanPredict,然后读出自己需要的值

3.更新观测矩阵

4.更新CvKalman

只有第一步麻烦些。上述这几步跟代码中的序号对应

如果你在做tracking,下面的例子或许更有用些。

#include

#include

#include

#include

#include

#include

usingnamespacestd;

constintwinHeight=600;

constintwinWidth=800;

CvPoint mousePosition=cvPoint(winWidth>>1,winHeight>>1);

//mouse event callback

voidmouseEvent(intevent,intx,inty,intflags,void*param )

{

if(event==CV_EVENT_MOUSEMOVE) {

mousePosition=cvPoint(x,y);

}

}

intmain (void)

{

//1.kalman filter setup

constintstateNum=4;

constintmeasureNum=2;

CvKalman* kalman = cvCreateKalman( stateNum, measureNum, 0 );//state(x,y,detaX,detaY)

CvMat* process_noise = cvCreateMat( stateNum, 1, CV_32FC1 );

CvMat* measurement = cvCreateMat( measureNum, 1, CV_32FC1 );//measurement(x,y)

CvRNG rng = cvRNG(-1);

floatA[stateNum][stateNum] ={//transition matrix

1,0,1,0,

0,1,0,1,

0,0,1,0,

0,0,0,1

};

memcpy( kalman->transition_matrix->data.fl,A,sizeof(A));

cvSetIdentity(kalman->measurement_matrix,cvRealScalar(1) );

cvSetIdentity(kalman->process_noise_cov,cvRealScalar(1e-5));

cvSetIdentity(kalman->measurement_noise_cov,cvRealScalar(1e-1));

cvSetIdentity(kalman->error_cov_post,cvRealScalar(1));

//initialize post state of kalman filter at random

cvRandArr(&rng,kalman->state_post,CV_RAND_UNI,cvRealScalar(0),cvRealScalar(winHeight>winWidth?winWidth:winHeight));

CvFont font;

cvInitFont(&font,CV_FONT_HERSHEY_SCRIPT_COMPLEX,1,1);

cvNamedWindow("kalman");

cvSetMouseCallback("kalman",mouseEvent);

IplImage* img=cvCreateImage(cvSize(winWidth,winHeight),8,3);

while(1){

//2.kalman prediction

constCvMat* prediction=cvKalmanPredict(kalman,0);

CvPoint predict_pt=cvPoint((int)prediction->data.fl[0],(int)prediction->data.fl[1]);

//3.update measurement

measurement->data.fl[0]=(float)mousePosition.x;

measurement->data.fl[1]=(float)mousePosition.y;

//4.update

cvKalmanCorrect( kalman, measurement );

//draw

cvSet(img,cvScalar(255,255,255,0));

cvCircle(img,predict_pt,5,CV_RGB(0,255,0),3);//predicted point with green

cvCircle(img,mousePosition,5,CV_RGB(255,0,0),3);//current position with red

charbuf[256];

sprintf_s(buf,256,"predicted position:(=,=)",predict_pt.x,predict_pt.y);

cvPutText(img,buf,cvPoint(10,30),&font,CV_RGB(0,0,0));

sprintf_s(buf,256,"current position :(=,=)",mousePosition.x,mousePosition.y);

cvPutText(img,buf,cvPoint(10,60),&font,CV_RGB(0,0,0));

cvShowImage("kalman", img);

intkey=cvWaitKey(3);

if(key==27){//esc

break;

}

}

cvReleaseImage(&img);

cvReleaseKalman(&kalman);

return0;

}

kalman filter 视频演示:

demo snapshot:

opencv 卡尔曼 java_卡尔曼滤波经典例子(opencv)相关推荐

  1. Android Studio 导入OpenCV 并调试运行face-detection例子

    系统:Ubuntu 14.04 Studio版本:2.3.3 OpenCV版本:2.4.11 第一部分 将OpenCV导入到项目中 1.从Google Android 开发中文网站上下载 Androi ...

  2. opencv联合dlib人脸检测例子二(加快检测)

    本篇博客是在opencv联合dlib人脸检测例子的基础上改进了下,加快检测流程 观察了下,opencv利用haar级联分类器检测人脸区域的速度要稍快于dlib的frontal_face_detecto ...

  3. opencv 星空_opencv各种小例子

    图像腐蚀 #include //OpenCV highgui 模块头文件 ~ #include //OpenCV 图像处理头文件 using namespace cv; // 包含 cv 命名空间 i ...

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

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

  5. opencv 打印文字_如何使用OpenCV+Python去除手机拍摄文本底色

    点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 起因 最近经常被要求手机拍摄考试卷,但是拍摄完之后,跟实际的黑白考试卷有很大的色差,打印出来之后背景就变成了灰 ...

  6. 【OpenCV入门教程之十七】OpenCV重映射 SURF特征点检测合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨) ...

  7. Opencv的使用小教程2——Opencv常用图像处理函数汇总

    Opencv的使用小教程2--Opencv常用图像处理函数汇总 1.blur 2.GaussianBlur 3.medianBlur 4.bilateralFilter 5.腐蚀和膨胀 6.morph ...

  8. 【从零学习OpenCV】4Ubuntu系统中安装OpenCV 4

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...

  9. python爬虫经典教程-python爬虫经典例子有哪些

    python爬虫例子:首先导入爬虫的库,生成一个response对象:然后设置编码格式,并打印状态码:最后输出爬取的信息,代码为[print(response.text)]. python爬虫例子: ...

最新文章

  1. 使用Recast.AI创建具有人工智能的聊天机器人
  2. 【转】FPGA到底是啥?
  3. html div模块前留空白,html – 3个DIV彼此相邻,中间填充空白
  4. AC日记——红色的幻想乡 洛谷 P3801
  5. Map<String, Object> map=new HashMap<String, Object>();
  6. Netty实战——Channel、EventLoop和ChannelFuture详解
  7. C语言 qq自动点赞程序,qq自动无限点赞脚本
  8. 第二届广东省大学生网络攻防大赛 simple_re
  9. 期权定价 - BS模型 - 维纳过程和伊藤引理
  10. Mac配置/关闭代理命令
  11. 阿里云服务器的使用以及虚拟机创建用户
  12. Keep It for Mac 1.3.4 强大的笔记本工具 破解版下载
  13. 我的Go+语言初体验——初学者的快速入门
  14. Linux重要命令-sar
  15. 情感类短视频如何定位?五种情感短视频类型分享,总有一种适合你
  16. sakai上传大文件失败解决方案
  17. 强化学习算法DQN:算法简介、创新点:回放机制target-network、伪代码、算法理解、代码实现、tensorboard展示网络结构
  18. 学习appium必备的避坑指南
  19. Dahua Lin是香港中文大学汤晓鸥教授的高徒,在计算机视觉/机器学习方面有很深的造诣。他在自己的主页上有一个推荐书表,值得大家作为参考。 全英文版的,感觉到与国际接轨的压力了!!!
  20. 歪果仁眼中的中国科技界必须知道的7件事

热门文章

  1. 高性能的MySQL(5)索引策略
  2. SUN PORTAL 7.2安装在windows 的问题解决办法!
  3. Apple高规格推3232吋LCD面板XDR
  4. 2018年台湾为陕西最大贸易伙伴
  5. Charles 从入门到精通
  6. UVA227 Puzzle
  7. 分布式监控报警平台Centreon之:Centreon安装(1)
  8. c++ 学习笔记 c++ 引用C库注意点:#ifdef __cplusplus 倒底是什么意思?
  9. js中apply和Math.max()函数的问题?
  10. windows time 服务无法启动 错误1058 解决方法