CV、CA、CT运动模型的理解和matlab程序简单实现

较为详细介绍的是CT,CV和CA可以类比着快速理解

一、CV模型
简单介绍

%% CV模型
% xk = xk-1 + vxk * delta_T + 0.5*ax*delta_T^2
% vxk = vxk-1 + ax*delta_T
% yk = yk-1 + vyk * delta_T + 0.5*ay*delta_T^2
% vyk = vyk-1 + ay*delta_T
% X = [x;vx;y;vy];
cv_M = 20;
cv_X = zeros(4,cv_M);
cv_delta_t = 1;
cv_noise_sigma = [2  0;
                  0  1.5]; %加速度噪声 可自行调节,有不同的变化
cv_noise_sigma2 = cv_noise_sigma*cv_noise_sigma';       %方差      
cv_a_noise = cv_noise_sigma2 * randn(2,1);
cv_F = [1, cv_delta_t, 0, 0;
        0, 1, 0,          0;
        0, 0, 1, cv_delta_t;
        0, 0, 0,          1];
cv_G = [0.5*cv_delta_t^2, 0;
        cv_delta_t,       0;
        0, 0.5*cv_delta_t^2;
        0,       cv_delta_t];
cv_x0 = [50; 2; 70; 3];

subplot(1,3,1);
for i=1:cv_M
    cv_X(:,i) = cv_F*cv_x0 + cv_G*cv_a_noise;
    cv_x0 = cv_X(:,i);
    plot(cv_X(1,i),cv_X(3,i),'g.');  
    text(cv_X(1,i),cv_X(3,i),num2str(i));
    hold on
end
title('CV模型');

二、CA模型
简单介绍

%% CA模型
%会涉及到变加速直线运动的公式
% a = a0 + r*t
% v = v0 + a0*t + 0.5*r*t^2
% s = v0*t + 0.5*a0*t^2 + (1/6)*r*t^3
% 状态值X = [x;vx;ax;y;vy;ay],6个值
% xk+1  = xk + vxk*t + 0.5*axk*t^2 + (1/6)*rx*t^3  rx符合正态分布
% vxk+1 = vxk + axk*t + 0.5*rx*t^2
% axk+1 = axk + rx*t
% yk+1  = yk + vyk*t + 0.5*ayk*t^2 + (1/6)*ry*t^3  ry符合正态分布
% vyk+1 = vyk + ayk*t + 0.5*ry*t^2
% ayk+1 = ayk + ry*t   
ca_delta_t = 1;
ca_M = 20;
ca_X = zeros(6,ca_M);
ca_x0 = [60;8;1;55;3;2]; %初值
ca_noise_sigma = [0.2   0;
                  0 0.3]; %噪声的标准差
ca_noise_sigma2 = ca_noise_sigma*ca_noise_sigma';%噪声的方差
ca_a_noise = ca_noise_sigma2*randn(2,1);
ca_F = [1, ca_delta_t, 0.5*ca_delta_t^2, 0, 0, 0;
     0,          1,       ca_delta_t, 0, 0, 0;
     0,          0,                1, 0, 0, 0;
     0, 0, 0, 1, ca_delta_t, 0.5*ca_delta_t^2;
     0,          0,       0, 0, 1, ca_delta_t;
     0,          0,                0, 0, 0, 1]; %系数矩阵
ca_G = [ (1/6)*ca_delta_t^3,  0;
          0.5*ca_delta_t^2,   0;
          ca_delta_t,         0;
          0,  (1/6)*ca_delta_t^3;
          0,   0.5*ca_delta_t^2;
          0,         ca_delta_t];
subplot(1,3,2); 
for i = 1:ca_M
    ca_X(:,i) = ca_F*ca_x0 + ca_G*ca_a_noise;
    ca_x0 = ca_X(:,i);
    plot(ca_X(1,i),ca_X(4,i),'b.');  
    text(ca_X(1,i),ca_X(4,i),num2str(i));
    hold on
end
title('CA模型');

三、CT模型
简单介绍

%% CT模型
 % 产生一个随机分布的指定均值和方差的矩阵:将randn产生的结果乘以标准差,然后加上期望均值即可。
 % 例如,产生均值为0.6,方差为0.1的一个5*5的随机数方式如下:x = 0.6 + sqrt(0.1) * randn(5)
delta_t = 1;
noise_sigma = [1 0 0; %x方向加速度的标准差值
               0 1 0; %y方向加速度的标准差值
               0 0 0.05];%  %角速度的标准差值。  标准差,只涉及到三个噪声而非五个?
 %如果是5个噪声的话,分别是:x的加速度噪声,vx的加速度噪声,y的加速度噪声,vy的加速度的噪声,omega的噪声
 %如果是3个噪声的话,表明x和vx的噪声是同一个噪声,y和vy的噪声是同一个,omega的噪声是一个
 %因此,如果采用的是5个噪声,那么噪声系数必然是5列的;但是这里采用了3个噪声,因此噪声系数就是3列了
 %而我们的状态值选取的是[x ; vx ; y ; vy ; omega]是5行的,因此噪声系数是 5行3列的,与3行1列的噪声V相乘后得到5行1列
 
 % CT运动模型的公式或者说方程:恒定速度和恒定角速度。略去公式推导了
 % xk+1  = xk + (sinwt)/w * vxk - (1-coswt)/w * vyk + 0.5*ax*t^2  而ax符合N(0,noise_sigma_x)
 % vxk+1 = (coswt) * vxk - (sinwt) * vyk + ax * t
 % yk+1  = (1-coswt)/w * vxk + yk + (sinwt)/w * vyk + 0.5*ay*t^2  而ay符合N(0,noise_sigma_y)
 % vyk+1 = (sinwt) * vxk + (coswt) * vyk + ay * t
 % wk = wk+1 + aw*t%恒定角速度
 %写成矩阵形式就可以得到 运动系数F 和 噪声系数G
 % Xk+1 = F * Xk + G * a_noise
