基于Android智能手机的光电技术教学探索
2015-12-09陈钢严金华
陈钢 严金华
摘要:为了提高课堂教学的质量、激发学生学习的热情和动力,在光电技术类课程教学中引入智能手机。通过展示、开发一些手机探测器的简单应用,使学生能更加直观地感受到光电技术的实用性和重要性。利用手机摄像头,给出了基于摄像头的一个简单计数器,实现光电计数功能。将最新的科技产品引入到教学中,激发学生的学习兴趣和动力,促进教师的进步,实现教学相长。
关键词:android智能手机;光电探测器;光电技术;课堂教学
中图分类号:G642.0 文献标志码:A 文章编号:1674-9324(2015)09-0166-02
一、引言
光电技术类课程是光电类专业的必修课,课程的内容涉及面广,需要光学、半导体物理、电路原理、电磁场理论、电子线路、量子物理等课程为基础,是一类综合性强的课程。光电技术中的各种探测器在手机里大都可以找到,这些传感器在智能手机中发挥着巨大的作用,为我们的生活增添了不少色彩。如果能结合智能手机的功能来介绍探测器的工作原理及应用,将使学生直观地感受到各种光电探测器。课堂教学中可以直接利用这些探测器开发一些简单的手机应用,不但有助于理解器件的工作原理,还可以激发学生学习的热情[1-3]。本文从手机摄像头出发,分析其基本构造和工作原理,给出了基于摄像头的一个简单应用,实现光电计数功能。
二、系统设计
(一)摄像头的工作原理
在较新的光电技术教材中,都会介绍像探测器,主要是CCD和CMOS,单独开设这样的实验教学比较困难,然而这些探测器在我们身边随处可见,如数码相机、电脑摄像头、手机摄像头等时刻伴随着我们。而手机上的摄像头还提供了直接开发的可能,可以帮助我们深刻认识CCD、CMOS等像探测器的工作原理及数据处理方式。摄像头的基本工作原理是景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,最后通过CPU进行处理后,通过显示屏(LCD)就可以看到图像了[4]。
(二)软件实现
1.开发平台。智能手机中Android系统的开发最为方便,本文介绍的是Google公司推出的开源平台Android Studio开发环境,安装过程可参考官方網站说明或网络论坛里的安装教程[5,6]。
2.计数器工作原理。利用手机摄像头制作光电计数器的基本原理如下,首先通过摄像头拍摄一副背景图片,作为光电计数时对比的依据,即测量背景噪音。然后摄像头开始每秒拍摄多张照片,分析每张照片的总体亮度,并与背景图片的亮度进行对比。当摄像头前面没有遮挡物体时,所拍摄的照片亮度和背景照片亮度相差不大,计数器不计数。当有物体从摄像头前面运动过时,所拍摄的照片亮度与背景照片亮度相差较大,计数器开始计数。为避免遮挡物体长时间在摄像头前造成一个物体的重复计数,可以设定一个临时的背景亮度作为对比的依据。
3.代码实现。Android应用设计主要分界面设计和后台处理程序,本应用中的页面只有一个,处理程序也只有一个,下面简单介绍一下具体流程。第一步,界面设计。Android Studio中界面的设计采用所见即所得的形式,只需将所要的控件拖到页面上,然后调整大小和位置即可。在新建的页面文件里添加一个TextView文本视图,用来显示计数,初始值为0。再添加一个SurfaceView用来显示照片。最后添加三个按钮,一个测试背景亮度,一个开始计数,一个停止。设计好的页面如图1所示。
第二步,后台程序处理。后台程序虽然只有一个,但是要处理页面上多个控件的响应,就要为每一个控件设计一个函数,本应用中设计三个Button函数、TextView函数及SurfaceView函数共四个。
Button1用来测量背景亮度,一般选择比较亮的背景,处理函数就一句话,camera.setOneShotPreviewCallback(myPreviewCallback),其中camera.setOneShotPreviewCallback()是系统自带的函数,myPreviewCallback是自定义的处理图像的方法,其功能是计算预览图像中亮度总和,返回数值g1。
public Camera.PreviewCallback myPreviewCallback=new Camera.PreviewCallback(){
@TargetApi(Build.VERSION_CODES.FROYO)
@Override
public void onPreviewFrame(byte[] data,Camera camera) {
mCamera.stopPreview();
int gray=0;
for (int j = 0;j < 相机预览图片宽度;j=j++) {
for (int i = 0;i <相机预览图片高度;i=i++) {
gray=gray+data[i];
}
}
mCamera.startPreview();
};
Button2启动计数器工作,代码为timer.schedule(task,0,1000),这里用定时器timer不断进行循环,循环时间设定为1000毫秒,可自由设定。task为定时器工作的变量,主要处理定时器时间到了后要处理的事情,这里主要就是计算预览图像的总体亮度,其核心代码和Button1的代码一样,返回数值g2。
Button3停止定时器、摄像头的工作,释放摄像头资源。
文本视图用来显示计数,通过一定的逻辑判断是否计数,如g2>2*g1。
SurfaceView的处理函数分两部分,首先要设定摄像头参数,然后实现拍照存储并计算照片总亮度。相机参数的设定主要是像素大小、每秒拍摄数量[7]。界面中SurfaceView控件显示照相机中的预览图片,一般像素大小取相机支持的最小值,这样数据处理就比较快速,每秒数量可以从1-10根据需要设定。相机初始化函数主要设置预览图片显示到页面中定义的SurfaceView中。
4.图像处理。像探测器的工作原理上面已经提到,光学图像投射到CCD或CMOS图像传感器上转为电信号,经过模数转换后变为数字图像信号。在计算图像亮度时可以有两种选择,一种是计算拍摄到的图片的RGB值,换算为相应的灰度(GRAY)值,这种方法简单直观,缺点是运算速度慢。对要实时计数功能来说,要快速响应摄像头前的运动物体,因此可以采用第二种方法。第二种方法是直接读取摄像头经模数转换后存储的原始数据,即像素数据存储的YUV格式,YUV格式经过一定运算可以得到RGB格式,大部分CCD、CMOS的数据处理都采用此类方法。相比RGB格式,YUV格式数据存储空间要减少一半左右,这样就可以快速处理。为了适应快速的光电计数功能,我们直接从摄像头预览过程截取预览图像的YUV数据,然后计算图像亮度,省去了拍照、存储、读取过程,极大的提高了计数响应,普通的智能手机响应速度都可以达到1/15秒。图2是程序运行后的界面,使用时先测量一个比较亮的背景,然后当摄像头被挡住时,就开始计数。程序中为了防止摄像头一直被挡住而不断计数,可以在逻辑处理上进行一些设计,设置背景亮度为当前亮度,从而有效避免重复计数。
三、结语
针对光电探测器的学习,介紹了一种利用手机探测器来开展理论、实验教学的新方法,对像探测器CCD、CMOS的工作原理和实际中的数据处理进行了深入的分析,实现了利用手机摄像头完成光电计数的功能。在当前科技、资讯发达的背景下开展高等教育工作,教师要及时了解科技动态,了解学生的兴趣所在,然后适当地将最新科技资讯引入课堂教学。
参考文献:
[1]王鹰.基于Android应用的移动学习资源设计与开发研究——以“中南大学视频公开课”为例[J].现代教育技术:2014,(3).
[2]王强,郑世珏,宋志明.基于Android的交互式学习微阅览器设计与实现[J].现代教育技术,2012,(9).