💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
球追踪的卡尔曼滤波,本文展示了使用卡尔曼滤波器追踪白色球的演示。因为白色球经过遮挡会使图像处理跟踪出现混淆,同时模型也不完美,因为球是由纸制成,气体摩擦效应不能忽略不计。卡尔曼滤波器的结果比单独的模型或图像处理要好得多。
本文展示了利用卡尔曼滤波器进行球追踪的技术。在这个演示中,我们尝试追踪一个白色球的运动。值得注意的是,白色球可能会经过遮挡,导致图像处理的结果出现混淆。此外,球体由纸制成,考虑到气体摩擦效应,我们无法完美地建模球的运动。然而,通过使用卡尔曼滤波器,我们获得了比单独使用模型或图像处理更加准确的结果。这种方法能够有效地处理遮挡和模型不完美性带来的挑战,从而提高了球体追踪的准确性和稳定性。
在实验中,我们发现卡尔曼滤波器不仅可以有效地处理遮挡问题,还可以对模型的不确定性进行更好的补偿。由于白色球的特性和环境的复杂性,单独使用图像处理或简单模型往往难以准确地捕捉球体的运动轨迹。然而,卡尔曼滤波器能够根据实时的观测数据和模型预测,动态地调整估计,从而提供更加精确和稳定的球体位置和速度信息。
此外,我们也注意到了球体由纸制成的特殊性质,这意味着在运动过程中可能存在气体摩擦效应。虽然这一效应在理论模型中难以精确建模,但卡尔曼滤波器在一定程度上能够对其进行补偿,使得追踪结果更加可靠。综合来看,卡尔曼滤波器在球体追踪领域展现出了明显的优势,为解决实际中遇到的复杂追踪问题提供了一种可行的解决方案。
📚2 运行结果
部分代码:
g = 9.8; % gravity in m/s^2
conv = 1600; %pixel/m --> I got that from the handle
deltaT = 1/vid.FrameRate;
initialSpeed = 650; % trial and error
X(:,1) = [18;initialSpeed];
Xhat(:,1) = [18;initialSpeed];
Xmodel(:,1) = [18;initialSpeed];
A = [ 0 1 ; 0 0 ]; % state space model: Xdot = Ax + Bu with X= [y,ydot]
B = [0 ; g*conv];
F = A*deltaT + eye(2); % transforming from contineous state space into discrete x[k] = F*x[k-1] + Gu;
G = B*deltaT;
H = [1 0];
Q = [80 0 ;0 1]; % the covariance of the process noise
R = 400; % the covariance of the observation noise
P(:,:,1) = [100 0 ;0 100];
Phat(:,:,1) = P(:,:,1) ;
m = 1;
K(:,1) = [1;0];
for k = 16 : nFrames-15
%pause(0.5);
%tansform into grayscale
I = rgb2gray(read(vid, k));
I = imrotate(I,-90);
% mov(m).cdata = I;
mov(m).cdata = imcrop(I ,[minx miny maxx maxy]);
BackgroundReduced = mov(m).cdata - background;% background subtraction
count = 0;
for y=1:vidHeight
for x=1:vidWidth
if(BackgroundReduced(y,x)>10) %Threshold level
detectedFrame(y,x,m) = 255;
count = count + 1; % number of pixels detected
collectedX(count) = x;
collectedY(count) = y;
end
end
end
if(count > 500)
Centroid(m,1) = mean(collectedY);
Centroid(m,2) = mean(collectedX);
else % no "ball" pixels detected
Centroid(m,1) = 0;
Centroid(m,2) = 0;
end
imshow(mov(m).cdata)
hold on
plot(Centroid(m,2),Centroid(m,1),'+');
plot(Centroid(1,2),X(1,m),'r+')
plot(Centroid(1,2),Xmodel(1,m),'g+')
hold off
drawnow
m = m + 1;
% Model Only
Xmodel(:,m) = F * Xmodel(:,m-1) + G;
%% Kalman Filter:
%prediction
Xhat(:,m) = F * X(:,m-1) + G;
Phat(:,:,m) = F * P(:,:,m-1) + Q;
%Correction
S = H*Phat(:,:,m)*H'+R;
K(:,m) = Phat(:,:,m)*H'*inv(S);
if(Centroid(m-1,1))
e = Centroid(m-1,1) - H*Xhat(:,m);
else
e = 0;
K(:,m) = [0;0];
end
X(:,m) = Xhat(:,m)+ (K(:,m)*e);
P(:,:,m) = (eye(2)-K(:,m)*H)*Phat(:,:,m);
%name = strcat('KalmanFilteredFrames/frame_',num2str(m-1));
%saveas(h,name,'png'); %name is a string
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。