【优于图像处理】使用卡尔曼滤波器追踪白色球(Matlab代码实现)

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥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 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

🌈4 Matlab代码实现

  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值