opencv 卡尔曼滤波器例子,自己修改过
一、卡尔曼滤波器的理论解释
http://blog.csdn.net/lindazhou2005/article/details/1534234(推荐)
二、代码中一些随机数设置函数,在opencv中文网站上没有查到:
cvRandInit()
初始化CvRandState数据结构,可以选定随机分布的种类,并给定它种子,有两种情形
cvRandInit(CvRandState数据结构,随机上界,随机下界,均匀分布参数,64bits种子的数字)
cvRandInit(CvRandState数据结构,平均数,标准偏差,常态分布参数,64bits种子的数字)
cvRandSetRange()
修改CvRandState数据结构的参数内容,均匀分布的话可以每个信道的上下界常态分布可以修改每个通道的平均数,标准偏差.
cvRandSetRange(CvRandState数据结构,均匀分布上界,均匀分布下界,目标信道数据)
cvRandSetRange(CvRandState数据结构,常态分布平均数,常态分布标准偏差,目标信道数据)
cvRand()
将CvMat或IplImage数据结构随机化,用被设定过的CvRandState数据结构来随机.
cvRand(CvRandState数据结构,CvMat或IplImage数据结构)
cvbRand()
将一维数组随机化,可以设定随机的长度
cvbRand(RandState数据结构,Float型别数组名,随机的长度);
http://blog.csdn.net/jiangdf/article/details/4553520
#define cvMatMulAdd( src1, src2, src3, dst ) cvGEMM( src1, src2, 1, src3, 1, dst, 0 )
三、
1、情景说明:
假设有一个做圆周运动的点,就像一辆在赛道上行驶的汽车,汽车以恒定的速度行驶。使用kalman滤波器跟踪这个汽车。程序运行结果,红圈代表理想运动汽车,,黄圈代表kalman滤波器预测汽车的位置,白圈代表观测得到汽车的位置,蓝圈代表kalman滤波器获得汽车的位置(速度这一分量,可以观察图中圆的运动速度)。
2、代码:
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
int main (int argc,int ** argv)
{
// Initialize Kalman filter object, window, number generator, etc
cvNamedWindow( "Kalman", 1 );//创建窗口,当为的时候,表示窗口大小自动设定
CvRandState rng;
//cvRandInit( &rng, 0, 1, -1, CV_RAND_UNI );/* CV_RAND_UNI 指定为均匀分布类型、随机数种子为-1 *///怎么接下来又改为高斯分布
cvRandInit(&rng,0,0.1,-1,CV_RAND_NORMAL);//自己添加,原函数中先设为均匀分布再改回,觉得没有必要
IplImage* img = cvCreateImage( cvSize(500,500), 8, 3 );
CvKalman* kalman = cvCreateKalman( 2, 1, 0 );/*状态向量为2维,观测向量为1维,无激励输入维*/
// State is phi, delta_phi - angle and angular velocity
// Initialize with random guess
CvMat* x_k = cvCreateMat( 2, 1, CV_32FC1 );/*创建行列、元素类型为CV_32FC1,元素为位单通道浮点类型矩阵。*/
//cvRandSetRange( &rng, 0, 0.1, 0 );/*设置随机数范围,随机数服从正态分布,均值为,均方差为.1,通道个数为*/
//rng.disttype = CV_RAND_NORMAL;
//cvRand( &rng, x_k ); /*随机填充数组*/
x_k->data.fl[0]=0.;//设起始角度为0;//自己修改过的例子中x_k为汽车沿圆周运动的参数,去掉了噪声,在后面与kalman
//滤波器校正后的运动参数对比
x_k->data.fl[1]=0.05f;//设角速度为1,弧度值
// Process noise
CvMat* w_k = cvCreateMat( 2, 1, CV_32FC1 );
// Measurements, only one parameter for angle
CvMat* z_k = cvCreateMat( 1, 1, CV_32FC1 );/*定义观测变量*/
cvZero( z_k ); /*矩阵置零*/
// Transition matrix F describes model parameters at and k and k+1
const float F[] = { 1, 1, 0, 1 }; /*状态转移矩阵*///F 矩阵实际上应该是2*2的矩阵[1,1;0,1]
memcpy( kalman->transition_matrix->data.fl, F, sizeof(F));
/*初始化转移矩阵,行列,具体见CvKalman* kalman = cvCreateKalman( 2, 1, 0 );*/
// Initialize other Kalman parameters
cvSetIdentity( kalman->measurement_matrix, cvRealScalar(1) );/*观测矩阵*///观测矩阵也是1*2 [1,0],因为只能测得汽车的位置
cvSetIdentity( kalman->process_noise_cov, cvRealScalar(1e-5) );/*过程噪声*/
cvSetIdentity( kalman->measurement_noise_cov, cvRealScalar(1e-1) );/*观测噪声*/
cvSetIdentity( kalman->error_cov_post, cvRealScalar(1) );/*后验误差协方差*/
// Choose random initial state
cvRand( &rng, kalman->state_post );/*初始化状态向量*/
// Make colors
CvScalar yellow = CV_RGB(255,255,0);/*依次为红绿蓝三色*/
CvScalar white = CV_RGB(255,255,255);
CvScalar red = CV_RGB(255,0,0);
while( 1 ){
// Predict point position
const CvMat* y_k = cvKalmanPredict( kalman, 0 );/*激励项输入为*/
// Generate Measurement (z_k)
cvRandSetRange( &rng, 0, sqrt( kalman->measurement_noise_cov->data.fl[0] ), 0 );/*设置观测噪声*/
cvRand( &rng, z_k );//此时的z_k并非测量值,只是为观测噪声,其实为理解方便应该设一的独立的变量
cvMatMulAdd( kalman->measurement_matrix, x_k, z_k, z_k );//z_k为测量值
// Update Kalman filter state
cvKalmanCorrect( kalman, z_k );
//// Apply the transition matrix F and apply "process noise" w_k
//cvRandSetRange( &rng, 0, sqrt( kalman->process_noise_cov->data.fl[0] ), 0 );/*设置正态分布过程噪声*/
//cvRand( &rng, w_k );
//cvMatMulAdd( kalman->transition_matrix, x_k, w_k, x_k );//
// Plot Points
cvZero( img );/*创建图像*/
// Yellow is observed state 黄色是观测值
//cvCircle(IntPtr, Point, Int32, MCvScalar, Int32, LINE_TYPE, Int32)
//对应于下列其中,shift为数据精度
//cvCircle(img, center, radius, color, thickness, lineType, shift)
//绘制或填充一个给定圆心和半径的圆
cvCircle( img,
cvPoint( cvRound(img->width/2 + img->width/3*cos(z_k->data.fl[0])),
cvRound( img->height/2 - img->width/3*sin(z_k->data.fl[0])) ),
4, yellow );
// White is the predicted state via the filter
cvCircle( img,
cvPoint( cvRound(img->width/2 + img->width/3*cos(y_k->data.fl[0])),
cvRound( img->height/2 - img->width/3*sin(y_k->data.fl[0])) ),
4, white, 2 );
// Red is the real state
cvCircle( img,
cvPoint( cvRound(img->width/2 + img->width/3*cos(x_k->data.fl[0])),
cvRound( img->height/2 - img->width/3*sin(x_k->data.fl[0])) ),
4, red );
CvScalar bule=cvScalar(255,0,0,0);
cvCircle( img,
cvPoint( cvRound(img->width/2 + img->width/3*cos(kalman->state_post->data.fl[0])),
cvRound( img->height/2 - img->width/3*sin(kalman->state_post->data.fl[0])) ),
4, bule ,2);
// Apply the transition matrix F and apply "process noise" w_k
//cvRandSetRange( &rng, 0, sqrt( kalman->process_noise_cov->data.fl[0] ), 0 );/*设置正态分布过程噪声*/
//cvRand( &rng, w_k );
cvMatMulAdd( kalman->transition_matrix, x_k, NULL, x_k );//
CvFont font;
cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5f,0.5f,0,1,8);
cvPutText(img,"Yellow:observe",cvPoint(0,20),&font,cvScalar(0,0,255));
cvPutText(img,"While:predict",cvPoint(0,40),&font,cvScalar(0,0,255));
cvPutText(img,"Red:real",cvPoint(0,60),&font,cvScalar(0,0,255));
cvPutText(img,"Press Esc to Exit...",cvPoint(0,80),&font,cvScalar(255,255,255));
cvShowImage( "Kalman", img );
// Exit on esc key
if(cvWaitKey(100) == 27)
break;
}
cvReleaseImage(&img);/*释放图像*/
cvReleaseKalman(&kalman);/*释放kalman滤波对象*/
cvDestroyAllWindows();/*释放所有窗口*/
}
3、平台:opencv2.1 vs2008
4、实验结果:

