您现在的位置:首页 >> 三维重建 >> 内容

m基于PCA-SA低纬紧致姿态空间学习算法的单目视频人体姿态提取matlab仿真

时间:2023/3/10 22:05:53 点击:

  核心提示:09_032_m,包括程序操作录像+说明文档+参考文献...

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

作者:我爱C编程 来源:我爱C编程
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
本类固顶
  • 没有
  • FPGA/MATLAB商业/科研类项目合作(www.store718.com) © 2025 版权所有 All Rights Reserved.
  • Email:1480526168@qq.com 站长QQ: 1480526168