刘桃丽,林心梅
(广东海洋大学 数学与计算机学院,广东 湛江 524008)
对于生活中各种物体的测量,目前多采用传统的测量方法。即对于小型且形状较规则物体的测量,一般使用各种测量工具如直尺、卡尺和卷尺等,但是对于体积较大或不规则的物体,其长度、高度以及两者间的距离等数据的测量则需要采用专业的测绘设备来进行。此类测量对测量操作人员、测量仪器以及测量的场地都有很高的要求,这就给一些实时要求测量的情况带来了很大的不便[1]。如何便利地对物体的各种数据进行测量,成为一个亟待解决的问题。
随着科学技术的飞速发展,移动设备的性能和功能变得越来越强大。目前,手机、平板的移动终端已经成为人们生活中不可或缺的设备。在Android平台上,各大软件市场上的App琳琅满目,众多实用的软件给人们的生活和工作带来了极大的便利[1]。基于此,文中设计了一款基于Android平台的手机测量软件App。该App利用手机自带的相机功能拍摄得到的物体照片,经过App后台相应的处理,直接得出待测物的长度或是待测物与手机的距离。通过使用该软件,用户可以较为方便地测量出待测物的长度或者是待测物与手机的距离,实验结果表明测量结果误差较低,可以满足生活中各种物体的参数测量的要求。
该软件的测量方法,是将待测物体通过手机摄像头进行拍摄,然后对得到的照片进行相应处理,从而得到需要的数据。软件功能主要分为三部分:第一,测量待测物体的长、高、宽等参数;第二,测量被测物体与手机之间的距离;第三,在手机上等比例绘制直尺。此外,软件还提供将测量结果保存到本地的功能,用户可以对这些测量结果进行查看和删除操作。软件功能模块如图1所示。
图1 测量软件功能模块
在该模块中,其测量功能操作过程如下:用户将待测物和长度已知的参考物放置在同一平面,然后使用手机的相机正对参考物和待测物拍摄,要求参考物和待测物要全部落在照片内。在测量软件中打开拍摄的照片,然后在照片上选取参考物的起点和终点,并输入参考物的长度,然后选取待测物的起点和终点并按下获取结果按钮即可得到软件的计算结果。一般而言,参考物的长度与待测物的长度越接近,测量结果越准确[2]。
使用该功能前需要先设置参考值数据。设置参考值操作过程如下:首先找到一个长度已知的参考物,然后使用手机相机在一定的已知距离正对该参考物进行拍摄,在软件中打开该照片后选取该参考物的起点和终点即整个参考物的长度,并点击录入参考值按钮,在弹框中输入参考物长度和手机与该参考物的距离并保存。参考值可以录入多个,并且建议录入不同长度和距离的参考值,这有助于降低系统误差。
参考值录入后就可以使用该功能进行距离测量,与录入参考值的步骤相似,用户在软件中打开待测物的照片后选取待测物的起点和终点,然后点击参数设置按钮,在弹框上输入待测物长度点击确认,再点击获取结果按钮即可得到软件计算出的距离值。在这里要说明的是,如果点击参数设置按钮后输入的不是待测物的长度而是待测物与手机的距离,那么软件会计算出待测物的长度。
软件在手机屏幕上等比例绘制直尺与大部分直尺一样,绘制的直尺包括毫米刻度、厘米刻度和数字。用户打开该界面后,手机就可以当作是一把直尺去测量待测物。绘制得到的尺子的长度受限于屏幕尺寸,一般而言,5英寸的手机可以绘制出11厘米的尺子。
将待测物和参考物(长度已知的物件)放置在同一平面,然后使用手机摄像头正对两物件拍摄。同时,待测物与参考物要尽可能出现在图片中间,避免在边缘出现,这是因为摄像机的镜头畸变会导致图片边缘失真[3]。记待测物的起点和终点的像素点数为p1,待测物的长度为l1;参考物的起点和终点的像素点数为p2,物理长度为l2,显然这些参数符合下式:
(1)
所以:
(2)
透镜成像的原理如图2所示,其中u是指物体到镜头的距离,简称物距;v是指成像到镜头的距离,简称像距;h是物体的高度;p是成像的高度;f是镜头的焦距。
图2 凸透镜成像原理
根据图2以及三角形相似的特性,可以得出:
(3)
根据几何光学的透镜成像公式[4]:
(4)
其中,u是物距;v是像距;f是焦距。
由上述两个等式可以推出:
(5)
由于手机摄像头的焦距f一般小于10 mm,而且测量距离功能的测量范围大于10 cm,对测量结果影响很小,所以可以将焦距f省略,故式(5)可以看作是:
(6)
根据式6可知,只要知道相机的焦距f、待测物的高度h以及待测物在成像处的高度p就能计算出手机到待测物的距离[5]。但是因为手机摄像头拍摄时成像于感光元件,物体成像的高度或者长度难以测量。
对物件成像高度难以测量的问题,可以通过引入参考值和将成像高度等效转换成另一个量值来解决。
在同一个手机摄像头中,焦距是固定的,也就是f可以看作是一个常量。如果使用该摄像头分别对物件1和物件2正面拍摄,那么根据式6可得到以下等式:
(7)
对等式7变换得到:
(8)
显然,相比式6,通过式8计算物件与手机的距离不再需要具体成像高度值p,而只需得到物件2和物件1的成像高度之比[6]。
对于同一个摄像头,如果将其拍摄的成像按相同方法加载到同一屏幕上,那么屏幕上物件2与物件1的长度之比必定等于物件2和物件1的成像高度之比。在这里可以进一步得到,在屏幕上物件2的起点和终点间的屏幕像素点与物件1的起点和终点间的屏幕像素点之比,也必定等于物件2和物件1的成像高度之比。所以,对于物件的成像高度值p可以用物件在屏幕上的像素点来等效表示,前提是所有的图片要使用相同的加载方式加载到屏幕上。
所以根据式8来计算图片上待测物与手机的距离,需要用户提供屏幕上待测物起点与终点的像素点数、待测物的长度以及参考物的数值。参考物的数值包括在屏幕上起点与终点间的像素点数、参考物的长度以及参考物与手机的距离。
此外,根据式7还可以推出:
(9)
所以当用户输入待测物到手机的距离时,软件还能根据式9计算出待测物的高度或者长度。
要注意的是,部分手机相机可以拍摄不同长宽比的照片,例如4∶3或者16∶9。在设置参考值时和测量时必须使用同等长宽比的照片。
在使用测量照片上待测物与手机距离功能时需要先设置参考值,并且往往需要设置多个参考值。
设置参考值的步骤包括:第一步,使用手机正对参考物拍摄;第二步,在屏幕上选取参考物的起点和终点;第三步,设置参考物的长度和与手机的距离。在这些步骤中,第一步可能出现没有正对参考物的问题,第二步可能出现选取参考物的起点或终点有偏离的问题,第三步可能出现输入的参考物的长度和与手机的距离存在较大误差的问题。所以每个参考值都可能存在较大误差,从而导致测量结果产生较大误差。因此建议设置多个参考值,使得软件可以结合多个参考值进行计算,降低单个参考值对测量结果的影响。
算法流程如图3所示。
Android Studio是基于流行的IntelliJ IDEA创建的一套用于Android开发的免费集成开发工具,目前已成为Google官方指定的Android开发平台[7]。故软件使用Android Studio2.3作为开发平台,使用Java语言进行实现,将数据存储到Android自带的SQLite数据库中保存。
测量照片上待测物长度功能包括打开照片、选取参考物起点和终点、设置参考物长度、获取结果等步骤。与之相似的是测量照片上的待测物与手机距离功能包括打开照片、选取物件起点和终点、设置待测物长度或距离、设置参考值、获取结果等步骤。在这些步骤中,打开照片和选取物件起点和终点是关键功能。
在屏幕上绘制直尺就是在屏幕上按一定的间距绘制刻度与文字。其中,确定间距是待解决的关键问题,直尺的单位长度为1 mm,所以如何在屏幕上表示1 mm就是解决问题的关键。
图3 计算距离值流程
在安卓开发中,可以通过Canvas类来绘制图像与文字[8]。Canvas类绘制图像时会使用屏幕的坐标系,这个坐标系以屏幕左上方为原点,从左往右是X轴正方向,从下往上是Y轴正方向,坐标的单位长度就是一个屏幕像素点。
屏幕密度是指单位长度上能显示的屏幕像素点数,也就是一英寸上能显示的像素点数,用符号dpi表示[9]。于是,根据屏幕密度就能换算成坐标系与物理尺寸的关系,从而解决在屏幕上表示1 mm的问题。
屏幕密度可以通过调用系统提供的dpi获得,而且可细分为X轴的屏幕密度与Y轴的屏幕密度。软件在较长的一侧绘制直尺,所以选取Y轴作为直尺方向。得到Y轴的屏幕密度后,根据以下等式就能求出屏幕上1 mm能显示的像素点数(dpm):
dpm=dpi/25.4
(10)
其中,1英寸等于25.4 mm。
在软件中打开系统相册中的照片,主要是通过以下步骤:调用startActivityForResult(Intent intent,int requestCode)打开系统相册;选中照片后系统会调用onActivityResult(int requestCode,int resultCode,Intent data),从Intent data中可以解析出选中照片的Uri。
4.2.2 显示照片
得到照片的地址后,就可以通过BitmapFactory.decodeFile(String pathName,Options opts)将图片加载到内存,然后放到ImageView上。
在将图片加载到内存时,需要先经过压缩处理,否则会因为内存消耗较大导致软件崩溃。可以通过构建BitmapFactory.Options实例来设置缩放的倍数[10]。
此外,更为重要的是,分辨率相同的照片,长宽比可能不同。例如一张1 200万像素的照片,有可能是4 000×3 000的,也有可能是3 000×4 000的。这就导致如果直接将图片加载到屏幕上,有可能是横屏显示,也有可能是竖屏显示。
在测量照片上待测物与手机距离原理中提过,使用式8计算距离时不需要具体的成像高度,而是只需得到参考物的成像高度与待测物的成像高度之比。
将这些照片按同样的方式加载到屏幕上时,可以看成是在同一个底片上的成像。于是,参考物的成像高度与待测物的成像高度之比就等价于参考物的起点和终点在屏幕上的像素点数与待测物的起点和终点在屏幕上的像素点数之比。
所以在显示图片时,需要统一将图片设置为竖屏显示或者横屏显示。因为竖屏显示的图像面积更大,所以使用竖屏显示。为确保所有图片都是竖屏显示,可以先判断图片的分辨率是否是长大于宽,如果是那么就使用Matrix.postRotate(90)将图片旋转90度再显示图片,否则直接显示图片。
图7为图6所示的金镀膜光纤在谐振响应波长1.55 μm处的基模模场分布图.从图7(b)可知,在波长1.55 μm处,光纤y偏振纤芯模式与y偏振二阶表面等离子模式具有相同的模式传播常数,光纤纤芯模式强烈的耦合到金属表面产生的SPPs模式中,产生了表面等离子共振效应,而图7(a)显示的x偏振方向光纤基模模场能量被全部限制在纤芯中.光纤的这种特性可以很好地将其应用于通信波段的光纤偏振滤波器中.
4.2.3 Android权限设置
访问系统中的照片需要先获得访问外部存储的权限[11]。可以在AndroidManifest.xml中申请这些权限,代码如下:
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> android:name="android.permission.READ_EXTERNAL_STORAGE"/> 在Android6.0以后,上面的两个权限仅在AndroidManifest中申请是不够的,还需要通过在代码中动态申请[12],代码如下: ActivityCompat.requestPermissions(TakePhotoActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PERMISSION_REQ_WRITE_EXTERNAL_STORAGE); 物件选取是指标识屏幕显示的照片上物件的起点和终点。该功能通过在屏幕上放置两个点来表示物件的起点和终点,并且可以返回这两个点在屏幕上的连线的像素点数。图4是在手机上截取物件起点和终点的截图,图4中上面所选取的点,在屏幕上方的圆圈中可以进行放大,以降低取点的误差。 图4 物件选取示意 在Android开发中,可以通过自定义组件来完成这个功能[13]。图4中的4个圆环以及它们之间的连线就是实现物件选取功能的自定义组件MeasureView。该组件由4个圆环(分别称为A环、B环、C环、D环)和3条连接线(A环与B环圆心之间的连线、B环与C环圆心之间的连线、C环与D环圆心之间的连线)组成,其中BC连线属于核心线,AB连线和CD连线属于辅助线。用户可以移动4个圆环,当移动B环或者C环时,只有B环或者C环被移动。当移动A环时,B环会随之移动;当移动D环时,C环也会随之移动。将B环和C环分别移动到物件起点和终点,通过调用测量组件的int getCoreLinePixel()方法就能获取B环圆心到C环圆心连线的像素点数,这个像素点数值就是选取物件的屏幕上的像素点数值。 在测试过程中发现,对于一些较小的物件,MeasureView在选择起点和终点时显得有些困难,因为难以发现起点或终点是否选取得当,放对了位置。为了解决这个问题,实现了放大镜组件ZoomView。ZoomView的外观设计成一个圆,里面可以显示图像。将B环和C环分别绑定一个ZoomView,这样就能看清B环的中心和C环的中心在图片上的具体位置,从而更好地选取物件。 测量结果和参考值数据都是保存到本地的。在Android中提供3种数据持久化技术,分别是文件存储、SharedPreference存储和数据库存储[14]。在这里使用适合保存大量数据的数据库存储,也就是Android自带的SQLite数据库存储。 数据库一共有2个表,分别是保存测量图片上待测物长度的实体(在这里称它为长度记录)和保存测量图片上待测物与手机距离的实体(在这里称它为距离记录)。长度记录结构如下:(编号、名称、参考物长度、参考物像素、测量物长度、测量物像素、图片地址、创建时间戳);距离记录结构如下:(编号、名称、类型、长度、像素、距离、图片地址、创建时间戳)。对于距离记录而言,类型值为1时表示保存的是参考物与镜头的参考值,类型值为2时表示保存的是待测物与镜头的距离测量结果。 测量样品来源于多个物件[15],采用小米3移动版进行拍摄,其中待测物长度、待测物与手机的距离通过使用卷尺进行测量,测量数据如表1所示。 表1 测量照片上待测物与手机距离结果分析 续表1 测量样品来源于多个物件,采用小米3移动版进行拍摄,其中参考物长度、待测物长度通过使用卷尺进行测量,测量数据如表2所示。 表2 测量照片上待测物长度结果分析 根据实验结果可以看出,软件的测量照片上的待测物长度和测量照片上待测物与手机距离这两大功能计算出的结果相对误差较低,可以满足对生活中非专业要求的测量需求,具备很高的实用性。 设计了一款基于Android的测量软件。软件具有3大功能,包括测量照片上待测物长度、测量照片上待测物与手机距离以及在屏幕上绘制等比例直尺,并详细说明了这些功能的原理、算法以及使用方法。该软件自面世起,经过多场景大量的测试和验证,结果表明该软件的操作方法简单,对现场要求不高,且测量误差较低,尤其适合非规则化、传统方式不易操作的场景,具有很高的实用价值。4.3 物件选取
4.4 数据库的设计
5 测量数据误差分析
5.1 测量照片上待测物与手机的距离误差分析
5.2 测量照片上待测物长度数据分析
6 结束语