1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/ZJaWk51v
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
介绍了运动人体的剪影提取,在视频序列中,由于受到复杂背景、遮挡、光照变化等因素的影响,通常的背景分离算法无法有效的对运动人体进行提取,本文介绍了一种基于高斯混合模型和帧差法相结合的运动目标提取算法,从而获得了精度较高的运动人体剪影。
由于人体姿态运动数据通常是高维矩阵数据,在处理之前一般需要进行降维度处理,首先通过传统的PCA降维算法进行处理。然后分析了PCA算法的缺陷和不足,并在PCA算法的基础上提出了一种基于概率信息的改进PCA算法。在PCA的基础上,加入一个噪声变量,用来调整后面N-M个高维度的数据的精度。 通过最大似然估计进行估计这个噪声模型,然后叠加到PCA模型的高维数据上。
对降维后的数据进行粒子群的姿态估计,这里首先使用PSO粒子群优化算法进行优化,然后使用模拟退火算法进行优化,最后通过对比分析,提出了一种基于基因突变的变权值模拟退火粒子群优化算法,通过该算法,可以大大改进最后的收敛效果,使得最后的收敛值趋于稳定收敛,收敛值达到更小的误差水平,并且不存在粒子突变的情况。
4.部分源码
.........................................................................
%%
%读取视频数据
%获得视频,从视频中提取每帧对应的jpg图像,这样方便后面的处理,如果视频序列默认是连续图像,那么这段语句就可以不用
%支持视频格式avi格式
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
%%
%姿态读取
if Start(3) == 1
disp('Start read AMC and ASF file...');
load Save_Temp\Start2\Start01.mat;
skel = acclaimReadSkel(FileName_ASF);
[channels, skel] = acclaimLoadChannels(FileName_AMC,skel);
[handle,channels,skelStruct] = skelPlayData(skel,channels);
if SHOW_BJ_SKLer == 1
for j = 1:size(channels,1)
pause(0.005)
skelModify(handle,channels(j,:),skelStruct);
end
end
%假设人体姿态空间为X,对于特定的运动选取一段人体运动数据作为训练数据
%矩阵X
X0 = channels';
whole_times = size(X0,2);
MM = size(X0,1);
%计算每个姿态的时间均值
for j = 1:MM
c(j) = mean(X0(:,j));
end
%获得人体数据
for j = 1:whole_times
X(:,j) = X0(:,j) - c';
end
%对矩阵X作奇异值分解,得到主方向
[U,S,V] = svd(X);
%姿态向量投影到子空间
for j = 1:whole_times
Xs(:,j) = U(:,1:mmer)'*X(:,j);%UT*(x-c)
end
figure;
plot3(Xs(1,:),Xs(2,:),Xs(3,:),'bo');
title('三维流形空间中的表示');
grid on;
xlabel('X');
ylabel('Y');
zlabel('Z');
%视频帧数量和节点帧数量一致化
Rate = round(whole_times/frameNum_Original2);
skel = acclaimReadSkel(FileName_ASF);
[channels, skel] = acclaimLoadChannels(FileName_AMC,skel);
[handle,channels,skelStruct] = skelPlayData(skel,channels);
save Save_Temp\Start3\Start01.mat skel handle channels skelStruct whole_times MM c X0 X U S V Xs Rate
clear skel handle channels skelStruct whole_times MM c X0 X U S V Xs Rate
disp('Read AMC and ASF file over...');
pause(8);
close all;
end
%%
%基于模拟退火的粒子群优化算法(此处将会未来做改进版本)
if Start(4) == 1
disp('SAPSO...');
load Save_Temp\Start2\Start01.mat
load Save_Temp\Start3\Start01.mat
%计算最大值和最小值
for i = 1:whole_times
Xmin(i) = min(Xs(:,i));
Xmax(i) = max(Xs(:,i));
Vmin(i) = alphaer*Xmin(i);
Vmax(i) = alphaer*Xmax(i);
end
%K均值聚类
Data = Xs;
[row,col] = size(Data);
Center = Data(:,1:Cluster_Numer);
%进行初始的迭代
[KindData,KindNum] = func_Kmeans_Cluster(Center,Data);
NewCenter = func_NewCenter(KindData,KindNum,row);
while (sum(sum(NewCenter ~= Center))) & Step
Center = NewCenter;
[KindData,KindNum] = func_Kmeans_Cluster(Center,Data);
NewCenter = func_NewCenter(KindData,KindNum,row);
Step = Step-1;
end
for i = 1:Cluster_Numer
for j = 1:length(Data)
if KindData(1,j,i) ~= 0 | KindData(2,j,i) ~= 0
if i == 1
plot3(KindData(1,j,i),KindData(2,j,i),KindData(3,j,i),'ro');hold on
end
if i == 2
plot3(KindData(1,j,i),KindData(2,j,i),KindData(3,j,i),'bo');hold on
end
if i == 3
plot3(KindData(1,j,i),KindData(2,j,i),KindData(3,j,i),'go');hold on
end
if i == 4
plot3(KindData(1,j,i),KindData(2,j,i),KindData(3,j,i),'ko');hold on
end
if i == 5
plot3(KindData(1,j,i),KindData(2,j,i),KindData(3,j,i),'mo');hold on
end
end
end
end
................................................................................
%画最佳适应度值
figure(4);
plot(V_score2,'b');
xlabel('迭代次数');
xlabel('适应度值');
grid on
%计算训练误差
%显示误差
load Save_Temp\Start2\Start01.mat
load Save_Temp\Start3\Start01.mat
%计算其误差
Lss = min(length(PP),length(X_rate));
for i = 1:MM
Err(i) = (abs(sum((PP(i,1:Lss)) - X_rate(i,1:Lss))))/length(X_rate(i,1:Lss));
end
figure(5);
subplot(211);
bar(Err1);
xlabel('Frame No.');
ylabel('Mean Error');
grid on;
subplot(212);
plot(Err1,'r-o');
xlabel('Frame No.');
ylabel('Mean Error');
grid on;
figure(6);
subplot(211);
bar(Err2);
xlabel('Frame No.');
ylabel('Mean Error');
grid on;
subplot(212);
plot(Err2,'r-o');
xlabel('Frame No.');
ylabel('Mean Error');
grid on;
%显示最后的姿态轨迹结果和标志结果的对比
load Save_Temp\Start4\W.mat
figure(7);
plot(w);
grid on;
figure(8);
skel = acclaimReadSkel(FileName_ASF);
[channels, skel] = acclaimLoadChannels(FileName_AMC,skel);
[handle,channels,skelStruct] = skelPlayData(skel,channels);
%标准数据
for j = 1:Lss
pause(0.05)
skelModify(handle,channels(Rate*j,:),skelStruct);
end
%预测数据
for j = 1:Lss
pause(0.05)
skelModify(handle,PP(:,j),skelStruct);
end
%显示姿态估计的最终效果:原始图像,标准姿态,估计姿态,叠加效果
disp('cal the error over...');
pause(1);
end
09_032_m