opencv 卡尔曼滤波器例子,自己修改过【转载】

基于opencv的kalman滤波跟踪 使用kalman算法对目标进行跟踪,并对kalman做出讲解 立即下载
【转载】http://hi.baidu.com/lin65505578/blog/item/7c03a0d4210b68c7a144dfe6.html
  一、卡尔曼滤波器的理论解释
  
  http://blog.youkuaiyun.com/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.youkuaiyun.com/jiangdf/article/details/4553520
  
  #define cvMatMulAdd( src1, src2, src3, dst ) cvGEMM( src1, src2, 1, src3, 1, dst, 0 )
  
  三、
  
  1、情景说明:
  
  假设有一个做圆周运动的点,就像一辆在赛道上行驶的汽车,汽车以恒定的速度行驶。使用kalman滤波器跟踪这个汽车。程序运行结果,红圈代表理想运动汽车,,黄圈代表kalman滤波器预测汽车的位置,白圈代表观测得到汽车的位置,蓝圈代表kalman滤波器获得汽车的位置(速度这一分量,可以观察图中圆的运动速度)。
  
  2、代码:
  
  
  #include 
  #include 
  #include 
  
  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();/*释放所有窗口*/
  }
别再只用相机标定了!手把手教你用OpenCV和Python搞定投影仪标定(附完整代码) 本文详细介绍了如何使用Python和OpenCV实现投影仪标定,特别针对结构光三维扫描中的核心问题。通过低成本替代方案和优化算法,解决投影仪标定中的非线性畸变和亮度-距离耦合效应,显著提升三维重建精度。附完整代码和实战技巧,帮助开发者快速掌握关键技术。 阅读详情

相关推荐

基于多智能体深度强化学习的空地协同通信系统轨迹设计与访问控制

所属子方向: UAV assisted communication 名词注释 coordinated:协调、协同 base stations 基站,公用移动通信基站,是移动设备接入互联网的接口设备,是指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间进行信息传递的无线电收发信电台。 UAV-BS:无人机基站 cooperative-competitive game:合作竞争博弈 throughput :吞吐量,每秒比特数 bps,bits per second Determinis

skysys的研究小屋 4969

卡尔曼滤波—Simple Kalman Filter for 2D tracking with OpenCV

之前有关卡尔曼滤波的例子都比较简单,只能用于简单的理解卡尔曼滤波的基本步骤。现在让我们来看看卡尔曼滤波在实际中到底能做些什么吧。这里有一个使用卡尔曼滤波在窗口内跟踪鼠标移动的例子,原作者主页:http://home.wlu.edu/~levys/ 首先,第一步是选取状态变量,这里选择系统状态变量为x=[x, y]T ,即状态变量选为鼠标在窗口内的位置。通过鼠标事件响应的回调函数可以获得鼠标当前位...

weixin_33858249的博客 508

从仿真到实机:四足机器人控制算法的全流程验证框架

本文系统阐述了四足机器人从仿真到实机的全流程验证框架。针对仿真与实机环境的巨大差异,文章详细介绍了在MuJoCo等高保真仿真环境中的建模、算法迭代与压力测试方法,并重点解析了通过硬件抽象层和中间件搭建通往实机的关键桥梁。最后,提供了实机部署的安全清单与调试策略,旨在帮助开发者构建可重复、风险可控的算法验证闭环,提升算法在真实世界中的鲁棒性与可靠性。

lilh34434的博客 381

opencv学习记录2-Kalman滤波

opencv学习记录2-Kalman滤波

MobooV的博客 2578

别再只调包了!深入理解机器学习虚拟筛选中的分子指纹(ECFP/Morgan)

本文深入探讨了ECFP/Morgan分子指纹在机器学习虚拟筛选中的应用与优化策略。通过解析半径参数与比特长度的化学意义,揭示了如何通过参数调优提升模型性能20%以上,特别适用于药物发现领域的高通量筛选。文章还提供了工程实践中的参数优化策略和多指纹融合技术,为开发者提供从理论到实践的全面指导。

weixin_33704234的博客 828

为Codex添加任务完成提示音:提升开发效率的实用技巧

在自动化脚本开发和模型训练过程中,实时获取任务状态反馈是提升工作效率的关键。通过Hook机制,开发者可以在代码执行的关键节点注入自定义逻辑,实现各种自动化操作。Codex的Hook系统特别适合用于任务完成提醒,其post_execution节点能准确捕获执行结束事件。技术实现上,只需简单配置TOML文件并编写音频播放脚本,就能让系统在任务完成时自动播放提示音。这种声音反馈机制尤其适用于长时间运行的批量任务和模型训练场景,实测可提升30%以上的工作效率。结合动态音效选择和跨平台兼容方案,该技巧还能扩展为桌面通

