1 系统设计方案
今年来,手势识别作为新一代人机交互手段,受到了国内外研究学者以及公司的关注和研究,并且取得了突出的成果,在智能电视、游戏娱乐设备、机器人等方面都有了广泛的应用,而且,通过对手势识别技术的研究,可以推动机器设备对视觉感知能力的认识,并将其应用到更多的人工智能领域,使机器设备更好的理解人类的想法和意图,为我们的生活和工作带来更大的好处。本文实现了一种能识别五种手势的手势识别系统,可以完成人机交互的基本任务。
手势动作可以分为两种,一种是相对不动,没有任何附加动作的静态手势动作,另一种是相对运动、伴随着复杂变化(如缠绕、组合等)动态手势动作,前者突出表示形式及状态,后者突出变化及轨迹。本文主要针对第一种进行研究,系统处理流程如图1所示。
图1 系统结构流程图
2 系统验收需要达到的目标和测试水平
本系统可以对五种预定义的静态手势进行识别,如图2所示。
图2 五种预定义的静态手势
当系统输入以上任意一种手势时,系统能够准确迅速的做出判断当前输入的手势是属于哪一种,并且在控制台打印出相应信息。例如输入图片(a)时,系统在控制台输出手势1;输入图片(b)时,系统在控制台输出手势2,…。
3 系统实现框图和流程图
3.1手势分割
本文选择在YcbCr颜色空间进行手势分割处理,分割的重点在于建立肤色模型,利用手势皮肤颜色在YcbCr空间内满足聚类的特点,设定阈值范围,对图像进行扫描,在此范围内则认定为手势,不在此范围内的则不予考虑,查阅相关资料并进行试验发现,人手颜色在YcbCr的二维子空间(Cb,Cr)上的分布范围满足:Cb[133,173]&Cr[77,127],当像素点满足此条件就认定为手势,此方法处理简单。手势分割流程图如图3所示:
图3 手势分割流程图
close all;clear all; clc; %---------------------------------------------- %图像进行中值滤波,并显示图像 %调用 median_filter( ) 进行处理 %---------------------------------------------- area = int32(0) ;%面积 perimeter = int32(0) ;%周长 %读进图像 [filename, pathname] = uigetfile({ '*.bmp';'*.jpg'; '*.gif'}, '选择图片'); RGB_data = imread([pathname, filename]); [ROW,COL, DIM] = size(RGB_data); %提取图片的行列数 R_data = single(RGB_data(:,:,1)); G_data = single(RGB_data(:,:,2)); B_data = single(RGB_data(:,:,3)); % %以下是中值滤波代码 % medfil_result_R = median_filter(R_data, 3); % medfil_result_G = median_filter(G_data, 3); % medfil_result_B = median_filter(B_data, 3); %以下是建立肤色模型,实现RGB转YCbCr Y_data = int32(zeros(ROW,COL)); Cb_data = int32(zeros(ROW,COL)); Cr_data = int32(zeros(ROW,COL)); for r = 1:ROW for c = 1:COL % Y_data(r, c) = 0.299*medfil_result_R(r, c) + 0.587*medfil_result_G(r, c) + 0.114*medfil_result_B(r, c); % Cb_data(r, c) = -0.1687*medfil_result_R(r, c) - 0.3313*medfil_result_G(r, c) + 0.5*medfil_result_B(r, c) + 128; % Cr_data(r, c) = 0.5*medfil_result_R(r, c) - 0.4187*medfil_result_G(r, c) - 0.0813*medfil_result_B(r, c) + 128; %系数进行8位量化处理 % Y_data(r, c) = int32((76*R_data(r, c) + 150*G_data(r, c) + 29*B_data(r, c))/256); % Cb_data(r, c) = int32((-43*R_data(r, c) - 84*G_data(r, c) + 128*B_data(r, c) + 128*256)/256); % Cr_data(r, c) = int32((128*R_data(r, c) - 107*G_data(r, c) - 20*B_data(r, c) + 128*256)/256); Y_data(r, c) = floor( (76*R_data(r, c) + 150*G_data(r, c) + 29*B_data(r, c))/256 ); Cb_data(r, c) = floor( (-43*R_data(r, c) - 84*G_data(r, c) + 128*B_data(r, c) + 128*256)/256 ); Cr_data(r, c) = floor( (128*R_data(r, c) - 107*G_data(r, c) - 20*B_data(r, c) + 128*256)/256 ); end end %以下是二值化及统计手势面积 Gray_data = int32(zeros(ROW,COL)); for r = 1:ROW for c = 1:COL if Cb_data(r, c)>133 && Cb_data(r, c)<173 && Cr_data(r, c)>77 && Cr_data(r, c)<127 Gray_data(r,c) = 0 ; area = area + 1 ; else Gray_data(r,c) = 255 ; end end end %以下是边缘检测 %edge_data=edge(Gray_data,'sobel') ; edge_data = Sobel_Image(Gray_data) ; % %以下是统计周长 % for r = 1:ROW % for c = 1:COL % if edge_data(r, c)==1 % perimeter = perimeter + 1 ; % end % end % end [H1,H2,H3,perimeter] = OriginMoment(edge_data) ; function [ img ] = median_filter( image, m ) %---------------------------------------------- %中值滤波 %输入: %image:原图 %m:模板的大小3*3的模板,m=3 %输出: %img:中值滤波处理后的图像 %---------------------------------------------- n = m; [ height, width ] = size(image); x1 = int32(image); x2 = x1; for i = 1: height-n+1 for j = 1:width-n+1 mb = x1( i:(i+n-1), j:(j+n-1) ); mb = mb(:); mm = median(mb); x2( i+(n-1)/2, j+(n-1)/2 ) = mm; end end img = x2; end
1 matlab版本
2014a
2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4].刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]李昌锋,郭生挺,陈文婷.基于静态手势识别的视力检测系统设计[J].科技创新与应用. 2021,11(13)