点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

卡尔曼滤波原理

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

最终卡尔曼滤波完整的评估与空间预测模型工作流程如下:

OpenCV API

cv::KalmanFilter::KalmanFilter(int dynamParams, int measureParams,int controlParams = 0,int type = CV_32F
)
# dynamParams表示state的维度
# measureParams表示测量维度
# controlParams表示控制向量
# type表示创建的matrices

代码演示

import cv2
from math import cos, sin, sqrt
import numpy as npif __name__ == "__main__":img_height = 500img_width = 500kalman = cv2.KalmanFilter(2, 1, 0)cv2.namedWindow("Kalman", cv2.WINDOW_AUTOSIZE)while True:state = 0.1 * np.random.randn(2, 1)# 初始化kalman.transitionMatrix = np.array([[1., 1.], [0., 1.]])kalman.measurementMatrix = 1. * np.ones((1, 2))kalman.processNoiseCov = 1e-5 * np.eye(2)kalman.measurementNoiseCov = 1e-1 * np.ones((1, 1))kalman.errorCovPost = 1. * np.ones((2, 2))kalman.statePost = 0.1 * np.random.randn(2, 1)while True:def calc_point(angle):return (np.around(img_width/2 + img_width/3*cos(angle), 0).astype(int),np.around(img_height/2 - img_width/3*sin(angle), 1).astype(int))state_angle = state[0, 0]state_pt = calc_point(state_angle)# 预测prediction = kalman.predict()predict_angle = prediction[0, 0]predict_pt = calc_point(predict_angle)measurement = kalman.measurementNoiseCov * np.random.randn(1, 1)# 生成测量measurement = np.dot(kalman.measurementMatrix, state) + measurementmeasurement_angle = measurement[0, 0]measurement_pt = calc_point(measurement_angle)# plot pointsdef draw_cross(center, color, d):cv2.line(img,(center[0] - d, center[1] - d), (center[0] + d, center[1] + d),color, 1, cv2.LINE_AA, 0)cv2.line(img,(center[0] + d, center[1] - d), (center[0] - d, center[1] + d),color, 1, cv2.LINE_AA, 0)img = np.zeros((img_height, img_width, 3), np.uint8)cv2.line(img, state_pt, measurement_pt, (0, 0, 255), 3, cv2.LINE_AA, 0)cv2.line(img, state_pt, predict_pt, (255, 0, 0), 3, cv2.LINE_AA, 0)# 校正预测与测量值差异kalman.correct(measurement)# 更新noise矩阵与状态process_noise = sqrt(kalman.processNoiseCov[0,0]) * np.random.randn(2, 1)state = np.dot(kalman.transitionMatrix, state) + process_noisecv2.imshow("Kalman", img)code = cv2.waitKey(100)if code != -1:breakif code in [27, ord('q'), ord('Q')]:breakcv2.destroyWindow("Kalman")

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

OpenCV卡尔曼滤波介绍与代码演示相关推荐

  1. linux下的fgetc()与fputc()函数详细介绍及代码演示

    linux下的标准I/O的fgetc()与fputc()函数详细介绍及代码演示 文章目录 前言 一.fgetc()用法介绍 二.fputc()用法介绍 代码演示 总结 前言 在C语言中,读写文件比较灵 ...

  2. PipedInputStream类 和 PipedOutputStream类 的简单介绍和代码演示

    PipedOutputStream类 和PipedInputStream 类为管道输出流 和管道输入流.通常都是以管道输出流作为管道的起始端,通常管道输出流和管道输入流通过connect方法连接起来, ...

  3. STC89C52单片机I2C通信以及AT24C02介绍使用代码演示

    目录 AT24C02引脚介绍与使用 AT24C02介绍 ​I2C通信介绍 I2C通信时序 起始条件与终止条件 发送一个字节(主机发送到从机) 接受一个字节(从机发送到主机) 发送应答与接受应答 I2C ...

  4. STC89C52单片机AD/DA介绍与代码演示

    目录 AD/DA介绍 硬件电路模型 硬件电路图 运算放大器 运放电路 AD原理 DA原理 AD/DA性能指标 XPT2046的使用介绍与配置 XPT2046的时序 代码解释 AD/DA介绍 AD(An ...

  5. STC89C52单片机LCD1602显示屏介绍与代码演示

    目录 LCD1602显示屏介绍 引脚介绍 内部结构框图 存储器 DDRAM储存器地址 CGRAM与 CGROM的地址 时序介绍 LCD1602快捷指令 LCD1602指令操作流程: 字符.字符串的显示 ...

  6. c++ zlib加密压缩文件详细介绍与代码演示

    目录 一.下载编译zlib 编译方式1:命令行形式编译 编译方式2:批处理文件形式编译 编译方式3:源码形式编译

  7. php 运营商授权,PHP判断手机号运营商(详细介绍附代码)

    道理很简单,知道手机号规则 进行正则判断就可以 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.15 ...

  8. 23.Flink-高级特性-新特性-Streaming Flie Sink\介绍\代码演示\Flink-高级特性-新特性-FlinkSQL整合Hive\添加依赖和jar包和配置

    23.Flink-高级特性-新特性-Streaming Flie Sink 23.1.介绍 23.2.代码演示 24.Flink-高级特性-新特性-FlinkSQL整合Hive 24.1.介绍 24. ...

  9. RandomAccessFile类的简单介绍,以及代码演示

    RandomAccessFile类,支持对文件的读取和写入.并且可以设置写入和读取的位置.该位置主要是以字节体现.相当于该文件存储在一个大型byte[] 数组.隐含存在一个指向该数组的指针.类似于该类 ...

最新文章

  1. centos创建禁止登录用户
  2. js自定义函数及参数问题
  3. dojo自定义表格组件
  4. JSPatch – 动态更新iOS APP
  5. ElasticSearch6.5.0 【安装IK分词器】
  6. 服务器抽屉式维护,一种服务器用可顺序运动的滑轨
  7. rabbitmq 持久化_RabbitMQ原理与相关操作(三)消息持久化
  8. zoj 1372
  9. Tensorflow2.0数据和部署(二)——基于设备的模型与TensorFlow Lite
  10. Windows Tips
  11. Redis3.0--集群安装部署
  12. 算法:回溯十一 Subsets数组的子数组集合4种解法
  13. MySQL的JDBC下载
  14. 2017个人年终总结
  15. 2015年第4本(英文第3本):Godfather教父
  16. iOS 第三方 汇总
  17. 必须学会的几个网络测试命令
  18. 批量修改文件名 大量文件名称一键替换文字
  19. Sqoop将MySQL数据导入到HDFS和Hive中
  20. 讲给后台程序员看的前端系列教程(38)——事件处理

热门文章

  1. 中文预训练ALBERT模型来了:小模型登顶GLUE,Base版模型小10倍、速度快1倍
  2. 免费GPU哪家强?谷歌Kaggle vs. Colab
  3. 售价1万7的华为Mate X很贵吗?
  4. AI一分钟 | 黎曼猜想已被证明?对错有待同行评议;讯飞与发帖质疑同传译员达成谅解...
  5. Google 的自动驾驶车出事故,被人类撞的
  6. 看完2017年这10大AI失败案例,就知道什么是人工智障了
  7. 为什么说Netty是性能之王,因为它用了 Reactor 模型啊
  8. GitHub 骚操作,个人页还能这么玩?
  9. 告别痛苦,快乐学习Pandas!开源教程《Joyful-Pandas》发布
  10. 阮一峰在 GitHub 又一开源力作!