论文部分内容阅读
摘要:本文研究了Android平台上的照相机制,通过采用了基于Hu矩和支持向量机的静态手势识别技术,可实现在复杂背景下对手势进行实时辨别,最后将研究设计的手势识别算法成功地应用到了Android平台上的手势控制照相系统中。
关键词:Android 手势 照相系统 模式识别
中图分类号:TP2 文献标识码:A 文章编号:1674-098X(2012)02(c)-0000-00
1 绪论
随着计算机技术的迅速发展,通过鼠标、键盘等方式的人机交互方式已经显得过时,新的人机交互方式不断涌现,并受到了人们的欢迎。手势识别控制技术,作为新型人机交互方式的典型代表,凭借其简单、可靠的特点,受到了人们的广泛关注。
Android是谷歌公司在2008年推出的新一代操作系统。该操作系统可运行在手机、平板电脑等可移动设备上,凭借其开源的特点,Android迅速掀起了一阵风暴,越来越多的移动设备厂商投入了Android的阵营。Android必将给人们的生活带来显著的影响。
鉴于上述形势,本文提出了一种可运行在Android平台上的手势控制照相系统。利用该系统,用户可完全不需要按下快门,而只要对着摄像头摆出特定的手势,照相系统将自动根据当时的距离、光线、环境等,调整相关参数,最终完成拍照动作。这种新型的拍照系统将带给用户前所未有的拍照体验。
2 Camera基本功能的实现
2.1软件框架的搭建
在布局文件中,我们定义了一个SurfaceView控件、一个TextView控件以及六个Button控件。SurfaceView控件用于显示camera获取的图像,同时实现OnClickListener接口。TextView控件是用来实时显示camera在预览情况下每一帧图像的一些特征值,用于检测。六个Button控件用于用户操作,其功能是开启、关闭camera,开启手势识别、设置自定义手势,以及退出程序。
2.2授权
在权限文件中写入部分权限:
2.3 java文件
定义一个camera类继承Activity并实现OnClickListener接口,同时定义6个Button对应6个Button控件,再对他们建立监听事件。通过OnClickListener接口,我们获得了onClick(View arg0)函数,它可以对Activity中的View进行监听,当某个View被按下抬起时就会执行相应代码。
当监听器监听到Button1被按下抬起时调用inCamera()函数,用于初始化Camera参数的自定义函数,用Camera.open()开启Camera,也可以用Camera.getParameters()获取Camera的参数进行修改。
当监听器监听到Button2被按下抬起时执行Camera.stopPreview()、Camera.release()、Camera=null,用于关闭Camera;
当监听器监听到Button3被按下抬起时执行takePicture,触发myjpegCallback的回调函数,该函数下的onPictureTaken带有當前摄像头捕获图像的JPEG数据,若要保存图片可通过
Bitmap bm =BitmapFactory.decodeByteArray(data, 0,data.length);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
以上代码把图像保存在file目录下,其中data为图像数据,file为路径。
当监听器监听到Button4被按下抬起时执行System.exit(0),用于退出程序。
当监听器监听到Button5被按下抬起时开启setPreviewCallback(mPreviewCallback),利用次回调函数可以获取摄像头在预览时的每一帧数据,本文研究的关键也在于此。
当监听器监听到Button6被按下抬起时,为用户自定义设置特征手势的值,即把当前预览帧的特征值记下,在接下来的识别当中进行匹配。
3 图像处理
3.1 YUV420SP转换为YCbCr
onPictureTaken方法中第一个参数为预览帧的数据,其格式为YUV420SP格式。该格式直接处理比较麻烦,于是我们需要对其格式进行转换,我们用到了自定义的方法decodeYUV420SP把格式转换为最熟悉的RGB格式,它的值的范围为-128—127(byte型变量)。
YUV420SP与RGB的转换关系:
y1192 = 1192 * y;
r = (y1192 + 1634 * v);
g = (y1192 - 833 * v - 400 * u);
b = (y1192 + 2066 * u);
存在负值的原因在于Android中byte的范围是-128-127,当要存大于127的输时他用补码表示。为了把值是范围变成0—255,我们用0XFF“&”上原来数据存在新定义的int[]型变量中。
图像处理的首要目的是为了在整个画面中找到手势,YCbCr对于肤色的识别效果较佳,它的Cb、Cr通道分别指蓝色色度分量与红色色度分量。因此只要给定实验获得的手的肤色的Cb、Cr通道的范围就可以确定手势的位置,同时获得它的二值化图像。
RGB与YCbCr的转换关系:
Y=0.299 *R + 0.587* G + 0.114* B;
Cb = 128+0.886*(B-Y));
Cr = 128+0.701*(R-Y));
3.2 用Hu矩的特性获取手势的特征值
在连续情况下,图像函数为,那么图像的p+q阶几何矩(标准矩)定义为:
p,q=0,1,2…
p+q阶中心距定义为:
p,q=0,1,2…
其中 和 代表图像的重心,
对于离散的数字图像,采用求和号代替积分:
p,q=0,1,2…
p,q=0,1,2…
W和L分别是图像的高度和宽度;
归一化的中心距定义为:
利用二阶和三阶归一化中心矩构造了7个不变矩 :
这7个不变矩构成一组特征量,Hu在1962年证明了他们具有旋转,缩放和平移不变性。在实验中我们发现只有第一个特征值识别的误差较小,若全部计算7个特征值,由于我们要对每一帧图像进行处理,这样计算了太大了,所以我们只用了第一个特征值。通过实验我们既可以获得不同手势的值,通过与每一帧计算出来的值比较既可以让Camere做出不同的反应。
4 结语
本文详细分析了如何在Android平台上实现Camera的功能,包括软件框架的搭建,Java文件的编写等。对于Camera获取到的帧数据,本文提出了将其YUV420SP转换为YcbCr的方法,通过利用Hu矩的特性获取手势的特征值,最终根据该特征值与数据库中预设的特征值进行比较,符合后触发拍照动作。
参考文献
【1】甘志杰,基于Hu矩和支持向量机的静态手势识别及应用,2008。
本文受浙江省大学生科技创新活动计划(新苗人才计划)科研资金支持, 项目编号: 2010R424040
关键词:Android 手势 照相系统 模式识别
中图分类号:TP2 文献标识码:A 文章编号:1674-098X(2012)02(c)-0000-00
1 绪论
随着计算机技术的迅速发展,通过鼠标、键盘等方式的人机交互方式已经显得过时,新的人机交互方式不断涌现,并受到了人们的欢迎。手势识别控制技术,作为新型人机交互方式的典型代表,凭借其简单、可靠的特点,受到了人们的广泛关注。
Android是谷歌公司在2008年推出的新一代操作系统。该操作系统可运行在手机、平板电脑等可移动设备上,凭借其开源的特点,Android迅速掀起了一阵风暴,越来越多的移动设备厂商投入了Android的阵营。Android必将给人们的生活带来显著的影响。
鉴于上述形势,本文提出了一种可运行在Android平台上的手势控制照相系统。利用该系统,用户可完全不需要按下快门,而只要对着摄像头摆出特定的手势,照相系统将自动根据当时的距离、光线、环境等,调整相关参数,最终完成拍照动作。这种新型的拍照系统将带给用户前所未有的拍照体验。
2 Camera基本功能的实现
2.1软件框架的搭建
在布局文件中,我们定义了一个SurfaceView控件、一个TextView控件以及六个Button控件。SurfaceView控件用于显示camera获取的图像,同时实现OnClickListener接口。TextView控件是用来实时显示camera在预览情况下每一帧图像的一些特征值,用于检测。六个Button控件用于用户操作,其功能是开启、关闭camera,开启手势识别、设置自定义手势,以及退出程序。
2.2授权
在权限文件中写入部分权限:
2.3 java文件
定义一个camera类继承Activity并实现OnClickListener接口,同时定义6个Button对应6个Button控件,再对他们建立监听事件。通过OnClickListener接口,我们获得了onClick(View arg0)函数,它可以对Activity中的View进行监听,当某个View被按下抬起时就会执行相应代码。
当监听器监听到Button1被按下抬起时调用inCamera()函数,用于初始化Camera参数的自定义函数,用Camera.open()开启Camera,也可以用Camera.getParameters()获取Camera的参数进行修改。
当监听器监听到Button2被按下抬起时执行Camera.stopPreview()、Camera.release()、Camera=null,用于关闭Camera;
当监听器监听到Button3被按下抬起时执行takePicture,触发myjpegCallback的回调函数,该函数下的onPictureTaken带有當前摄像头捕获图像的JPEG数据,若要保存图片可通过
Bitmap bm =BitmapFactory.decodeByteArray(data, 0,data.length);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
以上代码把图像保存在file目录下,其中data为图像数据,file为路径。
当监听器监听到Button4被按下抬起时执行System.exit(0),用于退出程序。
当监听器监听到Button5被按下抬起时开启setPreviewCallback(mPreviewCallback),利用次回调函数可以获取摄像头在预览时的每一帧数据,本文研究的关键也在于此。
当监听器监听到Button6被按下抬起时,为用户自定义设置特征手势的值,即把当前预览帧的特征值记下,在接下来的识别当中进行匹配。
3 图像处理
3.1 YUV420SP转换为YCbCr
onPictureTaken方法中第一个参数为预览帧的数据,其格式为YUV420SP格式。该格式直接处理比较麻烦,于是我们需要对其格式进行转换,我们用到了自定义的方法decodeYUV420SP把格式转换为最熟悉的RGB格式,它的值的范围为-128—127(byte型变量)。
YUV420SP与RGB的转换关系:
y1192 = 1192 * y;
r = (y1192 + 1634 * v);
g = (y1192 - 833 * v - 400 * u);
b = (y1192 + 2066 * u);
存在负值的原因在于Android中byte的范围是-128-127,当要存大于127的输时他用补码表示。为了把值是范围变成0—255,我们用0XFF“&”上原来数据存在新定义的int[]型变量中。
图像处理的首要目的是为了在整个画面中找到手势,YCbCr对于肤色的识别效果较佳,它的Cb、Cr通道分别指蓝色色度分量与红色色度分量。因此只要给定实验获得的手的肤色的Cb、Cr通道的范围就可以确定手势的位置,同时获得它的二值化图像。
RGB与YCbCr的转换关系:
Y=0.299 *R + 0.587* G + 0.114* B;
Cb = 128+0.886*(B-Y));
Cr = 128+0.701*(R-Y));
3.2 用Hu矩的特性获取手势的特征值
在连续情况下,图像函数为,那么图像的p+q阶几何矩(标准矩)定义为:
p,q=0,1,2…
p+q阶中心距定义为:
p,q=0,1,2…
其中 和 代表图像的重心,
对于离散的数字图像,采用求和号代替积分:
p,q=0,1,2…
p,q=0,1,2…
W和L分别是图像的高度和宽度;
归一化的中心距定义为:
利用二阶和三阶归一化中心矩构造了7个不变矩 :
这7个不变矩构成一组特征量,Hu在1962年证明了他们具有旋转,缩放和平移不变性。在实验中我们发现只有第一个特征值识别的误差较小,若全部计算7个特征值,由于我们要对每一帧图像进行处理,这样计算了太大了,所以我们只用了第一个特征值。通过实验我们既可以获得不同手势的值,通过与每一帧计算出来的值比较既可以让Camere做出不同的反应。
4 结语
本文详细分析了如何在Android平台上实现Camera的功能,包括软件框架的搭建,Java文件的编写等。对于Camera获取到的帧数据,本文提出了将其YUV420SP转换为YcbCr的方法,通过利用Hu矩的特性获取手势的特征值,最终根据该特征值与数据库中预设的特征值进行比较,符合后触发拍照动作。
参考文献
【1】甘志杰,基于Hu矩和支持向量机的静态手势识别及应用,2008。
本文受浙江省大学生科技创新活动计划(新苗人才计划)科研资金支持, 项目编号: 2010R424040