吴 正
(上海船舶运输科学研究所 舰船自动化系统事业部, 上海 200135)
增强现实(Augmented Reality,AR)是一种实时计算摄影机影像的位置和角度并加上相应图像,将真实世界的信息与虚拟世界的信息“无缝”集成的技术,其目标是在屏幕上将虚拟世界套在现实世界中并与之互动。这种技术最早于二十世纪九十年代提出,效用是通过计算机等科学技术对原本在现实世界中的一定时间和空间范围内很难体验到的实体信息(视觉信息、声音、味道和触觉等)进行模拟仿真和叠加,将虚拟的信息应用到真实世界中被人类感官感知,从而达到超越现实的感官体验。AR技术不仅能展现真实世界的信息,而且能将虚拟的信息显示出来,2种信息相互补充、叠加。随着电子产品的运算能力不断提升,输入和输出设备的价格不断下降,视频显示的质量不断提高,以及功能很强大且易于应用的软件不断实用化,AR的应用将越来越广泛。
本文结合百度云技术对图形的智能识别功能,利用AR技术将对象参数标记到人们正在观察的特定目标模块上,对比预设定的采样特征,准确识别目标,使使用者能更便捷地获取相关信息。
本文设计的硬件设备至少由以下2部分组成:
1) 搭载Unity3D软件系统的计算机主机,用于构建AR环境并打包成APP安装文件;
2) 采样摄像头,用于在软件中对建模对象进行三维摄像取样,同时对捕捉目标(模块模型)的图像进行机器辨识。
注:简易AR设备可由智能手机替代,且同时满足以上硬件要求。
基于Unity3D的系统要求,计算机需具备4个条件。
1) OS: Windows 7 SP1+, Windows 8, Windows 10; Mac OS X 10.9+。
2) GPU: 支持DX9 (shader model 3.0) 或DX11 (feature level 9.3) 的显卡。
3) 硬盘空间大于64G。
4) 内存大于8G。
为保证识别跟踪效果,对摄像图片的大小和格式等作以下规范性限制:
1) 识别图应为不小于480×480像素的图片;
2) 识别图的格式应为JPG或JPEG;
3) 上传的识别图占用的内存应小于3M。
注:常用智能手机摄像头满足以上要求。
1) DuMix AR Unity SDK 支持发布Android和iOS应用,且手机需保持联网状态。
2) DuMix AR Unity SDK开发环境需满足:Unity3D开发版本2017以上;XCode版本9.0以上;Android Studio版本4.0.0以上;架构满足armeabi-v7a 和arm64-v8a。
机器视觉就是用机器代替人眼对目标进行测量和判断。机器视觉系统是指通过机器视觉产品(即图像摄取装置,如手机摄像头)将被摄取目标转换成图像信号,并传送给专用的图像处理系统,根据像素分布、亮度和颜色等信息转换成数字信号;图像系统通过对这些信号进行运算,抽取目标的特征,进而根据判别结果将相关信息反馈给用户。图1为机器视觉工作流程。
图1 机器视觉工作流程
根据图1,制作过程简化如下:
1) 拍摄大量对象照片,多角度采集目标图像特征数据;
2) 通过百度识图平台检测出目标模块的多个关键点(下文有相关特征点处理介绍);
3) 通过识图平台找到这些点与目标关键点的对应关系,即可简单地通过替换对应行的数据达到动态识别模型的目的;
4) 创建Unity3D应用,导入SDK,获得平台许可;
5) 使用Blender、Maya和Rhino等第三方软件建立该模型,这里省略制作过程,生成格式为obj,对这些点进行连线得到一个低面数的模块模型;
6) 借助Unity3D引擎整合相关内容,配置应用程序并制作AR界面,打包发布软件作品。
2.1.1 图像特征提取
2.1.1.1 纹理
纹理是一种反映相似图像中同质现象的视觉特征,体现物体表面的缓慢变化或周期性变化的表面结构组织排列属性。纹理具有3个标志,即:某种局部序列性不断重复;非随机排列;纹理区域内大致为均匀的统一体。
不同于灰度和颜色等图像特征,纹理通过像素及其空间邻域的灰度分布来表现,即局部纹理信息。另外,局部纹理信息在不同程度上的重复性决定了全局纹理。 纹理特征能在体现全局特征的性质的同时,描述图像或图像区域对应景物的表面性质。然而,纹理只是物体表面的一种特性,并不能完全反映出物体的本质属性,因此仅利用纹理特征是无法获得高层次图像内容的。与颜色特征不同,纹理特征不是基于像素点的特征,其需在包含多个像素点的区域内进行统计计算。
2.1.1.2 分形模型方法
分形维数作为分形的重要特征和度量,在应用时以下面2点为基础:
1) 不同种类的形态物质一般具有不同的分形维数;
2) 自然界中的分形与图像的灰度表示之间存在着一定的对应关系。
随机场模型法中的典型方法有马尔可夫随机场(Markov Random Field, MRF)模型法、Gibbs随机场模型法、分形模型法和自回归模型法等。这些方法主要通过模型系数标识纹理特征,模型系数的求解有难度,计算量很大。由于基于MRF模型的纹理图像分割是一个迭代的优化过程,其由局部到全局的收敛速度很慢(即使条件迭代模式(Iterated Conditional Mode, ICM)能加速寻找解),通常需迭代数百次才能收敛,因此有必要借助网络的云计算服务进行复杂的计算,本文借助的是百度智能云识图平台[1]。
2.1.1.3 识图平台
在通过识图平台获取目标的采样图时,有以下过程:
1) 将图像的空间信息和灰度信息简单、有机地结合起来,从而建立分形模型描述图像区域的纹理特征。应用比较多的是SIFT(Scale-Invariant Feature Transform)描述子、指纹算法函数、bundling features算法和hash function(散列函数)等。此外,可根据不同的图像设计不同的算法,比如采用图像局部N阶矩的方法提取图像特征。
2) 由平台对图像特征信息进行编码,并根据海量图像编码制作查找表。对于目标图像,可对分辨率较高的图像进行降采样,减少运算量之后再进行图像特征提取和编码处理。
3) 在应用软件中进行相似度匹配运算,利用目标图像的编码值,在图像数据库中进行全局或局部的相似度计算;根据需要的鲁棒性设定阈值,将相似度高的图像或数字模型找出来。
2.1.1.4 寻找单应性变换求相似度
当2张图的相对位置锁定之后,需分别找到对应的点,Homography就是一个变换(3×3矩阵),将一张图中的点映射到另一张图中对应的点上[2],可表示为
(1)
此时2张图之间的H映射关系就可表示为
(2)
要得到2张图的H,至少需知道8个相同位置的点,代码如下:
{/*允许匹配的最小数量*/
const int minNumberMatchesAllowed = 8;
/*数量过小返回*/
if (matches.size() return false; /*准备数据存储映射矩阵*/ vector vector /*将匹配的点找出来*/ for (size_t i = 0; i srcPoints[i] = trainKeyPoints[matches[i].trainIdx].pt; dstPoints[i] = queryKeypoints[matches[i].queryIdx].pt; } vector /*在原平面和目标平面之间返回一个单映射矩阵(类似仿射变换中变换矩阵*/ homography = findHomography( /*(识别图)原图中匹配的点集*/ srcPoints, /*相机图中匹配的点集*/ dstPoints, /*采用随机采样一致性算法,最大容忍重投影误差*/ CV_FM_RANSAC, 3, /*输出矩阵这里使用无符号char类型数组来保存*/ inliersMask ); vector for (size_t i = 0; i { if (inliersMask[i]) /*按照单映射矩阵的大小提取一些匹配点*/ inliers.push_back(matches[i]); } /*将2个数组内容交换matche中存储当前的匹配集合*/ atches.swap(inliers); /*返回时大于8个点*/ return matches.size()>minNumberMatchesAllowed; } 2.1.2 识别图管理 首先前往https://ar.baidu.com/上传对象采样照片(见图2),生成并下载资源包(见图3)。本文为对取样模块相关信息作马赛克处理,软件制作步骤真实有效,3D建模过程省略。 图2 试验模块样品 图3 生成资源包 识图机制为:服务器对上传的图片进行灰度处理,图片变为黑白图像;提取黑白图像的特征点;将特征点数据打包;程序运行时对比特征点数据包。摄像头的参数是事先计算出来的,项目中单应性矩阵的计算方式为:从优化之后的匹配点对中挑选几个进行计算,在opencv中采用findHomography函数,分2步进行,第一步是直接计算得到单应性粗糙矩阵,第二步是对图像进行透视变换扭曲,再次测得一个透视的单应性矩阵,将其与第一步中的粗糙矩阵相乘得到精确的单应性矩阵。根据单应性矩阵可得出一张图片在另一张图片中的位置,这也是空间坐标的确定方式。本文借助云识图处理相关特征点,这里不作详细叙述。 本文采用的Unity3D版本为2018.2.6f1,已在百度云中创建AR应用,得到相应的AppID、APIKey、SecretKey、包名和License文件。导入Unity3D,应用创建与设置见图4[3]。 图4 应用创建与设置 新建Unity工程,找到DuMix AR Unity SDK Unitypackage (.unitypackage) ,打开并导入Unity中(见图5)。 为使DuMix AR Unity SDK正常使用,需将prefab添加到场景中。将场景中的相机删除,将ARCamera prefab拖入场景中。图6为软件设置平台权限。 将平台上生成的资源包导入Unity3D场景StreamingAssets文件夹中之后,BaiduARImageTracker组件中可调用的监听事件的后台定义指令如下: BaiduARImageTracker tracker=imageTracker.GetComponent /*身份信息报错时响应*/ tracker.OnErrorEvent.AddListener(ErrorInfo); /*跟踪失败*/ Tracker.OnTrackFail.AddListener(Fail); /*跟踪成功*/ Tracker.OnTrackSuccess.AddListener(Success); 目前只能跟踪1个模型,且模型的大小需根据显示效果调整。只有2D跟踪功能支持Unity直接预览。 将ARObjectTracker prefab添加到场景中,将模型添加到ARObjectTracker节点下,在模型上添加BaiduARObjectTrackable组件。通过调整模型的Tranform中Rotation的值,对模型的初始角度进行控制;通过调整Transform中Position的X值和Y值,对模型在屏幕上的初始位置进行控制;通过调整Transform中Position的Z值,对相机的距离进行控制。图7为软件设置全景图。 图7 软件设置全景图 在开发实时识别功能时,需调用BaiduARImageRecognitionResult组件中的OnRespond监听事件。OnRespond监听事件在识别成功之后响应,给监听事件添加自定义的方法。 _result=gameObject.GetComponent _result.OnRespond.AddListener(CreateObject); 先根据百度云数据提供的特征进行相似度计算,得到比较值;接着按百分比降序,首位即是机器辨识出的结果(见图8)。 图8 软件界面 测试结果:模块A为0.967;模块B为0.021;模块C为0.011。显然,通过试验得出,目标最接近模块A,当在百度智能识图平台上提交大量采样数据之后,辨识度可接近100%[4]。 2.6.1 BaiduARWebCamera 程序打开之后,首先需确认可选摄像头,鉴于常用手机都带有前、后双摄像头,而目前前置摄像头只支持图像识别功能,故采用后置摄像头作为AR主摄像头。 void SwitchCamera(); 2.6.2 BaiduARObjectTracker 目标对象选取之后,首先需对物体进行图像采样,从外部得到的样本中选出相关数字模型。用一种可自定义变更的算法跟踪摄像头拍摄到的图片中的目标,并用 state object 方式对其进行存储。跟踪器可同时追踪多个数据集(被追踪对象),但同一时间只能有1个被激活。 /*启动AR 开始对物体位置的实时监控*/ void StartAR(); /*停止AR 停止对物体位置的实时传送*/ void StopAR(); /*暂停AR*/ void PauseAR(); /*继续AR*/ void ResumeAR(); 接着,锁定位置,上传智能云进行特征码比较。若出现选取不符合要求的情况,则关闭接口,停止程序。 /*切换模型参数:index 索引,模型的序列号*/ bool SetActiveTrack(int index); /*定位成功*/ UnityEvent OnSlamSuccess; /*定位失败*/ UnityEvent OnSlamFail; /*身份报错信息*/ UnityEventEx OnErrorEvent; 2.6.3 BaiduARObjectTrackable 当程序进行云对比时,禁止用户随意改变目标位置,需对物体进行实时监测。但是,之前的过程可在六自由度中追踪到所有现实世界中的目标,分别为x(向右为正方向)、y(向正上方为正方向)和z(远离图像的方向为正方向)。 /*更新物体的位置,角度信息*/ void UpdateSlamPos(); 2.6.4 BaiduARImageTracker 当预置的模型符合参照物的特征时,可进行跟踪比对;反之,需从资源包中搜索相关模型参数,资源包位置可选择绝对路径或相对路径。 /*切换模型参数 :path 路径,模型上BaiduARImageTrackable组件中的filePath*/ bool SetActiveTrack (string path); /*跟踪成功*/ UnityEvent OnTrackSuccess; /*跟踪失败*/ UnityEvent OnTrackFail; /*身份报错信息*/ UnityEventEx OnErrorEvent; /*自定义资源包的加载路径参数 :path 绝对路径, 比如”/Users/WuZheng/Desktop/picture/module/model/8e361528.feam“*/ SetAbsolutePath(string path) 2.6.5 BaiduARCloudRecognition 以上步骤完成之后,通过对模块识别进行监听,即可直接收到AR云的回调,通过数据处理显示在程序中。 /*拍摄模块*/ void TakePictureModule(); /*普通场景识别监听*/ void ResultSceneRecognition(Action /*模块识别监听*/ void ResultModuleRecognition(Action /*身份报错信息*/ UnityEventEx OnErrorEvent; 由于是初次用AR智能云识别工业产品,在实际使用过程中发现一些问题,具体如下。 2.7.1 Dlib 1) 因Dlib库依赖离线dat数据文件,其大小约为100M,加载需花费数秒。 2) Dlib库检测目标的速度与图像的大小成反比,因此需对摄像头的预览画面进行截取。若截取得太小,则检测不出模块。在图像的大小不影响检测效果的情况下,检测速度依然不理想。 3) 由于3D模型是根据单张图片构建的,无法获取Z轴的数值,因此在估算三维姿态时用的是模拟数据,得出的数值可能不准确。 2.7.2 百度云识图平台API 1) 若采样图数量较少,则识别的准确度呈指数级下降,因此对前期工作的要求比较严格; 2) 图像跟踪可将模型定位到图片上,但本地识图只有回调,开发者必须自己定义加载的是模型还是UI图片等; 3) 不排除百度智能云后期收费问题。 2.7.3 Unity3D 1) Unity3D本身无法建模,必须借助第三方软件制作数字模型并导入; 2) 建立识图过程中生成的特征采样点都是借助百度智能云数据后台处理的,属于商业机密,相关算法不可修改,无法提供自定义设计。 由于本文所述软件的制作仅以优化实际生产为目标,初次应用还有很多不足,设计测试对象单一(模块单板),没有充分发挥出AR和智能云的优点。对此,提出以下设计改进方向: 1) 因模块化对象的相似度较高,需增加更多采样图片,充实特征库,稳定测试数据,提高软件辨识的准确度; 2) 针对模块印刷电路板的不同布局,增加更多电路元器件的特征点,使软件能直接细化和排错,AR图像化印刷电路板上的明显不同; 3) 图片应避免出现大面积色值相近的相邻色块,否则经灰度处理之后整张图都会变模糊,撞色的图片设计能使灰度处理之后的识别图仍保有清晰的分界线; 4) 显示的物体距离镜头中识别图的中心太远,若物体能正好在识别图特征点分布较多、较均匀的位置,且贴近识别图,则能很好地解决抖动问题。 本文所述模块识别软件有助于提高模块制作和调试人员的工作效率和准确性,在模块制造和调试作业中快速查询到相应模块的型号和功能。采用AR设备可完全做到仿真辨识检测,对于一些具有高度相似性或高复杂度特性的模块产品而言,这种AR系统能提供更具体的对比参数和更便捷的工作体验。 随着科技的不断进步,AR技术将在未来的制造业领域得到广泛应用,本文的研究可为AR技术在船舶领域的应用提供参考。2.2 创建软件应用
2.3 导入SDK
2.4 场景设置
2.5 Unity3D应用设置
2.6 接口说明
> call);
> call);
2.7 软件缺陷
2.8 改进方向
3 结 语