G = [ 0.5*delta_t^2, 0, 0;
      delta_t,       0, 0;
      0, 0.5*delta_t^2, 0;
      0,       delta_t, 0;
      0,       0, delta_t]; %为常系数,而F并不是常系数(如果w有变化的话)!?
noise_sigma2 = noise_sigma .* noise_sigma' ; %方差值
a_noise = noise_sigma2 * randn(3,1);  % 结果是得到3行1列的矩阵值,代表加速度值

%运动方程必须初始化初值即最开始的速度、位置、角速度值需要自己给定或者通过其他方式要获得,有初值才能递推
M = 20; %跟踪时长
X=zeros(5,M);%目标状态值 所有时刻下的
x0 = [100; 10; 100; 5; 0.02]; %初始坐标时(100,100),初始速度是(10,5),初始角速度是0.02 这是单个目标的
%x=x0(1,1),vx=x0(2,1),y=x0(3,1),vy=x0(4,1),w=x0(5,1)
% x0 = [100 20; 0 0; 100 50; 0 0; 0.01 0.02]; %这是两个目标的即跟踪两个目标

subplot(1,3,3); %单个目标下的CT运动模型
for i=1:M %遍历每个时刻即计算每个时刻的状态值
    sinwt = sin(x0(5,1)*delta_t);
    coswt = cos(x0(5,1)*delta_t);
    X(1,i) = x0(1,1) + sinwt*x0(2,1)/x0(5,1) - (1-coswt)*x0(4,1)/x0(5,1);
    X(2,i) = (coswt)*x0(2,1) -  sinwt*x0(4,1);
    X(3,i) = (1-coswt)*x0(2,1)/x0(5,1) + x0(3,1) + sinwt*x0(4,1)/x0(5,1);
    X(4,i) = sinwt*x0(2,1) + (coswt)*x0(4,1);
    X(5,i) = x0(5,1); %这是还未加入噪声时的
%     x0 = X(:,i); %实现迭代 
%     plot(X(1,i),X(3,i),'k.'); pause(0.5); hold on
    
    %加入噪声
    a_noise = noise_sigma2 * randn(3,1);
    X(:,i) = X(:,i) + G*a_noise;
    x0 = X(:,i); %实现迭代 
    plot(X(1,i),X(3,i),'k.');  
    text(X(1,i),X(3,i),num2str(i));
    hold on
end  
title('CT模型');
%如果是多个目标,那么每个目标的noise_sigma2和x0都应该是不同的

四、仿真结果

运行了三次,试图观察规律

第一次
在这里插入图片描述
第二次
在这里插入图片描述

第三次
在这里插入图片描述
感觉 C V CV CV模型的曲线几次仿真的差别有点大,并且 x x x方向总是想找负方向运动的,而其他模型都是向着正方向运动的。

  • 10
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
OpenCV是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。而隐马尔可夫模型是一种统计模型,用于描述具有马尔可夫性质但无法直接观察到的隐含状态序列。 在运动轨迹识别中,可以利用OpenCV中的隐马尔可夫模型来对运动轨迹进行建模和识别。首先,需要收集一些已知类别的运动轨迹样本,这些样本可以是预先手动标注好的轨迹数据。然后,通过训练这些轨迹样本,可以得到每个类别的隐马尔可夫模型。 在应用阶段,当有一个新的未知轨迹进来时,可以使用这些已训练好的隐马尔可夫模型进行轨迹识别。具体而言,可以通过计算未知轨迹与每个类别模型之间的相似性得分来判断其所属类别。通常,可采用Viterbi算法来计算轨迹与模型之间的匹配得分和最优路径,从而识别出其类别。 在运动轨迹识别中,隐马尔可夫模型可以帮助我们对连续的运动轨迹序列进行建模和分类。通过使用OpenCV库中的相关函数和算法,我们可以方便地实现运动轨迹的特征提取、模型训练和识别等功能。这种方法在许多计算机视觉应用中都有广泛的应用,如动作识别、行人跟踪等。 总之,OpenCV结合隐马尔可夫模型运动轨迹识别中是一种有效的方法。通过收集训练样本、训练模型和使用模型进行识别,我们可以准确地对运动轨迹进行分类和识别。这种方法不仅在学术研究中有重要的应用,而且在实际的计算机视觉系统中也有着广泛的应用前景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值