weixin_26767391的博客 532

opencv实现卡尔曼滤波

opencv自带程序:建立一个绕某一圆心做匀速圆周运动的小球,但是实际中它会受到系统噪声影响从而其角度和角速度有所变化,通过带有噪声的观测值(真实值+观测噪声)和匀速运动模型的预测值为输入使用KF得到估计值。原有的代码中比较的是真实值与预测值、真实值与观测值的偏差,没有用到估计值,因此我在上述代码中加入了真实值与估计值的比较。在更新阶段,滤波器利用对当前状态的观测值优化在预测阶段获得的预测值,以获得一个更精确的新估计值。x(k) = A*x(k-1) + B*u(k)+w(k) 运动方程。

qq_41451702的博客 2924

[cadence]Allegro STEP-3D模型导入、匹配、导出的方法及注意事项

如果 Avaliable里面没有和symbols对应的文件,说明没有对应的3D模型,这时候需要在你的step路径下创建y与 .dra 封装文件相同名称的。选择好 Output file 和 name 之后呢,点击 Export。首先打开Setup - Step Package Mapping。注意:路径中不能有中文名称,有的话你会发现不能导出,也不会报错。在路径下将下载或者自己做的 3D模型文件改名之后,重新打开。可在View -> 3D View。

LuDvei的博客 2万+

学习OpenCV2——卡尔曼滤波(KalmanFilter)详解

本文将简要回顾一下卡尔曼滤波理论,然后详细介绍如何在OpenCV中使用卡尔曼滤波进行跟踪,最后给两个程序实例。

Markala的博客 7万+

jQuery 版本怎么选?别一上来就用最新版,老项目里这个坑很常见

jQuery 是一个封装好的 JavaScript 函数库,简称 JQ它的核心理念是jQuery 有 1.x、2.x、3.x 三个主要版本系列2.0 以上版本不再支持 IE6、IE7、IE8版本选择不能只看“新不新”,而要看项目兼容性和实际需求.min.js是压缩版文件,生产环境常用使用 jQuery 前必须先通过<script>正确引入基本就是没引入或引入失败可以快速绑定点击事件.animate()可以快速实现动画效果,但定位属性要设置好。

Web安全工具库 385

【半导体工业实战】C#.NET开发SECS/GEM协议上位机(完整可运行源码+全进制转换工具类+工业级通信封装)

在半导体这个高精尖的工业领域,SECS/GEM协议是设备通信的基石,而C#.NET凭借其稳定性、高效的字节处理能力、Windows工控机的深度适配,成为SECS上位机开发的最优选择。本文从半导体行业的专属认知出发,提供了完整的进制转换工具类、工业级的SECS通信封装、实战的报文解析与业务调用示例、半导体专属的避坑指南,所有内容均为真实项目经验的沉淀,无空洞理论、无AI冗余文字,所有源码均可直接编译运行、无缝移植到半导体项目中。半导体工控开发的核心,从来不是炫技,而是。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 897

OpenCV卡尔曼滤波介绍与代码演示

卡尔曼滤波原理卡尔曼滤波最早可以追溯到Wiener滤波,不同的是卡尔曼采用状态空间来描述它的滤波器,卡尔曼滤波器同时具有模糊/平滑与预测功能,特别是后者在视频分析与对象跟踪应用场景中被发扬光大,在离散空间(图像或者视频帧)使用卡尔曼滤波器相对简单。假设我们根据一个处理想知道一个变量值如下:最终卡尔曼滤波完整的评估与空间预测模型工作流程如下:OpenCV APIcv::Ka...

weixin_40920183的博客 2353

