基于CASIA-GaitDatasetB步态图像轮廓数据库的步态周期检测与步态角度特征MATLAB源码
生活随笔
收集整理的這篇文章主要介紹了
基于CASIA-GaitDatasetB步态图像轮廓数据库的步态周期检测与步态角度特征MATLAB源码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
部分核心程序:D197
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 步態特征提取 寬高比特征以及角度特征close all; clear; clc; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Trainingfilenum = 3; % 訓練人數 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for filnum = 1:Trainingfilenum % 第一部分: 從不同文件夾導入圖片 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% %%%% 第一步: 導入二值化步態圖片,圖片來自中科院CASIA數據庫B庫% 導入圖集為一個步態周期,且以步態跨度最大時為起始時刻figure('NumberTitle','off','Name','數據庫圖集');%%%% %%%% 從圖集中讀取所有圖片fileDir = ['gaitpic\Trainingset\cl',num2str(filnum),'\']; % 文件夾路徑(這里指的圖片文件)filePattern = '*.png'; % 文件格式(圖片格式)dis = dir([fileDir,filePattern]); % 利用dir函數,返回fileDir路徑下、filePattern% 所有文件(文件名、文件路徑、日期、字節等)infilenames = {dis.name}; % 得到文件名infilenums = length(infilenames); % 得到文件個數for i=1:infilenums % 循環讀取文件filen = [fileDir infilenames{i}]; % '\gaitpic\Trainingset\cl-filnum\第i個文件'gpic = imread(filen); % imread('gaitpic\Trainingset\cl-filnum\第i個文件')GaitMessage(filnum).GaitPicture(:,:,i) = gpic;imshow(GaitMessage(filnum).GaitPicture(:,:,i));title(['No.1-',num2str(i)]);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end % 第一部分 導入圖片 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for filnum = 1:Trainingfilenum % 第二部分: 圖像預處理 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% 1、形態學處理figure('NumberTitle','off','Name','圖像預處理-形態學處理');% picnums獲取第filnum個人的步態圖片張數[height,width,picnums] = size( GaitMessage(filnum).GaitPicture); % 選取形態學處理的結構元素 close_se = strel('disk',4); % 邊長為4的圓盤結構元素open_se = strel('disk',4); % 邊長為4的圓盤結構元素%%%% 進行邊長為4的八邊形 先閉后開運算for i=1:picnums % 對該人的所有步態圖像進行形態學處理clo = imclose( GaitMessage(filnum).GaitPicture(:,:,i) ,close_se); % 閉運算操作ope = imopen(clo,open_se); % 開運算操作GaitMessage(filnum).Morphology(:,:,i) = ope; % 形態學處理后的圖片 imshow( GaitMessage(filnum).Morphology(:,:,i) );title(['No.2-1-',num2str(i)]);end%%%% %%%% 2、人像輪廓提取(邊緣檢測) - 骨骼提取(細化函數) - 生成輪廓骨骼圖像 figure('NumberTitle','off','Name','圖像預處理-邊緣檢測');for i=1:picnumsGaitMessage(filnum).Edgepic(:,:,i) = edge( GaitMessage(filnum).Morphology(:,:,i),'sobel'); % sobel算子GaitMessage(filnum).Skeletonpic(:,:,i) = bwmorph( GaitMessage(filnum).Morphology(:,:,i),'thin',Inf); % 人體細化GaitMessage(filnum).EdgeandSkeleton(:,:,i) = GaitMessage(filnum).Edgepic(:,:,i) + GaitMessage(filnum).Skeletonpic(:,:,i); % 生成輪廓骨骼圖% 保存下來,保存路徑為:gaitpic/EdgeandSkeleton/all/filnum-es-i.pngimwrite( GaitMessage(filnum).EdgeandSkeleton(:,:,i) , strcat(['gaitpic/EdgeandSkeleton/all/',num2str(filnum),'es',num2str(i),'.png']));% 畫圖部分 % imshow( GaitMessage(filnum).Edgepic(:,:,i) );title(['No.2-2-',num2str(i)]); % 顯示輪廓圖 ; % imshow( GaitMessage(filnum).Skeletonpic(:,:,i) );title(['No.2-2-',num2str(i)]); % 顯示骨骼圖 imshow( GaitMessage(filnum).EdgeandSkeleton(:,:,i) );title(['No.2-2-',num2str(i)]); % 顯示輪廓骨骼圖% 畫圖結束end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end % 第二部分: 圖像預處理 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for filnum = 1:Trainingfilenum % 第三部分: 步態周期檢測與提取 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% picnums獲取第filnum個人的步態圖片張數[height,width,picnums] = size( GaitMessage(filnum).GaitPicture); %%%% %%%% 獲得每個輪廓的最小外接矩形 & 以其矩形的長寬作為人像高寬for i=1:picnums imbiEdgepic = imbinarize( GaitMessage(filnum).Morphology(:,:,i) ); % 步態圖二值化%%%% regionprops函數用于返回圖片的屬性,求各個輪廓的最小外接矩形GaitMessage(filnum).BoundBs(1,i) = regionprops(imbiEdgepic,'BoundingBox'); % 利用函數度量圖像區域屬性,這里度量最小外接矩形% 返回一個結構數據,其內是有關最小外接矩形的位置% 長、寬信息,調用格式:s.BoundingBox% s.BoundingBox = [x,y,w(△x),h(△y)]%%%% 求各個對應的寬高比rec_width = GaitMessage(filnum).BoundBs(i).BoundingBox(3); % 寬rec_heigh = GaitMessage(filnum).BoundBs(i).BoundingBox(4); % 高GaitFeatures(filnum).Aspectratio(1,i) = rec_width / rec_heigh; % 寬高比特征end% 畫圖部分:figure('NumberTitle','off','Name','步態周期檢測-寬高比');plot(GaitFeatures(filnum).Aspectratio); title(['No.3-',num2str(filnum),'步態集-人像寬高比變化曲線']);% 畫出面積走勢圖% 畫圖結束%%%% %%%% 取連續三個局部最小值之間為一個周期(也可以取得連續三個局部最大值之間為一個周期)%%%% 利用尋找峰值函數找到局部極值[peas,locs] = findpeaks( -GaitFeatures(filnum).Aspectratio );% 由于想尋找局部極小值,而該函數是尋找局部極大值,所以對其取負peas = - peas; % 將值還原 % 由于本次未使用這個值,所以注釋掉了;如果需要使用,則需要將注釋去除,不然值是所需值的負數%%%% 取連續三個局部最小值之間為一個周期,第一個極小為起點,第三個極小為終點periodstart = 1;periodend = 3;GaitMessage(filnum).periodlocs = [locs(periodstart) locs(periodend)];%%%% 取寬高比周期GaitMessage(filnum).mPeriod = GaitFeatures(filnum).Aspectratio(GaitMessage(filnum).periodlocs(1):GaitMessage(filnum).periodlocs(2));% 畫圖部分:figure('NumberTitle','off','Name','步態周期檢測-周期提取');plot(GaitMessage(filnum).mPeriod);title(['No.3-',num2str(filnum),'步態集-步態周期內人像寬高比變化曲線']);% 畫出面積走勢圖% 畫圖結束%%%% 取周期內的步態圖片GaitMessage(filnum).GaitPeriod = GaitMessage(filnum).EdgeandSkeleton(:,:,GaitMessage(filnum).periodlocs(1):GaitMessage(filnum).periodlocs(2));[height,width,picnums] = size( GaitMessage(filnum).GaitPeriod ); for i = 1:picnums%保存下來,保存路徑為:gaitpic/EdgeandSkeleton/period/filnum-es-i.pngimwrite( GaitMessage(filnum).GaitPeriod(:,:,i) , strcat(['gaitpic/EdgeandSkeleton/period/',num2str(filnum),'es',num2str(i),'.png']));end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end % 第三部分: 步態周期檢測 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for filnum = 1:Trainingfilenum % 第四部分: 角度特征提取 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% %%%% 第四步: 步態特征提取sectornums = 2; % 分區數,即將下半身分為兩個分區,將人像以垂直軸(y軸)為分界線,左右分別為一個分區%%%% %%%% 整個過程角度特征距離特征 以質心為原點,對下半身采用2分區,提取各個分區信息以及輪廓像素信息,[GaitFeatures(filnum).nthsectorFeatures,Outlinepixelmessage,centroid] = test_Outlinepixel2Centroid_AngleDistance(GaitMessage(filnum).EdgeandSkeleton,sectornums);% 只獲取一個步態周期內的角度特征for nths = 1:sectornumsGaitFeatures(filnum).nthsectorPeriodFeatures(nths).PeriodaverageAngle = GaitFeatures(filnum).nthsectorFeatures(nths).averageAngle(GaitMessage(filnum).periodlocs(1):GaitMessage(filnum).periodlocs(2));end%%%% 畫圖部分:畫出該人步態角度特征figure('NumberTitle','off','Name','同一人整個過程-角度特征');for i = 1:sectornumsplot(GaitFeatures(filnum).nthsectorFeatures(i).averageAngle - 270);title(['No.4-',num2str(filnum),'-1','同一人的1/2分區-角度均值變化曲線']) % 畫出角度走勢圖hold onend% 對應的周期角度特征曲線figure('NumberTitle','off','Name','同一人步態周期內-角度特征');for i = 1:sectornumsplot(GaitFeatures(filnum).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270);title(['No.4-',num2str(filnum),'-2','同一人的1/2分區-周期角度均值變化曲線']) % 畫出角度走勢圖hold onend%%%% 畫圖結束%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end % 第四部分: 角度特征提取 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for filnum = 1:Trainingfilenum % 畫圖部分-畫出當前所有測試人員的角度特征曲線 % 注:這里給出最多畫10人不同曲線的代碼,由于曲線線條形狀、顏色不同,采用switch語句來畫 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% 畫圖部分: 畫出當前所有測試人員的角度特征曲線switch filnumcase 1 figure('NumberTitle','off','Name','所有人整個過程-角度特征');title('不同行人左右分區角度特征比較');% 畫出走勢圖for i = 1:sectornumsplot(GaitFeatures(1).nthsectorFeatures(i).averageAngle - 270,'b-o','MarkerFaceColor','b');hold onendcase 2 for i = 1:sectornumsplot(GaitFeatures(2).nthsectorFeatures(i).averageAngle - 270,'g-x','MarkerFaceColor','g');hold onendcase 3 for i = 1:sectornumsplot(GaitFeatures(3).nthsectorFeatures(i).averageAngle - 270,'r-*','MarkerFaceColor','r');hold onendcase 4 for i = 1:sectornumsplot(GaitFeatures(4).nthsectorFeatures(i).averageAngle - 270,'c-p','MarkerFaceColor','c');hold onendcase 5 for i = 1:sectornumstitle('不同行人左右分區角度特征比較');% 畫出走勢圖plot(GaitFeatures(5).nthsectorFeatures(i).averageAngle - 270,'k-s','MarkerFaceColor','k');hold onendcase 6 figure('NumberTitle','off','Name','步態角度特征');title('不同行人左右分區角度特征比較');% 畫出走勢圖for i = 1:sectornumsplot(GaitFeatures(6).nthsectorFeatures(i).averageAngle - 270,'b-o','MarkerFaceColor','b');hold onendcase 7 for i = 1:sectornumsplot(GaitFeatures(7).nthsectorFeatures(i).averageAngle - 270,'g-x','MarkerFaceColor','g');hold onendcase 8 for i = 1:sectornumsplot(GaitFeatures(8).nthsectorFeatures(i).averageAngle - 270,'r-*','MarkerFaceColor','r');hold onendcase 9 for i = 1:sectornumsplot(GaitFeatures(9).nthsectorFeatures(i).averageAngle - 270,'c-p','MarkerFaceColor','c');hold onendcase 10 for i = 1:sectornumstitle('不同行人左右分區角度特征比較');% 畫出走勢圖plot(GaitFeatures(10).nthsectorFeatures(i).averageAngle - 270,'k-s','MarkerFaceColor','k');hold onendend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end % 畫圖部分結束-畫出當前所有測試人員的角度特征曲線 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for filnum = 1:Trainingfilenum % 畫圖部分-畫出當前所有測試人員的角度特征曲線 % 注:這里給出最多畫10人不同曲線的代碼,由于曲線線條形狀、顏色不同,采用switch語句來畫 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% 對應的周期角度特征曲線switch filnumcase 1 figure('NumberTitle','off','Name','不同行人步態周期內角度特征');title('不同行人左右分區角度特征比較');% 畫出走勢圖for i = 1:sectornumsplot(GaitFeatures(1).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270,'b-o','MarkerFaceColor','b');hold onendcase 2 for i = 1:sectornumsplot(GaitFeatures(2).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270,'g-x','MarkerFaceColor','g');hold onendcase 3 for i = 1:sectornumsplot(GaitFeatures(3).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270,'r-*','MarkerFaceColor','r');hold onendcase 4 for i = 1:sectornumsplot(GaitFeatures(4).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270,'c-p','MarkerFaceColor','c');hold onendcase 5 for i = 1:sectornumstitle('不同行人左右分區角度特征比較');% 畫出走勢圖plot(GaitFeatures(5).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270,'k-s','MarkerFaceColor','k');hold onendcase 6 figure('NumberTitle','off','Name','步態角度特征');title('不同行人左右分區角度特征比較');% 畫出走勢圖for i = 1:sectornumsplot(GaitFeatures(6).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270,'b-o','MarkerFaceColor','b');hold onendcase 7 for i = 1:sectornumsplot(GaitFeatures(7).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270,'g-x','MarkerFaceColor','g');hold onendcase 8 for i = 1:sectornumsplot(GaitFeatures(8).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270,'r-*','MarkerFaceColor','r');hold onendcase 9 for i = 1:sectornumsplot(GaitFeatures(9).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270,'c-p','MarkerFaceColor','c');hold onendcase 10 for i = 1:sectornumstitle('不同行人左右分區角度特征比較');% 畫出走勢圖plot(GaitFeatures(10).nthsectorPeriodFeatures(i).PeriodaverageAngle - 270,'k-s','MarkerFaceColor','k');hold onendend %%%% %%%% 畫圖結束 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end % 畫圖部分結束-畫出當前所有測試人員的角度特征曲線 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%總結
以上是生活随笔為你收集整理的基于CASIA-GaitDatasetB步态图像轮廓数据库的步态周期检测与步态角度特征MATLAB源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【步态识别】基于CNN、步态能量图+HO
- 下一篇: 【LDPC/STBC】基于LDPC/ST