基于MATLAB卡尔曼滤波器实现动态人物的跟踪检测
卡尔曼滤波不要求信号和噪声都是平稳过程的假设条件。对于每个时刻的系统扰动和观测误差(即噪声),只要对它们的统计性质作某些适当的假定,通过对含有噪声的观测信号进行处理,就能在平均的意义上,求得误差为最小的真实信号的估计值。因此,自从卡尔曼滤波理论问世以来,在通信系统、电力系统、航空航天、环境污染控制、工业控制、雷达信号处理等许多部门都得到了应用。例如在图像处理方面,应用卡尔曼滤波对由于某些噪声影响而造成模糊的图像进行复原。在对噪声作了某些统计性质的假定后,就可以用卡尔曼的算法以递推的方式从模糊图像中得到均方差最小的真实图像,使模糊的图像得到复原。又如,在雷达中,人们感兴趣的是跟踪目标,但目标的位置、速度、加速度的测量值往往在任何时候都有噪声。卡尔曼滤波利用目标的动态信息,设法去掉噪声的影响,得到一个关于目标位置的好的估计。这个估计可以是对当前目标位置的估计(滤波),也可以是对于将来位置的估计(预测),也可以是对过去位置的估计(插值或平滑)。
扩展卡尔曼滤波器,是由kalman filter考虑时间非线性的动态系统,常应用于目标跟踪系统。这一重要的属性,在诸多重要领域都能得到应用。因此掌握这一算法也是很有必要的。
先来介绍卡尔曼滤波的几个重要公式。
离散控制过程的系统,它可用一个线性随机微分方程来描述:
X(k)=A X(k-1)+B U(k)+W(k) ;
Z(k)=H X(k)+V(k) ,系统的测量值:其中,W(k)和V(k)分别表示过程和测量的噪声。对于其余的参数或函数的意义在此不再赘述。
X(k|k-1)=AX(k-1|k-1)+B U(k) ………… (1)
P(k|k-1)=A P(k-1|k-1) A’+Q ……… (2)
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) ……… (3)
Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) ……… (4)
P(k|k)=(I-Kg(k) H)P(k|k-1) ……… (5)
这是卡尔曼滤波的五大公式,也是核心所在。代码在应用嵌套的时候也多是围绕这五个公式进行编程。它的主要思想在于通过系统的预测值和测量值不断的递归来得到最优的最真实的结果(针对最优,回归,分类,决策等问题我会做一个总结并罗列一下主要的算法。因为初学者对这些概念会混淆,他们之间略有不同又互相联系)。
下面列出我用卡尔曼滤波做的人脸跟踪检测。
clear;
clc;
if ~exist(‘result’)
mkdir(‘result’);
end%
% Kalman filter initialization,
%[p_x,p_y,v_x,v_y]
% Si+1 = AiSi + ni
% xi = HiSi + mi
dt=1;
A=[1,0,dt,0;0,1,0,dt;0,0,1,0;0,0,0,1];
H=[1,0,0,0;0,1,0,0];
P = 100eye(4);
Q=0.01eye(4);
R=[[0.2845,0.0045]’,[0.0045,0.0455]’];
KF_Init_flag = 1;
% VideoName = ‘move2.MOV’;
VideoName = ‘C:\Users\1.mp4’;
faceDetector = vision.CascadeObjectDetector();
videoReader = vision.VideoFileReader(VideoName);
obj_writer = VideoWriter(‘result\FaceTracker.avi’);
open(obj_writer);
obj = VideoReader(VideoName);
TotalFrameNum = obj.NumberOfFrames;
error = zeros(1,TotalFrameNum);
Predeict_center = zeros(TotalFrameNum,2);
Poster_center = zeros(TotalFrameNum,2);
clear obj;
k =1;
while ~isDone(videoReader)
if KF_Init_flag==1 %根据上一帧判断跟踪目标是丢失
videoFrame = step(videoReader);
bboxs = step(faceDetector,videoFrame);% Draw the returned bounding box around the detected face.给人脸画框显示
bboxs_area = bboxs(:,3).*bboxs(:,4);%.*两矩阵相同位置相乘,结果在相同位置
[bbox_area,index] = sort(bboxs_area,‘Descend’);%sort对数组按指定方向(下降方向)进行升序排序
Predict_box = [];
if ~isempty(bbox_area)
if bbox_area(1)<12000
bbox = [];
else
bbox = bboxs(index(1;
box_size = bbox(3:4);%后验测量
State = [bbox(1:2)+bbox(3:4),0,0]’;
KF_Init_flag =0;
end
else
bbox = [];
end
else %若上一帧判断跟踪目标没有丢失,则对跟踪目标在本帧的位置进行预测(先验)
State = A * State;
Predict_box = [State(1:2)’-box_size/2,box_size];
%检查目标是否出界%【
if Predict_box(1)> size(videoFrame,2)|| Predict_box(2)> size(videoFrame,1)
Predict_box = [];
else
if Predict_box(1)<0
Predict_box(1) = 0;
end
if Predict_box(2)<0
Predict_box(2) = 0;
end
if Predict_box(1) + Predict_box(3) > size(videoFrame,2)
Predict_box(3) = size(videoFrame,2) - Predict_box(1);
end
if Predict_box(2) + Predict_box(4) > size(videoFrame,1)
Predict_box(4) = size(videoFrame,1) - Predict_box(2);
end
end %】
%根据对运动目标的观测值对状态向量进行修正更新(后验)
videoFrame = step(videoReader);
bboxs = step(faceDetector,videoFrame);
bboxs_area = bboxs(:,3).*bboxs(:,4);
[bbox_area,index] = sort(bboxs_area,‘Descend’);
if ~isempty(bbox_area)
if bbox_area(1)<12000
bbox = [];
KF_Init_flag = 1;
else
bbox = bboxs(index(1);
box_size = bbox(3:4);%实测
center = bbox(1:2)’+bbox(3:4)’/2;
PP = A*P*A' + Q;%卡尔曼公式2K = PP*H'*inv(H*PP*H'+R);%inv取反State = State + K*(center-H*State);P = (eye(4)-K*H)*PP;%卡尔曼公式bbox = [State(1:2)'-box_size/2,box_size];%后验修正%检查是否出界if bbox(1) > size(videoFrame,2) ||bbox(2) > size(videoFrame,1)bbox = [];KF_Init_flag = 1;elseif bbox(1) < 0bbox(1) = 0;endif bbox(2) < 0bbox(2) = 0; endif bbox(1) + bbox(3) > size(videoFrame,2)bbox(3) = size(videoFrame,2) - bbox(1);endif bbox(2) + bbox(4) > size(videoFrame,1)bbox(4) = size(videoFrame,1) - bbox(2);endendendelsebbox = [];KF_Init_flag = 1;end
endvideoOut = insertObjectAnnotation(videoFrame,'rectangle',Predict_box,'Predict','Color','yellow');%在指定位置上返回用形状和标签注释的真彩色图像
videoOut = insertObjectAnnotation(videoOut,'rectangle',bbox,'Modify','Color','red');
imwrite(videoOut, strcat('result\',num2str(k),'.jpg'));
writeVideo(obj_writer,videoOut);% 预测值与修正值的误差
if isempty(Predict_box) || isempty(bbox)%isempty(a),判断是否为空是空返回1,非空返回0error(k) = 0; if k >1Predeict_center(k,:) = Predeict_center(k-1,:);%k-1时刻,k时刻Poster_center(k,:) = Poster_center(k-1,:);end
elsePredeict_center(k,:) = Predict_box(1:2) + Predict_box(3:4)/2;Poster_center(k,:) = bbox(1:2) + bbox(3:4)/2;error(k) = sqrt(sum((Poster_center(k,:) - Predeict_center(k,:)).^2));
end
k =k+1;
end
close(obj_writer);
release(videoReader);
if bbox(2) < 0
bbox(2) = 0;
end
if bbox(1) + bbox(3) > size(videoFrame,2)
bbox(3) = size(videoFrame,2) - bbox(1);
end
if bbox(2) + bbox(4) > size(videoFrame,1)
bbox(4) = size(videoFrame,1) - bbox(2);
end
end
end
else
bbox = [];
KF_Init_flag = 1;
end
end
videoOut = insertObjectAnnotation(videoFrame,'rectangle',Predict_box,'Predict','Color','yellow');%在指定位置上返回用形状和标签注释的真彩色图像
videoOut = insertObjectAnnotation(videoOut,'rectangle',bbox,'Modify','Color','red');
imwrite(videoOut, strcat('result\',num2str(k),'.jpg'));
writeVideo(obj_writer,videoOut);
这个代码已删掉一部分,但前面部分已全部完成,只剩下最后的预测和测量误差的递归。。我处理的是动态视频中的人脸,但CSDN只能上传图片,就用图片代替吧。。
基于MATLAB卡尔曼滤波器实现动态人物的跟踪检测相关推荐
- 卡尔曼转矩观测_基于扩展卡尔曼滤波器的表贴式永磁同步电机负载转矩观测方法与流程...
本发明涉及永磁同步电机技术领域,具体涉及基于扩展卡尔曼滤波器的表贴式永磁同步电机负载转矩观测方法. 背景技术: 永磁同步电机(pmsm:permanentmagnetsynchronousmotor) ...
- matlab中对伺服电机,基于MATLAB仿真的伺服电机动态特性分析
基于MATLAB仿真的伺服电机动态特性分析 摘要:伺服电机(servo motor )是指在伺服系统中控制机械元件运转的发动机,是一种补助马达间接变速装置.伺服电机可使控制速度,位置精度非常准确,可以 ...
- 基于matlab的温度信号采集,基于matlab与单片机的动态温度监控系统的设计
基于matlab与单片机的动态温度监控系统的设计 基于Matlab/Simulink 与单片机的动态温度监控系统的设计Matlab 有着强大的数值处理能力,已应用于工程计算.控制系统设计.数字信号处理 ...
- 卡尔曼转矩观测_基于扩展卡尔曼滤波器的永磁同步电机 转速和磁链观测器
基于扩展卡尔曼滤波器的永磁同步电机转速和磁链观测器 第六图书馆 为了取消永磁同步电机控制中的机械传感器,获得直接转矩控制中需要的电机磁链信息,设计了一种基于扩展卡尔曼滤波 器的永磁同步电机转速和磁链估 ...
- 基于Matlab使用到达时差 (TDOA) 跟踪对象仿真(附源码)
目录 一.介绍 1.1 TDOA 计算 1.2 TDOA 本地化 二.跟踪单个发射器 三.跟踪具有已知 ID 的多个发射器 四.跟踪具有未知 ID 的多个发射器 4.1 使用到达时间 (TOA) 测量 ...
- 基于MATLAB改进Otsu阈值分割的车道线检测
基于MATLAB改进Otsu阈值分割的车道线检测 摘要:在判断车道偏离以防止车辆碰撞等危害时,车道标线检测需要通过图像处理来进行,检测方法是否适用于各种背景环境条件以及检测的及时性至关重要传统的Ots ...
- Simulink仿真:基于Matlab Simulink的光伏系统最大功率点跟踪控制算法研究
Simulink仿真:基于Matlab Simulink的光伏系统最大功率点跟踪控制算法研究 关键词:非线性输出特性 光伏电池 Matlab Simulink 仿真模型 MPPT 参考文献:无 仿真平 ...
- 【信号处理】基于扩展卡尔曼滤波器和无迹卡尔曼滤波器的窄带信号时变频率估计(Matlab代码实现)
目录 1 概述 2 数学模型 3 运行结果 4 结论 5 参考文献 6 Matlab代码实现 1 概述 本文讲解和比较了基于卡尔曼滤波器的频率跟踪方法的能力,例如扩展卡尔曼滤波器 (EKF) 和无味卡 ...
- 卡尔曼滤波器求速度matlab,卡尔曼滤波器算法浅析及matlab实战
原标题:卡尔曼滤波器算法浅析及matlab实战 作者:Liu_LongPo 出处:Liu_LongPo的博客 卡尔曼滤波器是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的 ...
最新文章
- oracle参数文件initorcl位置,ORACLE参数文件
- mysql 导入CSV数据 [转]
- Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作
- PHP7 学习笔记(十一)使用phpstudy快速配置一个虚拟主机
- CodeForces 1491G Switch and Flip(结论)
- java虚拟机_深入浅出Java虚拟机,从来没有人能把Java 虚拟机讲解的这么透彻
- Gephi绘制网络图初步探索
- 写代码质量改善java计划151建议——导航开始
- 【虚拟机】如何判断CPU是否支持硬件虚拟化
- 在Delphi2007下安装ReportMachine6.5
- 格雷希尔快速密封接头在燃油泵密封性能检测的作用
- 从4千/平到4.5万/平!南京房价10年血泪史 看哭所有人!
- 41.朴素贝叶斯Naive Bayes公式推导与理解+求解公园凉鞋问题(借助文氏图)
- mysql里any是什么_sql中any和all的区别?
- win10专业版 hyper-v 找不到
- python需要学哪些基础知识_零基础学Python应该学习哪些入门知识
- 微信小程序之js 字符串转换成数字的三种方法, 取float型小数点后两位数的方法
- 宝可梦合体再次流行?Pokemon Fusion的技术实现
- python的out模式_Python设计模式之状态模式
- 腾讯云TRTC服务实现小程序语音/视屏会议
热门文章
- 分布式系统常见问题总结
- cad调了比例因子没反应_大神们都在用的9个CAD制图技巧,你会用几个?
- matplotlib总结
- 同事的你--写给那些离职的同事们
- 有一种蓝叫 APEC 蓝
- 虚拟机正在应用计算机设置,vmware虚拟机安装windows 10 technical preview卡在“正在准备设置50%”的解决办法-网络教程与技术
-亦是美网络...
- 《AR与VR开发实战》——第1章AR技术简介
- DB2-SQLSTATE 消息大全---[IBM官方]
- 检样用计算机时间,怎么检查电脑用了多久?
- TVS相关参数与选型