【全局路径规划地图算法】Voronoi路径规划探索(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Voronoi路径规划探索做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 2239

OpenCV2.x中的卡尔曼滤波器KalmanFilter类的解剖研究

关于卡尔曼滤波器的原理,请看我的博客:

海尔兄弟的博客 2705

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

[转载]卡尔曼滤波器及其基于opencv的实现

卡尔曼滤波器及其基于opencv的实现 源地址:http://hi.baidu.com/superkiki1989/item/029f65013a128cd91ff0461b 这个是维基百科中的链接,比较详细了,如果想详细了解应该看下那篇开篇论文,已经有人翻译成了中文。 http://zh.wikipedia.org/zh/%E5%8D%A1%E5%B0%94%E6%9B%BC%...

weixin_30802171的博客 129

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OpenCV里卡尔曼滤波的理解

转载https://blog.youkuaiyun.com/yangtrees/article/details/8075911 https://blog.youkuaiyun.com/GDFSG/article/details/50904811 我们把这5个式子可分成三大部分看: 公式和opencv对应关系的讲解: 首先对于离散控制过程的系统,其系统状态和系统测量值可进行以下表示: X(k): k时刻系统状态...

天马行空 1291

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

kalman 滤波 演示与opencv代码

kalman 滤波 演示与opencv代码   最近在研究kalman滤波在目标跟踪中的应用,opencv中的例子看不太明白。最终我在优快云上找到一篇比较易懂的文章,转载如下(出处http://blog.youkuaiyun.com/onezeros/archive/2011/04/12/6318944.aspx):   在机器视觉中追踪时常会用到预测算法,kalman是你一定知道的

npuweiwei的专栏 1269

学习OpenCV——Kalman滤波

目录(?)[-] 背景模型 基本动态系统模型卡尔曼滤波器 预测 predict      Mat prediction KFpredict更新 updata     KFcorrectmeasurement不变量Invariant 代码 class Kalmansamplekalmancpp鼠标跟踪详解 初始化状态预测predict读出预测的位置更新updata

zebincai的专栏 1216

opencv之卡尔曼滤波

卡尔曼滤波器结构体 typedef struct CvKalman { int MP; /* 测量向量维数 */ int DP; /* 状态向量维数 */ int CP; /* 控制向量维数 */ /* 向后兼容字段 */ #if 1

白色冰激凌的技术专栏 952

python Kalman滤波跟踪(链接整理+理解)

对于kalman滤波器的原理理解,参考资料整理和python实现。

weixin_42442319的博客 3160

学习OpenCV——Kalman滤波 .

文章转载自:http://blog.youkuaiyun.com/yangtrees/article/details/8075911谢谢博主的分享~~   背景: 卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器), 它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态。卡尔曼滤波的一个典型实例是从一组有限的,包含噪声的,对物体位置的观察序列(可能有偏差)预测出物体的位置的坐标及速度。

maochongsandai110的专栏 1424

我竟然用OpenCV实现了卡尔曼滤波

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转载自:OpenCV学堂(CVSCHOOL)卡尔曼滤波原理 卡尔曼滤波最早可以追溯到Wiene...

小白学视觉 734

OpenCV运动检测跟踪 blob track 框架组成模块详解

OpenCV运动检测跟踪 blob track 框架组成模块详解

hddryjv的博客 471

图像处理之目标跟踪(一)之卡尔曼kalman滤波跟踪(主要为知识梳理)(转载)

图像处理之目标跟踪(一)之卡尔曼kalman滤波跟踪(主要为知识梳理)(转载) 内容不是一篇文章的转载而是几篇内容的综合梳理. 主要来源: EmbeddedApp 运动目标跟踪(一)--搜索算法预测模型之KF,EKF,UKF(文献1,主要是原理的梳理,十分详细) -Sherma...

coming_is_winter的博客 7万+

[转载]CV 领域 计算机视觉文献与代码资源

[转载]计算机视觉文献与代码资源计算机视觉文献与代码资源2010-02-15 13:10<br /><br />CVonline<br />http://homepages.inf.ed.ac.uk/rbf/CVonline<br />http://homepages.inf.ed.ac.uk/rbf/CVonline/unfolded.htm<br />http://homepages.inf.ed.ac.uk/rbf/CVonline/CVentry.htm<br /> <br />李子青的大作:<br

jtop0的专栏 1098

卡尔曼滤波+单目标追踪+python-opencv

很好的入门资料 向面试官一句话解释卡尔曼滤波: 用上一次的最优状态估计和最优估计误差去计算这一次的先验状态估计和先验误差估计; 用1得到的本次先验误差估计和测量噪声,得到卡尔曼增益; 用1,2步骤得到所有先验误差估计和测量噪声,得到本次的最优估计。 一句话解释:对模型的预测值和实际的观测值进行加权,迭代计算出未来的状态。 对于上面三句话的一些解释: 先验:根据以往的结果去推导 后验:得到当...

weixin_30745553的博客 2218
上一篇: CamShift+Kalman跟踪[转载]
下一篇: winapi 截屏函数(转)
fengepsilon
博客等级 码龄15年 3粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值