基于中科院-CASIA-GaitDatasetB步态图像轮廓数据库的步态周期检测与步态角度特征MATLAB源码介绍
在上一篇博文中“基于中科院-CASIA-GaitDatasetB步态图像轮廓数据库的步态周期检测与步态角度特征”( https://blog.youkuaiyun.com/BinHeon/article/details/94619690 )介绍了如何基于中科院-CASIA-GaitDatasetB步态图像轮廓数据库获得步态周期以及步态宽高比特征、角度特征。这里便给出其对应的MATLAB源码。
我工程里的步态数据是从GaitDatasetB截选的10人,如果有需要我matlab源码工程作参考的,可以点赞并留言,如果是不缺积分的大佬,也可以直接在我的主页下载里面下载:https://download.youkuaiyun.com/download/binheon/11289205
一、MATLAB工程说明
首先说明一下我的matlab工程文件夹的结构;一是介绍下主要构成,二是这关系到读取步态图片部分的处理。

该文件夹中:
“gaitpic”文件夹:步态图片文件夹,以及仿真过程中保存的轮廓骨骼图等;内部如下图2所示。
“GaitCode.m”:总体程序。
“test_Outlinepixel2Centroid_AngleDistance.m”:获取分区角度等信息的函数。

二、MATLAB代码
1、导入步态图片文件部分
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Trainingfilenum = 3; % 训练人数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for filnum = 1:Trainingfilenum % 第一部分: 从不同文件夹导入图片
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% %%%% %%%% %%%% 第一步: 导入二值化步态图片,图片来自中科院CASIA数据库B库
% 导入图集为各个行人的步态图像;然后以下以第一次出现步态跨度最小至第三次出现步态最小为一个步态周期。
figure('NumberTitle','off','Name','数据库图集');
%%%% %%%% 从图集中读取所有图片
fileDir = ['gaitpic\Trainingset\cl',num2str(filnum),'\']; % 文件夹路径(这里指的图片文件),filnum为行人XXX的步态
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 % 第一部分 导入图片
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
利用结构体数据:GaitMessage(filnum).GaitPicture(:,:,i),将步态图片数据从cl1、cl2、cl3…文件夹中读取出来,filnum为对应的第filnum个文件夹,其中包含行人xxx的步态图片,i为便是该文件夹中xxx的第i张步态图片。如下图2-1便是读取之后显示出来的效果(截选):


2、图像预处理部分(形态学、轮廓提取、骨骼提取)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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-',num2str(filnum),'-1-',num2str(i)]);
end
%%%% %%%% 2、人像轮廓提取(边缘检测) - 骨骼提取(细化函数) - 生成轮廓骨骼图像
figure('NumberTitle','off','Name','图像预处理-边缘检测');
for i=1:picnums
GaitMessage(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.png
imwrite( GaitMessage(filnum).EdgeandSkeleton(:,:,i) , strcat(['gaitpic/EdgeandSkeleton/all/',num2str(filnum),'es',num2str(i),'.png']));
% 画图部分
% imshow( GaitMessage(filnum).Edgepic(:,:,i) );title(['No.2-',num2str(filnum),'-2-',num2str(i)]); % 显示轮廓图 ;
% imshow( GaitMessage(filnum).Skeletonpic(:,:,i) );title(['No.2-',num2str(filnum),'-2-',num2str(i)]); % 显示骨骼图
imshow( GaitMessage(filnum).EdgeandSkeleton(:,:,i) );title(['No.2-',num2str(filnum),'-2-',num2str(i)]); % 显示轮廓骨骼图
% 画图结束
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end % 第二部分: 图像预处理
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
图像预处理主要将原始的轮廓图中的缺陷以及多余连接区域进行填充、腐蚀;从而使得人像更加平滑。结构体:GaitMessage(filnum).Morphology(:,:,i)便是用于储存形态学处理后的图片信息的参数,filnum为对应的第filnum个文件夹,其中包含行人xxx的步态图片,i为便是该文件夹中xxx的第i张步态图片;下面2-2便是形态学处理的效果。

紧接着便是对形态学处理后的步态图片进行轮廓的提取,只保留人像轮廓便足够体现人体步态信息,还能极大的减少计算量。本次调用edge函数,利用sobo算子,计算人像轮廓并保存至结构体:GaitMessage(filnum).Edgepic(:,:,i)中,filnum为对应的第filnum个文件夹,其中包含行人xxx的步态图片,i为便是该文件夹中xxx的第i张步态图片。图2-3便是提取轮廓的效果

然后便利用细化函数bwmorph( GaitMessage(filnum).Morphology(:,:,i),‘thin’,Inf),用人像的二值图提取人像的骨架,并对应保存在结构体:GaitMessage(filnum).Skeletonpic(:,:,i)中,filnum为对应的第filnum个文件夹,其中包含行人xxx的步态图片,i为便是该文件夹中xxx的第i张步态图片。
提取出人像轮廓以及人体骨架之后,将两者进行叠加,进而生成具有骨架的人像轮廓图片,如下图2-4所示:

3、步态周期检测部分
// An highlighted block
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for filnum = 1:Trainingfilenum % 第三部分: 步态周期检测与提取
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% picnums获取第filnum个人的步态图片张数
[height,width,picnums] = size( GaitMessage(filnum).GaitPicture);
%%%% %%%% 获得每个轮廓的最小外接矩形 & 以其矩形的长宽作为人像高宽
for i=1:picnums
imbiEdgepic

本文介绍了一种基于中科院-CASIA-GaitDatasetB步态图像轮廓数据库的步态周期检测与步态角度特征提取的方法。通过MATLAB源码实现,详细展示了步态图片的读取、图像预处理、步态周期检测、角度特征提取等关键步骤。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



