基于中科院-CASIA-GaitDatasetB步态图像轮廓数据库的步态周期检测与步态角度特征MATLAB源码介绍

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

基于中科院-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工程文件夹的结构;一是介绍下主要构成,二是这关系到读取步态图片部分的处理。

在这里插入图片描述

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

在这里插入图片描述

图1-2 10人步态轮廓图像以及提取出的一个周期内的步态图像


二、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-1 截选显示2人的步态轮廓图像各一张


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便是形态学处理的效果。

在这里插入图片描述

图2-2 截选部分人的步态轮廓图经过形态学处理效果

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

在这里插入图片描述

图2-3 截选部分人的步态轮廓图提取效果

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

在这里插入图片描述

图2-4 截选人像轮廓以及骨架叠加效果图


3、步态周期检测部分

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值