1.算法仿真效果
matlab2013b仿真结果如下:
2.算法涉及理论知识概要
介绍了运动人体的剪影提取,在视频序列中,由于受到复杂背景、遮挡、光照变化等因素的影响,通常的背景分离算法无法有效的对运动人体进行提取,本文介绍了一种基于高斯混合模型和帧差法相结合的运动目标提取算法,从而获得了精度较高的运动人体剪影。
由于人体姿态运动数据通常是高维矩阵数据,在处理之前一般需要进行降维度处理,首先通过传统的PCA降维算法进行处理。然后分析了PCA算法的缺陷和不足,并在PCA算法的基础上提出了一种基于概率信息的改进PCA算法。在PCA的基础上,加入一个噪声变量,用来调整后面N-M个高维度的数据的精度。 通过最大似然估计进行估计这个噪声模型,然后叠加到PCA模型的高维数据上。
对降维后的数据进行粒子群的姿态估计,这里首先使用PSO粒子群优化算法进行优化,然后使用模拟退火算法进行优化,最后通过对比分析,提出了一种基于基因突变的变权值模拟退火粒子群优化算法,通过该算法,可以大大改进最后的收敛效果,使得最后的收敛值趋于稳定收敛,收敛值达到更小的误差水平,并且不存在粒子突变的情况。
最后,对CMU数据库中的不同运动姿态进行仿真,实验结果仿真可知本文方法不仅具有良好的计算效率,同时具有良好的收敛性和全局搜索能力,能准确估计和跟踪单目视频中的人体姿态。
目前,运动捕获数据有多种格式,应用较为广泛的主要有BVH、ASF/AMC、FBK、C3D以及HTR等。其中ASF/AMC是最常用的数据格式。因此,这里,我们重点对ASF/AMC的数据格式进行介绍。
ASF/AMC,全称Acclaim Skeleton File/Acclaim Motion Data,其主要由两个文件组成:一个骨架文件和一个运动文件。ASF是骨架文件,AMC是运动文件,对于每一个特定的动作,都是由骨架来完成的,这些数据,可以从CMU数据库中获得。
下面对ASF骨架数据进行简单的介绍,其基本结构如下图所示:
“:version”指示出骨架定义的版本;
“:name”允许对骨架数据进行命名;
“:units”定义了各种类型数据的单位和一些参数的默认值;
“:documentation”存储的是一些起到说明作用的文档信息;
“:root”部分定义了场景中一个特定的片段,它是骨架层次结构中的根节点,除了不包含方向和长度信息之外,和其他关节是一样的。其中”axis”定义了根对象的旋转顺序,”order”指出了应用于根节点的运动通道信息,并将以这样的顺序出现在AMC文件中。”Position”和”orientation”后面的信息给出了根节点的起始位置和方位,一般情况下都是0。
“:bonedata”部分对于层次结构中的其他骨骼信息分别进行了描述,对每个骨骼的定义都是以”begin”,开始,以”end”结束的。在对各个骨骼的定义中,包含以下几个部分:”id”是一个唯一的数字,标识了当前骨骼的序号,这一项并不是必须的,因为每段骨骼都有自己的名称,而且这个名称在层次部分和AMC文件中都被用到。”name”定义了骨骼的名称,需要注意的是,每个骨骼必须有一个唯一的名称。”direction”指出了骨骼的方向,根据该信息,可以知道如何绘制该骨骼,并定义了从父骨骼到子骨骼的方向。方向信息和长度信息决定了一个骨骼相对于其父骨骼的偏移量。”length”定义了骨骼的长度信息。”axis”部分给出了骨骼的旋转轴。通过将旋转轴指定为一个独立的值,运动数据可以独立于绘制和层次信息,这对于那些需要解决万向节死锁问题的应用来说显得尤为重要。”dof”指定了运动通道的数量和这些通道在AMC文件中出现的顺序。如果某个骨骼不包含”dof”部分,那就认为该骨骼没有任何运动数据。”limits”部分给出了自由度中指定的通道的限制信息。对于每个通道而言,限制信息都是以一对数字的形式给出的,规定了该通道允许的最小值和最大值,在运动编辑等过程中,这部分数据用来限制旋转的范围。
“:hierarchy“部分描述了各段骨骼之间的层次关系。
3.MATLAB核心程序
```if Start(1) == 1
disp('read the avi...');
[Obj,frameNum_Original] = get_AVI(FileName_AVI);
%将视频保存为jpg形式,方便对比处理
[pixel_original,pixel_gray] = vedio_op(Obj,frameNum_Original);
[RR,CC,KK] = size(pixel_gray);
for i = 1:min(frameNum_Original,Process_frames)
pixel_gray2(:,:,i) = imresize(pixel_gray(:,:,i),[RR/2,CC/2]);
pixel_original2(:,:,:,i) = imresize(pixel_original(:,:,:,i),[RR/2,CC/2]);
end
%保存数据
save Save_Temp\Start1\Start01.mat pixel_gray2 frameNum_Original RR CC
save Save_Temp\Start1\Start02.mat pixel_original2 frameNum_Original RR CC
clear Obj pixel_original pixel_gray pixel_original2 pixel_gray2 frameNum_Original
disp('read the avi over...');
pause(8);
close all;
end
....................................................................
figure;
for tt = 1:min(frameNum_Original,Process_frames)
tt
subplot(221)
imshow(image_sequence2(:,:,:,tt));
title('原始图像');
subplot(222)
imshow(uint8(background_Update2));
title('背景图像更新');
subplot(223)
imshow(Images02(:,:,tt));
title('运动目标检测');
subplot(224)
imshow(Images22(:,:,tt));
title('运动目标提取');
pause(0.2);
end
clear image_sequence2 background_Update2 Images02 Images22 pixel_original2 frameNum_Original2 RR CC
disp('Get the Background over...');
pause(8);
close all;
end
```