一、手势识别简介
手势识别可以分为基于可穿戴设备的识别、基于触摸技术的识别和基于计算机视觉的识别。其中,基于计算机视觉的识别,手势图像信息由一个或多个摄像头采集,采集的数据进行预处理,包括去噪和信息增强。然后,利用分割算法获取图像中的目标手势。通过视频处理和分析得到当前手势的分类和描述,最后通过手势识别算法对目标手势进行识别。基于手势的手势识别主要由手势分割、手势分析和手势识别三部分组成。
1 手势分割
第一步是对输入图像执行手势分段。手势分割过程主要包括手势定位和手势分割两部分。
(1)手势定位
手势定位过程在包含手势的图像帧序列中从复杂背景中提取手势区域,实现手势与背景的分离。手势定位后,通过算法将当前手势从背景区域分割出来。静态手势只需要提取单个帧图像的手势特征,而动态手势则需要对提取的帧序列进行手势分析。常用的手势分割方法有基于运动信息的检测分割、基于视觉特征的检测分割和基于多模式融合的检测分割。基于运动信息的检测分割主要包括光流法和差分法。光流法不需要预先获取图像背景来表示复杂环境下的手势运动,但要求背景图像保持静止,对光照要求较高。
使用光流方法实时跟踪手势。在静态背景下,差分法对手势的分割效果较好。对于一个移动的背景,需要对背景进行建模和区分。
使用Running Average方法对背景进行建模,然后进行手势分割
(2)手势分割
基于明显特征的分割方法主要包括肤色分割、纹理分割、手形分割和轮廓分割。
(a)肤色分割
肤色分割方法是最常用的方法:
使用集群的肤色在颜色空间建立肤色模型,如肤色建模通过RGB颜色空间:
翁等人使用贝叶斯手势分割,建立肤色模型,然后结合皮肤的颜色,运动,和手势识别的轮廓形状信息,大大提高了分割精度。
这些分割方法不受手形的影响,但由于光照引起的肤色变化,分割错误率大大提高。
(b)基于多模式融合的分割方法主要是为了克服复杂环境对分割条件的影响,并结合各种特征,如表观特征和运动信息。当使用单色可穿戴设备或背景来简化场景分割时,为了提高分割的准确性,有时会用手进行标记,这极大地影响了交互的自然度,从而限制了应用范围。其次,对手势进行建模和分析。
主要包括基于外观的手势建模和基于三维模型的手势建模基于外观的手势建模可以分为二维静态模型和运动模型。常用的策略有颜色特征、轮廓几何、可变形和移动图像参数。颜色特征是最常用的建模方法。
用单台相机捕捉手部运动图像,用颜色、运动、边缘等多种信息建模,建立手部运动的坐标系来识别手势[71]。利用圆周、质心、边界盒等几何特征建立轮廓几何模型。
使用旋转归一化方法对手势区域的图像进行对齐,并使用KravtCouk矩作为轮廓特征训练模型来识别静态手势。通过一组能够描述全局运动的物体轮廓插值节点,建立了基于gabarit的可变形模型。
最简单的插值方法是分段线性函数。
Ju等人利用snake算法分析了课堂上的视频浏览和索引手势。
基于运动图像参数的模型与其他模型的不同之处在于,它们是由视频序列中对象的平移、旋转和方向等运动参数建模的。
提出在真实场景中使用一个新的描述符和一个局部运动直方图来描述运动模式,然后通过增强方法选择特征。该方法仅利用局部特征建立了明显的手势建模,计算复杂度较低。利用基于三维的手势模型建立当前图像的三维模型,并根据相关参数计算手势状态。常用的手势模型包括三维骨架模型、三维纹理体模型和三维几何模型。
骨架模型是最常用的三维模型。
使用Kinect生成的深度数据进行骨建模。
2 手势分析
手势分析由特征检测和参数估计两部分组成。
特征检测用于从分割后的手势中提取图像特征参数。图像特征主要包括视觉特征和语义特征。视觉特征包括颜色、纹理和轮廓,语义特征代表对图像内容的理解。
参数估计根据模型的不同使用不同的方法。
先用方向梯度直方图(HOG)描述运动员的面积,然后用主成分分析(PCA)将HOG投影到线性子空间中,得到PCA-HOG描述特征。曲棍球和足球的实验表明,该方法在光照、姿态和视角的变化下,对跟踪和识别结果具有较强的鲁棒性。
3 手势识别
手势识别主要是基于传统的机器学习方法和神经网络。使用传统的机器学习模型识别基于视觉的手势有很多方法。
静态手势识别采用模板识别,动态手势识别采用与时域信息相关的HMM。
所选择的识别方法与手势的类型有很大的相关性。
戴着有色手套,用一对普通的网络摄像头捕捉用户的手势数据,训练HMM模型对用户预定义的八个手势进行实时跟踪和识别。
近年来,随着深度学习的发展,该技术已广泛应用于手势识别领域。
同时采集彩色图像和深度图像,提取手势的骨骼特征和梯度直方图特征。然后将提取的特征融合起来,建立快速rnn,将连续的手势分割成孤立的手势。通过一个简单的递归神经网络(SRNN)。通过简单递归神经网络(SRNN)和长短时记忆(LSTM),建立了用于连续手势识别的双流递归神经网络2S-RNN。
Tsironi等结合卷积神经网络(CNN)对视觉特征的敏感性和LSTM对连续事件的有效性,提出了卷积长短时记忆递归神经网络(CNNLSTM)。
二、部分源代码
function varargout = show(varargin)
% SHOW MATLAB code for show.fig
% SHOW, by itself, creates a new SHOW or raises the existing
% singleton*.
%
% H = SHOW returns the handle to a new SHOW or the handle to
% the existing singleton*.
%
% SHOW('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in SHOW.M with the given input arguments.
%
% SHOW('Property','Value',...) creates a new SHOW or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before show_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to show_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help show
% Last Modified by GUIDE v2.5 03-Jan-2018 20:17:07
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @show_OpeningFcn, ...
'gui_OutputFcn', @show_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before show is made visible.
function show_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to show (see VARARGIN)
% Choose default command line output for show
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes show wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = show_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in button_start.
function button_start_Callback(hObject, eventdata, handles)
% hObject handle to button_start (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%1.Get the hardware information //获取硬件信息
global obj;%obj在其他地方要调用,所以设为全局变量
info=imaqhwinfo('winvideo');%获得摄像头硬件信息
obj=videoinput('winvideo',info.DeviceIDs{1});%创建视频对象
set(obj,'FramesPerTrigger',1);%每次触发存储一张相片
set(obj,'ReturnedColorSpace','RGB');%接收图像为RGB模式
%get(obj)%获取obj信息,查看设置是否成功,最后注释掉
axes(handles.axes1);
%2.show the video //动态显示视频图像
Resolution=get(obj,'videoResolution');%分辨率
nBands=get(obj,'NumberOfBands');%频段
hImage=image(zeros(Resolution(2),Resolution(1),nBands));
preview(obj,hImage);%在特定的位置(hImage)显示
% --- Executes on button press in button_catch.
function button_catch_Callback(hObject, eventdata, handles)
% hObject handle to button_catch (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global obj;
catch_pic=getsnapshot(obj);%摄取图像
catch_pic=imresize(catch_pic,[240, 320]); %统一图片大小
axes(handles.axes2);
imshow(catch_pic);%在axes2显示摄取的图片
setappdata(gcf,'pic',catch_pic);%把catch_pic变成全局变量
% --- Executes on button press in button_cut.
function button_cut_Callback(hObject, eventdata, handles)
% hObject handle to button_cut (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
pic = getappdata(gcf,'pic'); %获取全局变量
l = get(handles.popupmenu_choose,'value'); %获取下拉菜单选中项
if l==1 %基于阈值分割(尤其适用于纯背景)
graypic = rgb2gray(pic); %灰度图像
% graypic = localenhance(graypic); %局部增强
% figure,imshow(graypic);
pic_filt=medfilt2(graypic,[3 3]); %3*3中值滤波
axes(handles.axes3);imshow(pic_filt);
pause(1);%延迟1s
pic_cut = threshold_cut(pic_filt);
end
if l==2 %基于YCgCr肤色分割(适用于较复杂背景)
pic_cut = colour_cut(pic);
end
axes(handles.axes3);
imshow(pic_cut);
setappdata(gcf,'pic_cut',pic_cut);%把catch_pic变成全局变量
% --- Executes on selection change in popupmenu_choose.
function popupmenu_choose_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu_choose (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu_choose contents as cell array
% contents{get(hObject,'Value')} returns selected item from popupmenu_choose
% --- Executes during object creation, after setting all properties.
function popupmenu_choose_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu_choose (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushbutton_open.
function pushbutton_open_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton_open (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile( ...
{'*.bmp;*.jpg;*.fig;*.tif','MATLAB Files (*.bmp;*.jpg;*.fig;*.tif)';
'*.*', 'All Files (*.*)'}, ...
'Pick a file');
pic=imread([pathname,filename]);%读取图片给im
pic=imresize(pic,[240, 320]); %统一图片大小
axes(handles.axes2);
imshow(pic);%在axes2显示摄取的图片
setappdata(gcf,'pic',pic);%把pic变成全局变量
% --- Executes on button press in pushbutton_denoise.
function pushbutton_denoise_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton_denoise (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
pic_cut = getappdata(gcf,'pic_cut'); %获取全局变量
pic_denoise = denoise(pic_cut);
axes(handles.axes4);
imshow(pic_denoise);
setappdata(gcf,'pic_denoise',pic_denoise);%把pic变成全局变量
% --- Executes on selection change in popupmenu_operator.
function popupmenu_operator_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu_operator (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]黄彦铭,宁媛.基于视觉的手势识别算法及应用的研究[J].智能计算机与应用. 2021,11(06)