吳 正
(上海船舶運(yùn)輸科學(xué)研究所 艦船自動(dòng)化系統(tǒng)事業(yè)部, 上海 200135)
增強(qiáng)現(xiàn)實(shí)(Augmented Reality,AR)是一種實(shí)時(shí)計(jì)算攝影機(jī)影像的位置和角度并加上相應(yīng)圖像,將真實(shí)世界的信息與虛擬世界的信息“無縫”集成的技術(shù),其目標(biāo)是在屏幕上將虛擬世界套在現(xiàn)實(shí)世界中并與之互動(dòng)。這種技術(shù)最早于二十世紀(jì)九十年代提出,效用是通過計(jì)算機(jī)等科學(xué)技術(shù)對原本在現(xiàn)實(shí)世界中的一定時(shí)間和空間范圍內(nèi)很難體驗(yàn)到的實(shí)體信息(視覺信息、聲音、味道和觸覺等)進(jìn)行模擬仿真和疊加,將虛擬的信息應(yīng)用到真實(shí)世界中被人類感官感知,從而達(dá)到超越現(xiàn)實(shí)的感官體驗(yàn)。AR技術(shù)不僅能展現(xiàn)真實(shí)世界的信息,而且能將虛擬的信息顯示出來,2種信息相互補(bǔ)充、疊加。隨著電子產(chǎn)品的運(yùn)算能力不斷提升,輸入和輸出設(shè)備的價(jià)格不斷下降,視頻顯示的質(zhì)量不斷提高,以及功能很強(qiáng)大且易于應(yīng)用的軟件不斷實(shí)用化,AR的應(yīng)用將越來越廣泛。
本文結(jié)合百度云技術(shù)對圖形的智能識別功能,利用AR技術(shù)將對象參數(shù)標(biāo)記到人們正在觀察的特定目標(biāo)模塊上,對比預(yù)設(shè)定的采樣特征,準(zhǔn)確識別目標(biāo),使使用者能更便捷地獲取相關(guān)信息。
本文設(shè)計(jì)的硬件設(shè)備至少由以下2部分組成:
1) 搭載Unity3D軟件系統(tǒng)的計(jì)算機(jī)主機(jī),用于構(gòu)建AR環(huán)境并打包成APP安裝文件;
2) 采樣攝像頭,用于在軟件中對建模對象進(jìn)行三維攝像取樣,同時(shí)對捕捉目標(biāo)(模塊模型)的圖像進(jìn)行機(jī)器辨識。
注:簡易AR設(shè)備可由智能手機(jī)替代,且同時(shí)滿足以上硬件要求。
基于Unity3D的系統(tǒng)要求,計(jì)算機(jī)需具備4個(gè)條件。
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) 內(nèi)存大于8G。
為保證識別跟蹤效果,對攝像圖片的大小和格式等作以下規(guī)范性限制:
1) 識別圖應(yīng)為不小于480×480像素的圖片;
2) 識別圖的格式應(yīng)為JPG或JPEG;
3) 上傳的識別圖占用的內(nèi)存應(yīng)小于3M。
注:常用智能手機(jī)攝像頭滿足以上要求。
1) DuMix AR Unity SDK 支持發(fā)布Android和iOS應(yīng)用,且手機(jī)需保持聯(lián)網(wǎng)狀態(tài)。
2) DuMix AR Unity SDK開發(fā)環(huán)境需滿足:Unity3D開發(fā)版本2017以上;XCode版本9.0以上;Android Studio版本4.0.0以上;架構(gòu)滿足armeabi-v7a 和arm64-v8a。
機(jī)器視覺就是用機(jī)器代替人眼對目標(biāo)進(jìn)行測量和判斷。機(jī)器視覺系統(tǒng)是指通過機(jī)器視覺產(chǎn)品(即圖像攝取裝置,如手機(jī)攝像頭)將被攝取目標(biāo)轉(zhuǎn)換成圖像信號,并傳送給專用的圖像處理系統(tǒng),根據(jù)像素分布、亮度和顏色等信息轉(zhuǎn)換成數(shù)字信號;圖像系統(tǒng)通過對這些信號進(jìn)行運(yùn)算,抽取目標(biāo)的特征,進(jìn)而根據(jù)判別結(jié)果將相關(guān)信息反饋給用戶。圖1為機(jī)器視覺工作流程。
圖1 機(jī)器視覺工作流程
根據(jù)圖1,制作過程簡化如下:
1) 拍攝大量對象照片,多角度采集目標(biāo)圖像特征數(shù)據(jù);
2) 通過百度識圖平臺檢測出目標(biāo)模塊的多個(gè)關(guān)鍵點(diǎn)(下文有相關(guān)特征點(diǎn)處理介紹);
3) 通過識圖平臺找到這些點(diǎn)與目標(biāo)關(guān)鍵點(diǎn)的對應(yīng)關(guān)系,即可簡單地通過替換對應(yīng)行的數(shù)據(jù)達(dá)到動(dòng)態(tài)識別模型的目的;
4) 創(chuàng)建Unity3D應(yīng)用,導(dǎo)入SDK,獲得平臺許可;
5) 使用Blender、Maya和Rhino等第三方軟件建立該模型,這里省略制作過程,生成格式為obj,對這些點(diǎn)進(jìn)行連線得到一個(gè)低面數(shù)的模塊模型;
6) 借助Unity3D引擎整合相關(guān)內(nèi)容,配置應(yīng)用程序并制作AR界面,打包發(fā)布軟件作品。
2.1.1 圖像特征提取
2.1.1.1 紋理
紋理是一種反映相似圖像中同質(zhì)現(xiàn)象的視覺特征,體現(xiàn)物體表面的緩慢變化或周期性變化的表面結(jié)構(gòu)組織排列屬性。紋理具有3個(gè)標(biāo)志,即:某種局部序列性不斷重復(fù);非隨機(jī)排列;紋理區(qū)域內(nèi)大致為均勻的統(tǒng)一體。
不同于灰度和顏色等圖像特征,紋理通過像素及其空間鄰域的灰度分布來表現(xiàn),即局部紋理信息。另外,局部紋理信息在不同程度上的重復(fù)性決定了全局紋理。 紋理特征能在體現(xiàn)全局特征的性質(zhì)的同時(shí),描述圖像或圖像區(qū)域?qū)?yīng)景物的表面性質(zhì)。然而,紋理只是物體表面的一種特性,并不能完全反映出物體的本質(zhì)屬性,因此僅利用紋理特征是無法獲得高層次圖像內(nèi)容的。與顏色特征不同,紋理特征不是基于像素點(diǎn)的特征,其需在包含多個(gè)像素點(diǎn)的區(qū)域內(nèi)進(jìn)行統(tǒng)計(jì)計(jì)算。
2.1.1.2 分形模型方法
分形維數(shù)作為分形的重要特征和度量,在應(yīng)用時(shí)以下面2點(diǎn)為基礎(chǔ):
1) 不同種類的形態(tài)物質(zhì)一般具有不同的分形維數(shù);
2) 自然界中的分形與圖像的灰度表示之間存在著一定的對應(yīng)關(guān)系。
隨機(jī)場模型法中的典型方法有馬爾可夫隨機(jī)場(Markov Random Field, MRF)模型法、Gibbs隨機(jī)場模型法、分形模型法和自回歸模型法等。這些方法主要通過模型系數(shù)標(biāo)識紋理特征,模型系數(shù)的求解有難度,計(jì)算量很大。由于基于MRF模型的紋理圖像分割是一個(gè)迭代的優(yōu)化過程,其由局部到全局的收斂速度很慢(即使條件迭代模式(Iterated Conditional Mode, ICM)能加速尋找解),通常需迭代數(shù)百次才能收斂,因此有必要借助網(wǎng)絡(luò)的云計(jì)算服務(wù)進(jìn)行復(fù)雜的計(jì)算,本文借助的是百度智能云識圖平臺[1]。
2.1.1.3 識圖平臺
在通過識圖平臺獲取目標(biāo)的采樣圖時(shí),有以下過程:
1) 將圖像的空間信息和灰度信息簡單、有機(jī)地結(jié)合起來,從而建立分形模型描述圖像區(qū)域的紋理特征。應(yīng)用比較多的是SIFT(Scale-Invariant Feature Transform)描述子、指紋算法函數(shù)、bundling features算法和hash function(散列函數(shù))等。此外,可根據(jù)不同的圖像設(shè)計(jì)不同的算法,比如采用圖像局部N階矩的方法提取圖像特征。
2) 由平臺對圖像特征信息進(jìn)行編碼,并根據(jù)海量圖像編碼制作查找表。對于目標(biāo)圖像,可對分辨率較高的圖像進(jìn)行降采樣,減少運(yùn)算量之后再進(jìn)行圖像特征提取和編碼處理。
3) 在應(yīng)用軟件中進(jìn)行相似度匹配運(yùn)算,利用目標(biāo)圖像的編碼值,在圖像數(shù)據(jù)庫中進(jìn)行全局或局部的相似度計(jì)算;根據(jù)需要的魯棒性設(shè)定閾值,將相似度高的圖像或數(shù)字模型找出來。
2.1.1.4 尋找單應(yīng)性變換求相似度
當(dāng)2張圖的相對位置鎖定之后,需分別找到對應(yīng)的點(diǎn),Homography就是一個(gè)變換(3×3矩陣),將一張圖中的點(diǎn)映射到另一張圖中對應(yīng)的點(diǎn)上[2],可表示為
(1)
此時(shí)2張圖之間的H映射關(guān)系就可表示為
(2)
要得到2張圖的H,至少需知道8個(gè)相同位置的點(diǎn),代碼如下:
{/*允許匹配的最小數(shù)量*/
const int minNumberMatchesAllowed = 8;
/*數(shù)量過小返回*/
if (matches.size() return false; /*準(zhǔn)備數(shù)據(jù)存儲映射矩陣*/ vector vector /*將匹配的點(diǎn)找出來*/ for (size_t i = 0; i srcPoints[i] = trainKeyPoints[matches[i].trainIdx].pt; dstPoints[i] = queryKeypoints[matches[i].queryIdx].pt; } vector /*在原平面和目標(biāo)平面之間返回一個(gè)單映射矩陣(類似仿射變換中變換矩陣*/ homography = findHomography( /*(識別圖)原圖中匹配的點(diǎn)集*/ srcPoints, /*相機(jī)圖中匹配的點(diǎn)集*/ dstPoints, /*采用隨機(jī)采樣一致性算法,最大容忍重投影誤差*/ CV_FM_RANSAC, 3, /*輸出矩陣這里使用無符號char類型數(shù)組來保存*/ inliersMask ); vector for (size_t i = 0; i { if (inliersMask[i]) /*按照單映射矩陣的大小提取一些匹配點(diǎn)*/ inliers.push_back(matches[i]); } /*將2個(gè)數(shù)組內(nèi)容交換matche中存儲當(dāng)前的匹配集合*/ atches.swap(inliers); /*返回時(shí)大于8個(gè)點(diǎn)*/ return matches.size()>minNumberMatchesAllowed; } 2.1.2 識別圖管理 首先前往https://ar.baidu.com/上傳對象采樣照片(見圖2),生成并下載資源包(見圖3)。本文為對取樣模塊相關(guān)信息作馬賽克處理,軟件制作步驟真實(shí)有效,3D建模過程省略。 圖2 試驗(yàn)?zāi)K樣品 圖3 生成資源包 識圖機(jī)制為:服務(wù)器對上傳的圖片進(jìn)行灰度處理,圖片變?yōu)楹诎讏D像;提取黑白圖像的特征點(diǎn);將特征點(diǎn)數(shù)據(jù)打包;程序運(yùn)行時(shí)對比特征點(diǎn)數(shù)據(jù)包。攝像頭的參數(shù)是事先計(jì)算出來的,項(xiàng)目中單應(yīng)性矩陣的計(jì)算方式為:從優(yōu)化之后的匹配點(diǎn)對中挑選幾個(gè)進(jìn)行計(jì)算,在opencv中采用findHomography函數(shù),分2步進(jìn)行,第一步是直接計(jì)算得到單應(yīng)性粗糙矩陣,第二步是對圖像進(jìn)行透視變換扭曲,再次測得一個(gè)透視的單應(yīng)性矩陣,將其與第一步中的粗糙矩陣相乘得到精確的單應(yīng)性矩陣。根據(jù)單應(yīng)性矩陣可得出一張圖片在另一張圖片中的位置,這也是空間坐標(biāo)的確定方式。本文借助云識圖處理相關(guān)特征點(diǎn),這里不作詳細(xì)敘述。 本文采用的Unity3D版本為2018.2.6f1,已在百度云中創(chuàng)建AR應(yīng)用,得到相應(yīng)的AppID、APIKey、SecretKey、包名和License文件。導(dǎo)入U(xiǎn)nity3D,應(yīng)用創(chuàng)建與設(shè)置見圖4[3]。 圖4 應(yīng)用創(chuàng)建與設(shè)置 新建Unity工程,找到DuMix AR Unity SDK Unitypackage (.unitypackage) ,打開并導(dǎo)入U(xiǎn)nity中(見圖5)。 為使DuMix AR Unity SDK正常使用,需將prefab添加到場景中。將場景中的相機(jī)刪除,將ARCamera prefab拖入場景中。圖6為軟件設(shè)置平臺權(quán)限。 將平臺上生成的資源包導(dǎo)入U(xiǎn)nity3D場景StreamingAssets文件夾中之后,BaiduARImageTracker組件中可調(diào)用的監(jiān)聽事件的后臺定義指令如下: BaiduARImageTracker tracker=imageTracker.GetComponent /*身份信息報(bào)錯(cuò)時(shí)響應(yīng)*/ tracker.OnErrorEvent.AddListener(ErrorInfo); /*跟蹤失敗*/ Tracker.OnTrackFail.AddListener(Fail); /*跟蹤成功*/ Tracker.OnTrackSuccess.AddListener(Success); 目前只能跟蹤1個(gè)模型,且模型的大小需根據(jù)顯示效果調(diào)整。只有2D跟蹤功能支持Unity直接預(yù)覽。 將ARObjectTracker prefab添加到場景中,將模型添加到ARObjectTracker節(jié)點(diǎn)下,在模型上添加BaiduARObjectTrackable組件。通過調(diào)整模型的Tranform中Rotation的值,對模型的初始角度進(jìn)行控制;通過調(diào)整Transform中Position的X值和Y值,對模型在屏幕上的初始位置進(jìn)行控制;通過調(diào)整Transform中Position的Z值,對相機(jī)的距離進(jìn)行控制。圖7為軟件設(shè)置全景圖。 圖7 軟件設(shè)置全景圖 在開發(fā)實(shí)時(shí)識別功能時(shí),需調(diào)用BaiduARImageRecognitionResult組件中的OnRespond監(jiān)聽事件。OnRespond監(jiān)聽事件在識別成功之后響應(yīng),給監(jiān)聽事件添加自定義的方法。 _result=gameObject.GetComponent _result.OnRespond.AddListener(CreateObject); 先根據(jù)百度云數(shù)據(jù)提供的特征進(jìn)行相似度計(jì)算,得到比較值;接著按百分比降序,首位即是機(jī)器辨識出的結(jié)果(見圖8)。 圖8 軟件界面 測試結(jié)果:模塊A為0.967;模塊B為0.021;模塊C為0.011。顯然,通過試驗(yàn)得出,目標(biāo)最接近模塊A,當(dāng)在百度智能識圖平臺上提交大量采樣數(shù)據(jù)之后,辨識度可接近100%[4]。 2.6.1 BaiduARWebCamera 程序打開之后,首先需確認(rèn)可選攝像頭,鑒于常用手機(jī)都帶有前、后雙攝像頭,而目前前置攝像頭只支持圖像識別功能,故采用后置攝像頭作為AR主攝像頭。 void SwitchCamera(); 2.6.2 BaiduARObjectTracker 目標(biāo)對象選取之后,首先需對物體進(jìn)行圖像采樣,從外部得到的樣本中選出相關(guān)數(shù)字模型。用一種可自定義變更的算法跟蹤攝像頭拍攝到的圖片中的目標(biāo),并用 state object 方式對其進(jìn)行存儲。跟蹤器可同時(shí)追蹤多個(gè)數(shù)據(jù)集(被追蹤對象),但同一時(shí)間只能有1個(gè)被激活。 /*啟動(dòng)AR 開始對物體位置的實(shí)時(shí)監(jiān)控*/ void StartAR(); /*停止AR 停止對物體位置的實(shí)時(shí)傳送*/ void StopAR(); /*暫停AR*/ void PauseAR(); /*繼續(xù)AR*/ void ResumeAR(); 接著,鎖定位置,上傳智能云進(jìn)行特征碼比較。若出現(xiàn)選取不符合要求的情況,則關(guān)閉接口,停止程序。 /*切換模型參數(shù):index 索引,模型的序列號*/ bool SetActiveTrack(int index); /*定位成功*/ UnityEvent OnSlamSuccess; /*定位失敗*/ UnityEvent OnSlamFail; /*身份報(bào)錯(cuò)信息*/ UnityEventEx OnErrorEvent; 2.6.3 BaiduARObjectTrackable 當(dāng)程序進(jìn)行云對比時(shí),禁止用戶隨意改變目標(biāo)位置,需對物體進(jìn)行實(shí)時(shí)監(jiān)測。但是,之前的過程可在六自由度中追蹤到所有現(xiàn)實(shí)世界中的目標(biāo),分別為x(向右為正方向)、y(向正上方為正方向)和z(遠(yuǎn)離圖像的方向?yàn)檎较?。 /*更新物體的位置,角度信息*/ void UpdateSlamPos(); 2.6.4 BaiduARImageTracker 當(dāng)預(yù)置的模型符合參照物的特征時(shí),可進(jìn)行跟蹤比對;反之,需從資源包中搜索相關(guān)模型參數(shù),資源包位置可選擇絕對路徑或相對路徑。 /*切換模型參數(shù) :path 路徑,模型上BaiduARImageTrackable組件中的filePath*/ bool SetActiveTrack (string path); /*跟蹤成功*/ UnityEvent OnTrackSuccess; /*跟蹤失敗*/ UnityEvent OnTrackFail; /*身份報(bào)錯(cuò)信息*/ UnityEventEx OnErrorEvent; /*自定義資源包的加載路徑參數(shù) :path 絕對路徑, 比如”/Users/WuZheng/Desktop/picture/module/model/8e361528.feam“*/ SetAbsolutePath(string path) 2.6.5 BaiduARCloudRecognition 以上步驟完成之后,通過對模塊識別進(jìn)行監(jiān)聽,即可直接收到AR云的回調(diào),通過數(shù)據(jù)處理顯示在程序中。 /*拍攝模塊*/ void TakePictureModule(); /*普通場景識別監(jiān)聽*/ void ResultSceneRecognition(Action /*模塊識別監(jiān)聽*/ void ResultModuleRecognition(Action /*身份報(bào)錯(cuò)信息*/ UnityEventEx OnErrorEvent; 由于是初次用AR智能云識別工業(yè)產(chǎn)品,在實(shí)際使用過程中發(fā)現(xiàn)一些問題,具體如下。 2.7.1 Dlib 1) 因Dlib庫依賴離線dat數(shù)據(jù)文件,其大小約為100M,加載需花費(fèi)數(shù)秒。 2) Dlib庫檢測目標(biāo)的速度與圖像的大小成反比,因此需對攝像頭的預(yù)覽畫面進(jìn)行截取。若截取得太小,則檢測不出模塊。在圖像的大小不影響檢測效果的情況下,檢測速度依然不理想。 3) 由于3D模型是根據(jù)單張圖片構(gòu)建的,無法獲取Z軸的數(shù)值,因此在估算三維姿態(tài)時(shí)用的是模擬數(shù)據(jù),得出的數(shù)值可能不準(zhǔn)確。 2.7.2 百度云識圖平臺API 1) 若采樣圖數(shù)量較少,則識別的準(zhǔn)確度呈指數(shù)級下降,因此對前期工作的要求比較嚴(yán)格; 2) 圖像跟蹤可將模型定位到圖片上,但本地識圖只有回調(diào),開發(fā)者必須自己定義加載的是模型還是UI圖片等; 3) 不排除百度智能云后期收費(fèi)問題。 2.7.3 Unity3D 1) Unity3D本身無法建模,必須借助第三方軟件制作數(shù)字模型并導(dǎo)入; 2) 建立識圖過程中生成的特征采樣點(diǎn)都是借助百度智能云數(shù)據(jù)后臺處理的,屬于商業(yè)機(jī)密,相關(guān)算法不可修改,無法提供自定義設(shè)計(jì)。 由于本文所述軟件的制作僅以優(yōu)化實(shí)際生產(chǎn)為目標(biāo),初次應(yīng)用還有很多不足,設(shè)計(jì)測試對象單一(模塊單板),沒有充分發(fā)揮出AR和智能云的優(yōu)點(diǎn)。對此,提出以下設(shè)計(jì)改進(jìn)方向: 1) 因模塊化對象的相似度較高,需增加更多采樣圖片,充實(shí)特征庫,穩(wěn)定測試數(shù)據(jù),提高軟件辨識的準(zhǔn)確度; 2) 針對模塊印刷電路板的不同布局,增加更多電路元器件的特征點(diǎn),使軟件能直接細(xì)化和排錯(cuò),AR圖像化印刷電路板上的明顯不同; 3) 圖片應(yīng)避免出現(xiàn)大面積色值相近的相鄰色塊,否則經(jīng)灰度處理之后整張圖都會變模糊,撞色的圖片設(shè)計(jì)能使灰度處理之后的識別圖仍保有清晰的分界線; 4) 顯示的物體距離鏡頭中識別圖的中心太遠(yuǎn),若物體能正好在識別圖特征點(diǎn)分布較多、較均勻的位置,且貼近識別圖,則能很好地解決抖動(dòng)問題。 本文所述模塊識別軟件有助于提高模塊制作和調(diào)試人員的工作效率和準(zhǔn)確性,在模塊制造和調(diào)試作業(yè)中快速查詢到相應(yīng)模塊的型號和功能。采用AR設(shè)備可完全做到仿真辨識檢測,對于一些具有高度相似性或高復(fù)雜度特性的模塊產(chǎn)品而言,這種AR系統(tǒng)能提供更具體的對比參數(shù)和更便捷的工作體驗(yàn)。 隨著科技的不斷進(jìn)步,AR技術(shù)將在未來的制造業(yè)領(lǐng)域得到廣泛應(yīng)用,本文的研究可為AR技術(shù)在船舶領(lǐng)域的應(yīng)用提供參考。2.2 創(chuàng)建軟件應(yīng)用
2.3 導(dǎo)入SDK
2.4 場景設(shè)置
2.5 Unity3D應(yīng)用設(shè)置
2.6 接口說明
> call);
> call);
2.7 軟件缺陷
2.8 改進(jìn)方向
3 結(jié) 語