基于MATLAB的战术⼿势识别功能的设计与实现
⼀、课题介绍
⼿势识别技术是⼈们⽣活中常见的⼀类图像处理技术,也是⽬前⽐较⽕热的研究领域之⼀,⼿势识别可以⽤于⼈们⽣活中各种场景,⽐如利
⽤⼿势进⾏电视信息交互,只需要通过⼿势就能实现对电视机的控制;在很多的VR游戏中,利⽤⼿势可以完成各种各样的游戏动作。总之
⼿势识别技术在图像处理⾼速发展的情况下,变得越来越成熟,识别率以及识别速度也逐步提⾼,相信在不久的将来,⼿势识别技术⼀定会
发挥更⼤的作⽤。
为便于官兵在训练中加强对⼿语的记忆掌握,根据不同的战术背景不同的⼿语需要,本⽂通过对⼿势识别算法的研究,开发出了基于
MATLAB的战术⼿势识别功能。针对⼿势识别的实现,本⽂中⾸先研究了图像的预处理技术,通过对采集的战术⼿势图像的预处理,为后
续的战术⼿势图像处理打下基础。接着研究⼿势图像的分割算法,本⽂中主要针对⼿势图像的连通域进⾏分析,从⽽将⼿势图像从背景中分
割出来。⽽后将分割出的战术⼿势图像进⾏特征提取,采⽤⼿势图像的Hu不变矩以及空间⼏何特征作为图像的特征。最后利⽤BP神经⽹络
训练图像特征,得到最终识别结果。算法⾼效且准确,同时开发了基于MATLAB的GUI界⾯,⽤户交互良好,界⾯美观,具有⼀定的实⽤价
值。
1.课题意义
武警部队作为国家重要武装⼒量,履⾏着国家赋予的神圣使命,在执⾏解救⼈质、捕歼暴恐分⼦等任务时,确保良好的通信联络是分队⾏动
中通信保障的重点。低劣的通信质量在实战中将导致分队⽆法及时得到上级⾏动命令、失去对战场情况的把控,指挥部⽆法及时了解作战情
况,造成整个⾏动指挥的失控,最终导致丢失战场控制权,进⽽完全丧失战⽃⼒。
随着现代技术的发展,各种⽆线、有线通信联络⽅式飞速发展,有效保障了分队⾏动中的良好通信联络。但是,战场环境的多变导致依靠⽆
线电波等技术的通信联络具有较⾼的不确定性,其受地形、天⽓等要素的影响较多,同时也易遭到敌⽅势⼒的电⼦对抗打击从⽽降低甚⾄破
坏我⽅通信联络效能。故此,作为分队⾏动中的战术⼿势通信不可或缺。
战术⼿势识别主要是以战术⼿势⼏何特征检验为前提,是通过探究对应的⼿势图像⼏何形状轮廓,结合相关特性来判断战术⼿势所蕴含的意
义。就好⽐⼈在对另外⼀个战术⼿势进⾏识别的时候,往往需要访问⾃⼰⼤脑⾥⾯的记忆库,对相应的特征进⾏⽐对之后,如果与相关记忆
库识别⽐对成功,就能够识别出战术⼿势的含义,如果该对象的特征⽆法被匹配,那么说明⽆法识别。
在民⽤领域中,识别⼈⼿部动作并给予相应反馈的⼿势识别研究,应⽤前景及潜藏的经济价值不可估量。如果能将该技术运⽤在军事⽅⾯,
可以有效的提升部队现代化⽔平,提⾼部队对于信息的反应和处理能⼒,进⽽进⼀步提升单兵作战能⼒,减少物资和⼈员的消耗,全⾯提升
战⽃⼒。对于武警部队⽽⾔,分队战术⼿势识别技术可以⼴泛的被应⽤在反恐作战、防卫作战、处突维稳、⽇常执勤、看押看守等各个⽅
⾯,分队战术⼿势识别的研究处于模式识别、图像处理、机器学习和计算机语⾔等多学科领域交叉地带,综合性很强。战术⼿势研究典型的
应⽤领域有:智能控制、运动分析、虚拟现实等。通过战术⼿势识别技术的发展,可以实现⼈机通过⼿势变换进⾏交互,通过⼿势直接⽆线
控制PC等电⼦产品;在⽂体活动中,⼿势识别也⼤放异彩,通过运动分析及⼿势分析可以极⼤地提⾼运动与舞蹈训练⽔平;⼿势分析同样
可以帮助视频会议达到更好的效果,降低⼈物动画制作成本,或者帮助世界上不同区域的⼈利⽤互联⽹组成⼀个线上⼯作团队。
围绕武警部队在各类战⽃、任务中的战术⼿势的重要性,每⼀名战⽃在⼀线官兵都应该对战⽃中所使⽤的战术⼿语⾮常熟悉,以真正达到传
递信息、通信联络的作⽤。⽽常⽤的、熟悉的战术⼿语已经不具备较好的保密性和安全性,所以每⼀场战⽃或者任务都应该将新编战术⼿语
作为⼀项重要的准备⼯作来完成。那么设计规定好战术⼿语后,提⾼官兵的记忆效率,确保战⽃或者执⾏任务过程中战术⼿语的有效正确运
⽤便⾄关重要。选题即围绕战术⼿势的识别功能,以MATLAB为基础展开研究和设计。为便于官兵在训练中加强对⼿语的记忆掌握,根据
不同的战术背景不同的⼿语需要,针对特战⼩队在实际任务中可以运⽤到的⼿语联络⽅式进⾏设计研究,通过⾃拟暗语进⾏训练测试,完成
了基于MATLAB的战术⼿语的识别功能的设计与实现。
三、课题研究内容
为提升提⾼官兵的记忆效率,确保战⽃或者执⾏任务过程中战术⼿语的有效正确运⽤,最终使武警作战分队在执⾏任务过程中达到相互协
同、信息交流及作战分队与指挥部的实时信息交互,确保各种条件下的精确稳定的信息传递,提⾼指挥部对作战的整体把握,保证任务圆满
完成,针对武警作战分队在实际执⾏任务中的⼿势⼝令进⾏交流,⽴⾜于⾼保密性,⾼反馈性以及⾼实⽤性,研究设计和实现了基于
MATLAB的作战⼿语战术⼿势识别功能,以实现⼿语向⽂字、语⾳结果的转化。本⽂着重介绍了MATLAB图像处理和⼿势识别的相关原
理,设计的研究和实现,GUI⽤户使⽤界⾯的设计和实现,测试实验结果和结果分析四个⽅⾯。
(1)深⼊研究了MATLAB图像处理和⼿势识别的相关原理,介绍了计算机图像的基本概念以及MATLAB在图像处理⽅⾯的基本原理,阐
述了MATLAB图像处理的⼏种基本⽅法,为设计的研究和实现提供了理论基础。
(2)设计实现了基于MATLAB的战术⼿势图像的处理和识别,并对本⽂中测试的⼗个⼿势图像及其结合语句赋予意义,通过图像处理基本
⽅法对获取的⼿势图像进⾏处理,⽽后对结果进⾏匹配识别并进⾏语⾳播放,基本实现了预期设计⽬的。
(3)针对⽤户使⽤实际需求,利⽤MATLAB的GUI相关功能,设计实现了⽤户使⽤界⾯,对整个设计进⾏整理组合,达到了精简、便于使
⽤的⽬的。
(4)进⾏了战术⼿势⼝令识别的相关测试。对图像以及设计使⽤环境进⾏了详细介绍,对设计整体进⾏测试,对设计的不⾜以及改进空间
进⾏了深⼊分析。
四、⼿势识别介绍
⼿势识别(GestureRecognition)指通过跟踪⼈类⼿势、识别并其转换为语义上有意义的命令的过程。⼿势图像识别的总体⽬标是通过计
算机对获取的⼿的位置、姿势或形态等信息进⾏处理识别,并得出语义的解释或执⾏相应的操作。⼿势图像识别技术性并不是很强,其难点
和重点主要是对⼤量数据信息的训练和处理。
⼿势的完成是⼀个动态的过程,这个过程包括了⼿指弯曲引起的⼿的形状和⼿在空间中的位置和⽅位的变化两个⽅⾯,在实际识别过程中,
根据⼿势的时间特征,可以将⼿势分为静态⼿势和动态⼿势两种。相对⽽⾔,对于静态⼿势的识别,可以将其视为静态图像,将时间特征设
定为统⼀值,对⼿势的空间特征进⾏研究,⽽动态⼿势则需要将时间和空间两个要素同时参考,以随时间变化的空间特征为属性对⼿势进⾏
描述。静态⼿势的研究,可以利⽤⼿的关节、指间等特征值进⾏表⽰,⽽动态⼿势的研究则需要取⼀段时间内⼿的各种空间特征的测量序列
值进⾏表⽰。同时,由于⼈⼿具有的⾃由度较多,运动较为复杂,导致相同的⼿势动作在不同的⼈操作时会呈现不同的运动,从⽽导致特征
值的差别。
为了检测⼿的姿势或形态,可以使⽤通⽤分类器或模板匹配器进⾏识别。当对视频进⾏⼿势识别时,由于视频中⼿势含有轨迹,使其被赋予
时间特征,那么就需要相应的技术诸如隐藏马尔可夫模型(HMM)等进⾏该特征的处理,从⽽使得动态的⼿势识别最终转化为静态的⼿势
识别。
⽬前,作为⽐较流⾏的⼿势识别技术有模板匹配法、特征提取和BP神经⽹络算法。模板匹配法:作为最接近⼈本⾝对事物的识别的⽅法,
模型匹配法是将传感器输⼊的原始数据与预先存储的模板进⾏匹配,通过测量两者之间的相似度来完成识别,相应的,模型匹配法需要⼤量
的基础数据作为匹配对象来确保识别率,所以受到噪声、光照等复杂环境影响较⼤,并且识别速度慢。但是,模板匹配法具有简单、易掌
握,普及程度⾼的优点。特征提取:指通过对输⼊数据的特征进⾏提取,并分析转化形成具有实际含义的特征属性,从⽽形成训练数据库,
在对⼿势图像进⾏识别时,以训练数据库的特征为基础进⾏识别。特征提取⽅法缩⼩了基础数据的需求量,但依旧容易受到噪声、光照等复
杂环境的影响,识别速度较慢。BP神经⽹络是⼀种前向传播的多层⽹络,BP神经⽹络算法是⼀种按误差逆传播算法训练的多层前馈⽹络。
它的学习规则是使⽤最速下降法,通过反向传播来调整⽹络的权值和阈值,使得⽹络的误差平⽅和最⼩。
本⽂中结合运⽤了特征提取法和BP神经⽹络算法进⾏战术⼿势图像的识别,基本实现了较⾼的识别率同时识别速度较快。
五、实现效果
六、参考源码
附录⼀功能完整设计与实现代码
%---Executesonbuttonpressinpushbutton4.
functionpushbutton4_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton4(eGCBO)
%eventdatarerved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesandurdata(eGUIDATA)
load('');%数据初始化
load('class_');
sound_dir='E:基于MATLAB的战术⼿势识别功能的设计与实现任务匹配结果数据';
sound_list=dir([sound_dir,'*.mp3']);
strvalue={'前⽅发现敌⼈,所有⼈散开','前⽅敌⼈弱⽕⼒点,进⾏两侧攻击','发现敌⼈重⽕⼒点,迅速趴下','所有⼈散开,⾄前⽅集合','报
告!搜索发现强⽕⼒点','敌⼈已消灭,前⽅展开搜索'};
re_mat=[123,176,285,914,428,3110];
regc=0;
Image{1}=getimage(1);%图像存⼊数组
Image{2}=getimage(2);
Image{3}=getimage(3);
forindex=1:3
im=Image{index};%索引数组
fetuer_arr=Shape(im,0);
fetuer_arr=fetuer_arr';
fetuer_arr(1,:)=(fetuer_arr(1,:)-1)/(4-1);%%特征归⼀化
fetuer_arr(2,:)=(fetuer_arr(2,:)-10)/(100-10);%%特征归⼀化
fetuer_arr(3,:)=(fetuer_arr(3,:)-1)/(4-1);%%特征归⼀化
[result]=net(fetuer_arr);
[va,ind]=max(result);
ind=str2double(class_name{ind});
if(ind~=20)
regc=ind+regc*10;
el
regc=regc*100+ind;
end
end
[flag,memindex]=ismember(regc,re_mat);
%---Executesonbuttonpressinpushbutton5.
functionpushbutton5_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton5(eGCBO)
%eventdatarerved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesandurdata(eGUIDATA)
axes(1);%清空图像
cla
axes(2);
cla
axes(3);
cla
axes(4);
cla
t(1,'string','');%清空结果
%---Executesonbuttonpressinpushbutton6.
functionpushbutton6_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton6(eGCBO)
%eventdatarerved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesandurdata(eGUIDATA)
[filename,pathname]=uigetfile({'*.*'},'选择视频');
video=[pathname,filename];
obj=VideoReader(video);%读取视频⽂件
numFrames=OfFrames;%视频总的帧数
fory=1:numFrames
frame=read(obj,y);
t(4,'HandleVisibility','ON');%打开坐标,⽅便操作
axes(4);%%使⽤图像,操作在坐标1
imshow(frame);%显⽰每⼀帧图⽚
end
fort=1:numFrames
if5*t
frame=read(obj,5*t);%隔5张保存⼀张图象
I=frame;
%保存每⼀帧图⽚
imwrite(I,strcat('E:基于MATLAB的战术⼿势识别功能的设计与实现任务匹配结果数据分解图像',num2str(t),'.jpg'),'jpg');
end
end
%msgbox('分解完成','结果');
tic;
load('');%数据初始化
load('class_');
sound_dir='E:基于MATLAB的战术⼿势识别功能的设计与实现任务匹配结果数据';
sound_list=dir([sound_dir,'*.mp3']);
strvalue={'前⽅发现敌⼈,所有⼈散开','前⽅敌⼈弱⽕⼒点,进⾏两侧攻击','发现敌⼈重⽕⼒点,迅速趴下','所有⼈散开,⾄前⽅集合','报
告!搜索发现强⽕⼒点','敌⼈已消灭,前⽅展开搜索'};
re_mat=[123,176,285,914,428,3110];
regc=0;
sumnum=fix(numFrames/5);%计算保存图像数量
sumnum1=fix(sumnum/3);
fori=1
imageindex1=(2*i-1)*sumnum1/2;%定位标签
imageindex2=(2*(i+1)-1)*sumnum1/2;
imageindex3=(2*(i+2)-1)*sumnum1/2;
end
Image{1}=imread(['E:基于MATLAB的战术⼿势识别功能的设计与实现任务匹配结果数据分解图像
',num2str(imageindex1),'.jpg']);%图像存⼊数组
Image{2}=imread(['E:基于MATLAB的战术⼿势识别功能的设计与实现任务匹配结果数据分解图像',num2str(imageindex2),'.jpg'])
Image{3}=imread(['E:基于MATLAB的战术⼿势识别功能的设计与实现任务匹配结果数据分解图像',num2str(imageindex3),'.jpg'])
t(1,'HandleVisibility','ON');%打开坐标,⽅便操作
axes(1);%%使⽤图像,操作在坐标1
imshow(Image{1});%显⽰每⼀帧图⽚
t(2,'HandleVisibility','ON');%打开坐标,⽅便操作
axes(2);%%使⽤图像,操作在坐标1
imshow(Image{2});%显⽰每⼀帧图⽚
t(3,'HandleVisibility','ON');%打开坐标,⽅便操作
axes(3);%%使⽤图像,操作在坐标1
imshow(Image{3});%显⽰每⼀帧图⽚
%Image{1}=imread(['E:基于MATLAB的战术⼿势识别功能的设计与实现任务匹配结果数据分解图像
',num2str(imageindex1),'.jpg']);%图像存⼊数组
%Image{2}=imread(['E:基于MATLAB的战术⼿势识别功能的设计与实现任务匹配结果数据分解图像
',num2str(imageindex2),'.jpg'])
%Image{3}=imread(['E:基于MATLAB的战术⼿势识别功能的设计与实现任务匹配结果数据分解图像
',num2str(imageindex3),'.jpg'])
forindex=1:3
im=Image{index};%索引数组
fetuer_arr=Shape(im,0);
fetuer_arr=fetuer_arr';
fetuer_arr(1,:)=(fetuer_arr(1,:)-1)/(4-1);%%特征归⼀化
fetuer_arr(2,:)=(fetuer_arr(2,:)-10)/(100-10);%%特征归⼀化
fetuer_arr(3,:)=(fetuer_arr(3,:)-1)/(4-1);%%特征归⼀化
[result]=net(fetuer_arr);
[va,ind]=max(result);
ind=str2double(class_name{ind});
if(ind~=20)
regc=ind+regc*10;
el
regc=regc*100+ind;
end
end
[flag,memindex]=ismember(regc,re_mat);
toc;
msgbox('识别完成','结果');
附录⼆⼿势图像训练代码
clearall;
cloall;
fulldirname='E:基于MATLAB的战术⼿势识别功能的设计与实现任务匹配结果数据训练图像';
fullfile=dir(fulldirname);
fetuer_arr=[];
target=[];
class_name=[];
sum=numel(fullfile);
%%⼀下代码是遍历⽂件夹的图像,并提取特征,合成特征矩阵
forfileindex=3:numel(fullfile)
if(fullfile(fileindex).isdir&&~impty(fullfile(fileindex).name))
dirname=[fulldirname,'/',fullfile(fileindex).name];
class_name{end+1}=fullfile(fileindex).name;
filestr=dir([dirname,'/*.jpg']);%%查找⽬录的jpg图像
temp=zeros(numel(filestr),numel(fullfile)-2);
temp(:,fileindex-2)=ones(size(temp(:,fileindex-2)));
target=[target;temp];
forindex=1:numel(filestr)
filename=[dirname,'/',filestr(index).name];%%图像⽂件名
im=imread(filename);%%读取图像
fetuer_arr=[fetuer_arr;Shape(im,0)];%%提取特征
end
end
end
%%⼀下代码主要是为了将提取的特征分为训练样本和测试样本
%trainstartIndex=1:20:(numel(fullfile)-2)*20;%%利⽤每个⽂件夹的前15个图像训练,训练样本对应的开始坐标
%trainendIndex=15:20:(numel(fullfile)-2)*20;%%驯良样本对⼀个的结束坐标
%trainIndex=[];
%forindex=1:numel(trainstartIndex)
%trainIndex=[trainIndex,trainstartIndex(index):trainendIndex(index)];
%end
%testIndx=tdiff(1:20*(numel(fullfile)-2),trainIndex);
fetuer_arr=fetuer_arr';
target=target';
fetuer_arr(1,:)=(fetuer_arr(1,:)-1)/(4-1);%%特征归⼀化
fetuer_arr(2,:)=(fetuer_arr(2,:)-10)/(100-10);%%特征归⼀化
附录三⼿势图像处理代码
%%提取图⽚的形状特征
functionfeature=Shape(Image,istrain)
%Gray=rgb2gray(Image);%%转换为灰度图形
%hsv=rgb2hsv(Image);%%将rgb颜⾊空间转换为hsvyan空间
%h=hsv(:,:,1);%%hsv颜⾊空间h通道
%s=hsv(:,:,2);
%v=hsv(:,:,3);
%BW=(h>0.14&s>0.17&h<0.565)|(h<0.15&s>0.3&v<0.56);%%选取图像中绿⾊区域,作为⼆值化结果
%th=graythresh(Gray);
%BW=im2bw(Gray,th);
%figure;
hsv=rgb2hsv(Image);
map=hsv(:,:,1)<0.09&hsv(:,:,2)>0.15;
map=imfill(map,'holes');
lab=bwlabel(map);
reg=regionprops(lab,'Area');
area=[];
[va,maindex]=max(area);
BW2=lab==maindex;
%th=graythresh(Gray);
%BW=im2bw(Gray,th);
%BW=1-BW;
%BW2=imfill(BW,'holes');%%填充⼆值图像中的空洞
if(istrain)
subplot(1,2,1);imshow(hsv);title('hsv颜⾊空间');
%subplot(2,2,2);imshow(BW);title('根据颜⾊空间⼆值化图像');
subplot(1,2,2);imshow(BW2);title('空洞填充后图像');
end
regionprops(BW2);
imLabel=bwlabel(BW2);%对各连通域进⾏标记
stats=regionprops(imLabel,'Area','BoundingBox','Perimeter','MajorAxisLength','MinorAxisLength');%求各连通域的⼤⼩
area=cat(1,);
index=find(area==max(area));%求最⼤连通域的索引,作为叶⽚区域
S=stats(index).Area;%计算叶⽚⾯积
Perimeter=stats(index).Perimeter;%计算叶⽚周长
BoundingBox=stats(index).BoundingBox;%%计算最⼩外接矩形
X=BoundingBox(3);%%外接矩形的长
Y=BoundingBox(4);%%外接矩形的宽
Rectangularity=X*Y/S;%%计算矩形度
Circularity=Perimeter^2/S;%%计算圆形度
Ecc=stats(index).MajorAxisLength/stats(index).MinorAxisLength;%%计算偏⼼率
BW=zeros(size(BW2));
BW(imLabel==index)=1;
if(istrain)
subplot(2,2,4);imshow(BW);title('叶⽚区域提取结果');
end
%figure;imshow(BW);
[M,N]=size(BW);
%%⼀下代码计算7个不变矩
%--------------------------------------------------------------------------
%计算图像质⼼:(I,J)
%--------------------------------------------------------------------------
m00=sum(sum(BW));%零阶矩
I=(m10)/(m00);
J=m01/m00;
%--------------------------------------------------------------------------
%中⼼矩:
%--------------------------------------------------------------------------
u11=0;
u20=0;u02=0;
u30=0;u03=0;
u12=0;u21=0;
fori=1:M
forj=1:N
u20=BW(i,j)*(i-I)^2+u20;
u02=BW(i,j)*(j-J)^2+u02;
u11=BW(i,j)*(i-I)*(j-J)+u11;
u30=BW(i,j)*(i-I)^3+u30;
u03=BW(i,j)*(j-J)^3+u03;
u12=BW(i,j)*(i-I)*(j-J)^2+u12;
u21=BW(i,j)*(i-I)^2*(j-J)+u21;
end
end
u20=u20/m00^2;
u02=u02/m00^2;
u11=u11/m00^2;
u30=u30/m00^(5/2);
u03=u03/m00^(5/2);
u12=u12/m00^(5/2);
u21=u21/m00^(5/2);
%--------------------------------------------------------------------------
%7个Hu不变矩:
%--------------------------------------------------------------------------
n(1)=u20+u02;
n(2)=(u20-u02)^2+4*u11^2;
n(3)=(u30-3*u12)^2+(u03-3*u21)^2;
n(4)=(u30+u12)^2+(u03+u21)^2;
n(5)=(u30-3*u12)*(u30+u12)*((u30+u12)^2-3*(u03-3*u21)^2)+(u03-3*u21)*(u03+u21)*((u03+u21)^2-3*(u30+u12)^2);
n(6)=(u20-u02)*((u30+u12)^2-(u03+u21)^2)+4*u11*(u30+u12)*(u03+u21);
n(7)=(3*u21-u03)*(u30+u12)*((u30+u12)^2-3*(u03-3*u21)^2)+(u30-3*u21)*(u03+u21)*((u03+u21)^2-3*(u30+u12)^2);
feature=[Rectangularity,Circularity,Ecc,n];%%将计算的所有特征连接起来作为形状特征
本文发布于:2023-03-08 13:41:41,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678254102184221.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:手势功能.doc
本文 PDF 下载地址:手势功能.pdf
留言与评论(共有 0 条评论) |