5、分析
实验中有两个现象
一开始汽车的真实位置和卡尔曼滤波器得到的结果差别比较大。因为汽车一开始的位置为0,而给卡尔曼的滤波器设置的最初状态时一个高斯分布的随机值。但越到后来,汽车的真实位置和卡尔曼滤波器得到的结果差别变小;
蓝圈位置和白圈位置更接近,而黄圈和蓝圈的位置总是差别较大。因为过程协方差为1e-1,而观测协方差为1e-5(蓝色部分代码),所以卡尔曼滤波器得到的结果和观测结果更接近,即蓝圈位置和白圈位置更接近。如果改变过程协方差的大小会出现不同的结果。
opencv 卡尔曼滤波器例子,自己修改过的更多相关文章
- [转载]卡尔曼滤波器及其基于opencv的实现
卡尔曼滤波器及其基于opencv的实现 源地址:http://hi.baidu.com/superkiki1989/item/029f65013a128cd91ff0461b 这个是维基百科中的链接, ...
- 对Kalman(卡尔曼)滤波器的理解@@zz
1.简介(Brief Introduction) 在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”.跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他 ...
- 卡尔曼滤波器 Kalman Filter (转载)
在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”.跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他是个现代人! 卡 尔曼全名Rudolf Emil ...
- 对Kalman(卡尔曼)滤波器的理解
1.简单介绍(Brief Introduction) 在学习卡尔曼滤波器之前,首先看看为什么叫"卡尔曼". 跟其它著名的理论(比如傅立叶变换.泰勒级数等等)一样.卡尔曼也是一个人的 ...
- kalman filter卡尔曼滤波器- 数学推导和原理理解-----网上讲的比较好的kalman filter和整理、将预测值和观测值融和
= 参考/转自: 1 ---https://blog.csdn.net/u010720661/article/details/63253509 2----http://www.bzarg.com/p/ ...
- 卡尔曼滤波器实例:跟踪自由落体运动:设计与Matlab实现
[首发:cnblogs 作者:byeyear Email:byeyear@hotmail.com] 本文所用实例来自于以下书籍: Fundamentals of Kalman Filter ...
- [Math]理解卡尔曼滤波器 (Understanding Kalman Filter) zz
1. 卡尔曼滤波器介绍 卡尔曼滤波器的介绍, 见 Wiki 这篇文章主要是翻译了 Understanding the Basis of the Kalman Filter Via a Simple a ...
- [Math]理解卡尔曼滤波器 (Understanding Kalman Filter)
1. 卡尔曼滤波器介绍 卡尔曼滤波器的介绍, 见 Wiki 这篇文章主要是翻译了 Understanding the Basis of the Kalman Filter Via a Simple a ...
- 时间序列八: 以NASA之名: 卡尔曼滤波器
目录 以NASA之名: 卡尔曼滤波器 引言 荣耀骑士 卡尔曼滤波器* 参考文献: 以NASA之名: 卡尔曼滤波器 'That's one small step for man,one giant le ...
随机推荐
- UTC和时间相互转换
// ToLocalTime() UTC时间转换为本地时间 public static DateTime UtcToDateTime(long number) { , , , , , , ).AddS ...
- iOS 自定义滑动切换TabbarItem 觉得设计丑也要做出来的UI效果。。。
UI丑却要继续做的感言: 对UI不满意的时候,就会觉得丑爆了,时间长了,却丑习惯了. 论前一阵子Tabbar 多丑,丑得最后不要tabbar了...但是自定义tabbar 和遇到的问题解决的过程可以记 ...
- gif 命令大全
git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...
- VS2012安装完成之后,用自带的Blend无法创建WPF项目,打开WPF项目无法设计
Visual Studio 2012安装完成之后, 打开自带的Blend for Visual Studio 无法创建新的WPF或者Silverlight项.打开WPF项目无法编辑的原因: 1.VS自 ...
- Apache 优化
1.关闭DNS和名字解析 * HostnameLookups on | off | double 2.关闭客户端主机名解析 Apache .3之前HostnameLookups默认是打开的.这样客户端 ...
- 抗DDOS攻击
2016年10月的某天,“半个美国互联网”都瘫痪了,就是因为遭受了DDoS攻击——Twitter.GitHub.Spotify.Airbnb.Etsy等大量站点都因此受到影响.DNS服务提供商Dyn公 ...
- Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!
[转][原文] 大家好,好久不见,今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object); ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- Java_WebKit_ZC01
1. 1.1. F:\ZC_chrome_download\java_svg\__Java_call_Qt\qtjambi-master\doc\src\snippets\application.xm ...
- 2017版:KVM 性能优化之内存优化
我们说完CPU方面的优化,接着我们继续第二块内容,也就是内存方面的优化.内存方面有以下四个方向去着手: EPT 技术 大页和透明大页 KSM 技术 内存限制 1. EPT技术 EPT也就是扩展页表,这 ...