基于matlab的粒子群视频跟踪算法仿真

目录

一、理论基础

二、案例背景

三、MATLAB程序

四、仿真结论分析

一、理论基础

帧差法和粒子滤波结合的算法,整个算法的流程如下所示:

 

算法的具体过程如下所示:

帧差法比较简单,这里不做进一步的介绍,这主要介绍一下粒子滤波的过程:

 

 

 

 

 

二、案例背景

视频目标跟踪是计算机视觉一个重要研究领域,在众多行业中有着广泛的应用需求和应用前景。视频跟踪的主要任务是跟踪视频图像序列中的动态目标,获得目标的位置、速度、以及运动轨迹等参数。近年来,基于贝叶斯递推估计框架的粒子滤波方法为视频跟踪问题提供了新的解决途径。而在实际的目标跟踪应用中,由于光照、目标姿态、复杂背景、遮挡等影响因素增加了目标跟踪的难度,因此利用粒子滤波方法实现稳定、精确的目标跟踪是非常具有挑战性的研究课题。

粒子群算法是一种新的进化算法,算法思路适合于进行视频跟踪,但是由于在视频跟踪过程中以跟踪窗口作为粒子,因此该粒子具有中心点横坐标、中心点纵坐标和窗口半径三维特征向量,计算冗余较大,难以满足视频跟踪的实时性要求.提出了一种多粒子群视频跟踪算法,即在跟踪过程中使用多个粒子群,粒子群与粒子群之间粒子半径不同,在各粒子群以评价函数收敛到最佳中心点后,再完成各自半径的一维粒子群计算.这样就可将三维粒子群计算分为一个两维和一个一维粒子群计算,最后通过比较得出最佳粒子,作为搜索结果.分析了这一算法成立的必要条件,即当选择Bhattacharyya系数计算方法作为粒子群算法的评价函数时,大于目标的固定窗体的中心点可以收敛到目标的形心.

三、MATLAB程序

matlab核心程序如下所示:

clc;
clear;
close all;
warning off;
addpath 'func\'
addpath 'vedio\'
%原重采样
Samples = 1;
SEL = 1;
%粒子更新滤波
Para_Updata = [1,0,1,0;
0,1,0,1;
0,0,1,0;
0,0,0,1];
Num_Particles = 30000;
X_rgb = 30;
X_pos = 15;
X_vec = 5;
%读取视频以及视频参数
PIX = VideoReader('a.avi');
PIX_Size = [PIX.Width,PIX.Height];
Num_Frame = floor(PIX.Duration * PIX.FrameRate);
%粒子初始化
X1 = func_Particle_initial(PIX_Size,Num_Particles);
X2 = func_Particle_initial(PIX_Size,Num_Particles);
for Frm = 15:Num_Frame-15
%获得每一帧图像
PIX_each_frame = read(PIX,Frm); %进行差分运算
Y1 = read(PIX,Frm-1);
Y2 = read(PIX,Frm);
tmps = abs(Y1-Y2);
PIX_DIFF = 255*im2bw(tmps,graythresh(tmps));
PIX_DIFF2= im2bw(tmps,graythresh(tmps));
%通过帧差,锁定目标,然后计算目标的平均像素值
XX=0;
Target = [1;1;1];
for i = 1:size(Y1,1)
for j = 1:size(Y1,2)
if PIX_DIFF(i,j) == 255
Target(1,1) = Target(1,1)+Y1(i,j,1);
Target(2,1) = Target(2,1)+Y1(i,j,2);
Target(3,1) = Target(3,1)+Y1(i,j,3);
XX=XX+1;
end
end
end
Target = Target/XX;
%更新粒子
X1 = func_Particle_Updata(Para_Updata,X_pos,X_vec,X1);
%计算状态
STATE1 = func_Likelihood(X_rgb,[255;255;255],X1(1:2,:),PIX_DIFF);
%粒子重采样
X1 = func_Particle_Resample(X1,STATE1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%更新粒子
X2 = func_Particle_Updata(Para_Updata,X_pos,X_vec,X2);
%计算状态
STATE2 = func_Likelihood(X_rgb,Target,X2(1:2,:),PIX_each_frame);
%粒子重采样
X2 = func_Particle_Resample(X2,STATE2);
%跟踪效果显示
figure(1);
image(PIX_each_frame)
if Samples == 1
STR = ['(原重采样)粒子跟踪效果',num2str(Frm)];
else
STR = ['(改进重采样)粒子跟踪效果',num2str(Frm)];
end
title(STR)
hold on
plot(X2(2,:),X2(1,:),'g.');
hold on
plot(X1(2,:),X1(1,:),'g.');
hold off
drawnow;
end
end

function STATE = func_Likelihood(X_rgb,X_trgt,X,PIX_each_frame);
High = size(PIX_each_frame,1);
Width = size(PIX_each_frame,2);
N = size(X,2);
STATE = zeros(1,N);
PIX_each_frame = permute(PIX_each_frame,[3,1,2]);
A = -log(sqrt(2*pi)*X_rgb);
B = -0.5/(X_rgb.^2);
X = floor(X);
for k = 1:N
m = X(1,k);
n = X(2,k);
I =(m>=1&m<=High);
J =(n>=1&n<=Width);
if I == 1 && J == 1
C = double(PIX_each_frame(:,m,n));
D = C-X_trgt;
D2 = D'*D;
STATE(k) = A+B*D2;
else
STATE(k) = -Inf;
end
end

四、仿真结论分析

仿真结果如下:

在本课题中,我们进行仿真,最后得到的仿真效果如下所示:

测试视频1:

 

 测试视频2:

 

 A10-23

 

posted @ 2022-10-20 13:52  fpga和matlab  阅读(176)  评论(0编辑  收藏  举报