淺談Intel RealSense 3D攝影機之應用與開發 / 嶄新角度 全新世界
還記得Windows 10上市記者會中的一個橋段,講者一個眼神就讓系統自動登入,還跟你說你好(Hello),聰明的讀者肯定知道這件事肯定不單純,原來又是WinTel霸主聯盟下的科技產物。
Win10系統中所搭載Windows Hello登入技術,就是結合Intel RealSense 3D攝影機,所開發的生物辨識系統,讓電腦認識主人已不再是難事,說不定在未來人人都是鋼鐵人,有著幽默風趣的AI管家賈維斯(JARVIS),可以跟主人對話、3D投影、體感操作。
如今,筆者藉著搭載Intel RealSense 3D攝影機的ASUS G771JM筆電,來為各位讀者試試Windows Hello,並且聊聊RealSense的原理,以及其可達到的手勢/人臉辨識、語音、背景移除與物件追蹤等應用,這也是Intel提供SDK的目的「WHAT WILL YOU DEVELOP?」,感知互動、感官延伸就從了解Intel RealSense開始。
Windows跟你說Hello
Windows Hello是一個全新的Windows 10裝置登入的方式,Windows Hello借助Intel RealSense 3D攝影機,讓電腦能夠辨識出使用者臉部的生物特徵,如此一來登入裝置就無需再輸入密碼。
換言之,只要具備Intel RealSense 3D攝影機以及Windows 10的作業系統,就能使用這功能,筆者本次測設的設備是使用,ASUS ROG G771JM筆記型電腦,除此之外還有HP、Dell與Lenovo等廠家推出具有此技術之產品。
Windows Hello的設定並不會太麻煩,只要按下左下方失而復得的[開始]按鈕,接著選取 [設定]→ [帳戶]→[登入選項],就能找到Windows Hello的設定,設定時系統會要求先定義一組PIN碼,當作忘記密碼或者辨識失效時,最後的登入手段,當然若有它人想要,新增、修改人臉辨識的機制時,也會要求先輸入PIN碼才能使用,因此不用擔心使用Windows Hello之後,帳戶的安全性會降低。
除了生物特徵辨識之外,若裝置有指紋辨識、虹膜辨識等技術,同樣能使用Windows Hello的自動登入功能;筆者相當喜歡Windows Hello這樣的功能,一來新奇、二來便利,對於每次開啟電腦工作時,懶得輸入密碼的用戶來說,這真的再方便不過。
既然,Intel RealSense 3D攝影機能夠讓Windows 10認識主人,那它還有什麼能耐?就讓我們先來了解,Intel RealSense 3D攝影機的硬體與原理。
↑ 機器開機後,Windows Hello就會開始尋找您…,只要坐在電腦前面,面向鏡頭一眨眼的時間,就能認出您並且登入。
↑ 若電腦中有多個使用者也沒問題,它會自動辨認。
↑ 若要讓電腦認識你,可以在[設定]→ [帳戶]→[登入選項]中找到Windows Hello的設定選項。
↑ 若想提升Windows Hello的準確性,可以多讓它認識你幾次,像是有沒有帶眼鏡、化妝、假髮等不同的LOOK的時候,都使用這功能掃描臉部一遍。
↑ 掃描過程只要看著鏡頭就可以了,操作相當簡單而且非常好用的功能。
Intel RealSense 3D攝影機原理
若各位讀者對Intel RealSense 3D攝影機有興趣,可以造訪「Intel開發者園地」就能取得更多資料。目前,Intel RealSense 3D攝影機可以分為兩種版本:1. 隨著筆記型電腦、AIO等設備出貨的產品、2. 單獨販售的Intel RealSense Developer Kit,這兩種在型號上都命名為「F200」。
F200擁有三種類型的鏡頭:1. 傳統RGB鏡頭、2. 紅外線鏡頭與3. 紅外線雷射投影機。傳統RGB鏡頭,主要是拍下鏡頭前方的景物,這影像是2D平面之影像,不具備深度等3D要素,而若想以2D影像換算出3D空間,會遇到效率不彰、結果差強人意的問題;因此結合紅外線雷射投影機與紅外線鏡頭,就能夠偵測攝影機前方之紅外線反射量,有了這量度就能了解一個重要的訊息「深度」。
↑ F200的內部構造,有三顆鏡頭與影像處理晶片。
2D平面的世界只有X與Y,為了達到3D的立體的效果,因此多加了Z軸。就前陣子流行的3D電影來說,最簡單的3D電影拍攝,就是透過兩組攝影機,以精算過的角度並排拍攝,因為兩個影像角度不同的關係,在視覺上存在著「視差」這因素,就能讓觀眾看到極為真實的3D電影。
反過來若要讓電腦得到真實世界的資訊,除了XY平面的RGB影像之外,就會需要深度的感測,也就是F200中的第二顆與第三顆鏡頭所辦到的事,而有了這些資訊,不論要抓取更準確的人臉特徵、手勢辨識、背景移除、物件追蹤就不再是難事。
從「Intel RealSense SDK Design Guidelines F200 v2」中,可以得知F200詳細的硬體規格,傳統RGB鏡頭(Color Camera)具備1080p(2M)@30FPS解析度、16:9之影像比例,而紅外線鏡頭(Depth {IR} Camera)則提供640 x 480(VGA)解析度、4:3之影像比例,而實際的感測有效範圍,只有0.2m~1.2m之間,想必是為了縮小體積所致,若是Developer Kit的版本,有效範圍肯定會再好一些,手勢偵測範圍在VGA模式中,有著20~60cm的使用距離限制,3D臉部偵測則是限制在35~70cm之間。
聰明的讀者,肯定已經聯想到微軟XBOX Kinect這套體感設備,的確Intel RealSense 3D攝影機與微軟XBOX Kinect的原理相同,但面對的使用模式卻較為不同,Intel RealSense 3D攝影機聚焦於人臉、手勢,可見其捕捉空間定義在人的上半身,而微軟XBOX Kinect則是要補捉整個人體的動態,除此之外兩者體積差異也頗大,因此並不存在相互競爭等因素,筆者也樂觀其成這3D攝影機的技術,能普及在各大裝置中,並且讓辨識、追蹤變得更精準,如此一來才能迎接下一代操作體驗。
↑ Developer Kit的零售版F200。
↑ 使用F200時有個感測空間的限制,因此在使用或者開發應用時,要注意這空間限制的問題。
Intel RealSense應用App介紹
既然有這麼好玩的3D攝影機,肯定要試著探索與嘗試各種可能,在Google中搜尋「Intel RealSense」可以找到介紹網頁,其中有個APPShowcase的頁面,這裡頭就有好幾款支援Intel RealSense技術的App,讓用戶可以自行下載,並且安裝在電腦中使用。
筆者就挑了幾個比較有趣的App來與各位分享,首先是「Scratch-圖形化語言程式」,這時一個線上的編譯平台,讓用戶可以透過圖形化的語意,來編寫程式、遊戲、動畫繪本等等,或許讀者肯定認為“寫程式”是有一定難度的事情,但在Scratch平台上,讓筆者只花了幾分鐘的時間,就學會該如何使用Scratch來創造,這是筆者挑選這款App的主要原因。
此外,還有「3DMe – 3D人物臉部掃描」以及「Space Astro Blaster – 體感遊戲」,共計三款App來與各位分享,Intel RealSense的應用。
Scratch-圖形化語言程式
Scratch是一套線上編譯的平台,只需要輸入scratch.mit.edu這網址就能使用,我們間先來試試要如何使用Scratch,來製作一個簡單的程式,在Scratch的編輯介面中大致可分為左右兩欄,左手邊上方是執行預覽、下方則是素材腳色的視窗,而右手邊則是編輯的範圍,分為程式、造型與音效等頁籤。
我們先來簡單寫一些程式,程式的開頭需使用[事件]→[當綠色旗子被點一下],當作程式的起始點,接著就能在擺上[動作]、[外觀]、[聲音]、[控制]…等指令,也能加入變數、迴圈等元素,如此一來最簡單的小程式就搞定了。在Scratch中,也能瀏覽已經製作完畢的計畫,藉此學習Scratch的使用技巧。
若要在Scratch中使用Intel RealSense的功能,必須先安裝「Intel RealSense Experience for Web Browsers」插件,這在Intel Scratch的介紹網頁中可以找到,安裝後就可以直接使用已經建立好的Samples,來學習如何抓取手勢、人臉等骨架的指令。
Intel RealSense專屬的Scratch Blocks,有著Face visible、Any Hand visible…等專用指令,讓用戶可以在Scratch平台上,開發體感應用。
筆者就舉Full Hand這個Sample來介紹,Full Hand是使用22個點,描繪出左手與右手的骨架,我們就依據Scratch的語法來檢視。
首先,這個Sample中新增了兩個腳色,分別是joint RightHand與joint LeftHand的原點圖形,因為Scratch這套平台是針對專案內的腳色,進行程式的撰寫,因此為了能夠讓Full Hand能辨識出,左手與右手則需要建立兩個腳色,而這兩個腳色的程式碼相同,只是把左手的程式段落改為右手,因此筆者就只列一隻手的程式碼。
此外,程式還建立了左手與右手的index變數,用來指定(x, y)的位置,如此一來當index從1~22跑完一遍,就能將手掌的輪廓給表現出來,接著就來看看程式碼的段落。
程式碼#1
0 | when flag clicked //這是Scratch程式開始的觸發
1 | show
2 | set i to -1 //初始變數為-1
3 | repeat(22) { //重複以下指令22次
4 | change i by 1 //等同++i
5 | create clone of myself} //複製自己這個腳色
6 | hide
程式碼#2
0 | when I start as a clone //當自身複製時執行以下程式碼,接著程式碼#1第6行開始
1 | set index to i //將index的值改為i
2 | forever { //永久執行以下程式碼
3 | if Left Hand visible? then { //判斷左手是否可見?
4 | show
5 | set x to X Position of Left Hand index //將這腳色的x座標,改為Left Hand(index) X座標數值
6 | set y to Y Position of Left Hand index //將這腳色的y座標,改為Left Hand(index) Y座標數值
7 | else
8 | hide}} //若條件不符就隱藏
這兩段程式碼,筆者一開始讀也有點懵懵懂懂,在仔細敲過、看過一遍後,才漸漸明瞭其用意,首先第一段程式碼,是用來複製22個左手點的工作,也就是重複22次,每一次都讓i加1以及複製自己,這樣i會從0開始到21結束。
每當複製自己時,會接到第二段的程式碼開頭“when I start as a clone”,這時就將index的值改為i,並且永遠執行將腳色的x,y座標,改為Intel RealSense所回傳的X Position of Left Hand index的值,如此一來就能在預覽的視窗中,看見這些點排列出來的手部輪廓了。
筆者較不懂的是這段X Position of Left Hand index,這段是特別為RealSense所定義的Blocks指令,因此只要將index 0~21當作參數,丟給這指令就可以回傳偵測到的手部骨架座標。
筆者深信,上面這短短的一行指令,在背後Intel RealSense SDK中,肯定要寫個上千行,將紅外線鏡頭與傳統RGB鏡頭之影像結合,計算出手部的位置並計算出手掌骨骼的22個節點座標。
若是偵測臉部則會需要使用78個點來表示,而程式碼與手部偵測相同,只是指令換成Face的指令。根據這次的體驗,筆者相當喜歡Scratch這套高階程式語言,透過圖形化與更直覺的語意設計,讓普羅大眾都能自行創造出有趣的程式與遊戲。
↑ Scratch的開發畫面,像當有趣的圖像高階語言,讓用戶可以直接線上撰寫、執行。
↑ 在網站中也有好幾個已經開發好的RealSense應用,大家可以參考這些Sample的程式碼,來學習Scratch並且開發自己的程式。
3DMe – 3D人物臉部掃描
3DMe是由3D Systems公司所開發,運用Intel RealSense的臉部偵測繼續,將使用者的臉部特徵掃描後,自動建立出3D人像模型,並且提供訂購的服務,讓用戶可以自行掃描3D影像,並且自做出真實的人像公仔。
3DMe是免費的App應用,只是若要將自身的3D模型製作出來,則會需要69.96美金,人像公仔會是5.5吋的大小。再透過3DMe掃描臉部時,需要將頭髮往後梳,露出最完整的臉部表情,並且要在燈光充足的環境中使用,掃描時會提示使用者將臉部剛好塞滿掃描圈,接著會需要使用者將頭往右、左、上等三個方向緩慢的轉動,進行更完整的3D掃描動作,這個掃描過程僅需要10~20秒就能完工。
建立好的3DMe人像模型,也可以拍攝照片或者錄製影片與朋友分享。依筆者拙見,使若能在臉部特徵掃描的同時,將臉部的78個特徵點建立在模型中,肯定能讓臉部表情更生動,甚至在使用者準備購買自己的公仔時,還能調整臉部表情,甚至是依造自己的意思微整形一翻,這肯定會更有趣。
若各位手邊有搭載Intel RealSense的裝置,筆者相當建議試試這套App,好玩又有趣。
↑ 在3DMe當中可以挑選想要的人物模型進行臉部掃描,並且有公主跟王子兩個腳色喔!
↑ 臉部掃描時,會要求臉部左、右、上的轉動,目的就是要建立更準確的3D臉部模型。
↑ 掃描好的3D臉部模型,馬上就能套用在公仔人物上,相當有趣、又好玩的功能,若有想要自己的公仔,不妨可以試試這套。
Space Astro Blaster – 體感遊戲
Space Astro Blaster則是一套體感射擊遊戲,運用Intel RealSense的手部偵測來控制飛機,類似星際小蜜蜂的遊戲,只是從原本的2D變成3D遊戲,並且透過體感來控制飛機的操作。
這是相當典型的體感應用,但由於Intel RealSense的F200攝影機,其偵測範圍有限的情況下,很容易玩的太過激烈,而將手掌移出偵測範圍內,導致飛機無法控的問題。
筆者認為這是Intel RealSense與微軟XBOX Kinect最大的差異,Intel RealSense比較傾向於應用,像是臉部掃描、辨識、簡易的手勢判斷,而XBOX Kinect則是可以更精準的追蹤人體的骨架,並在遊戲的過程中跟上玩家的肢體節奏。
↑ Space Astro Blaster的玩法就是透過手來控制飛機的移動與攻擊。
↑ 但受限與感測空間的限制,玩這款遊戲時很容易就超出感測範圍,而讓飛機殞落Game Over。
啃資料Intel RealSense SDK
Software Development Kit翻成白話文就是“軟體開發工具組”,這可能是某平台、應用服務甚至是硬體等產品,其具備第三方開發的特質,就像是Intel所開發的RealSense 3D攝影機,為了加速市場的普及、教育、研究等目的,微軟於是公開了「Intel RealSense SDK」提供給任何人下載使用,透過SDK我們就能利用API(Application Programming Interface),進行調用RealSense 3D攝影機的影像、深度,並透過這組SDK來達到,臉部辨識、手勢偵測…等功能。
因此,在進行任何開發事宜時,應該先詳閱網上公開的說明書,於是各位可以連上Intel Developer Zone中,找到「Intel RealSense SDK」的免費下載連結,下載SDK必須填寫信箱、姓名、國家與手機等資訊,隨後就能收到專屬的下載連結,就可以開發自己的Intel RealSense應用。
閱讀RealSense SDK(簡稱RS SDK)的第一步,一定是要先了解SDK架構(圖RS SDK),才能了解程式的生命週期以及如何運用。RS SDK大致上可以分為四層,最上層是運用RS SDK所建立的應用、工具等等,第二層則是所支援的語言介面,像是C++、C#、Unity、Java、JavaScript…等語言,而在SDK界面下方則是SDK的運作核心、I/O模組、演算法等等。
若想要快速上手,筆者建議可以搜尋「Intel RealSense SDK 2015 R4 Documentation」,這份線上說明文件,有比較詳細的介紹RS SDK之應用的概念以及串流,再配合著RS SDK中提供的原始碼,進行學習會比較快上手RS SDK之應用。
開始撰寫的第一步「參考」
筆者依據公開的說明書,學習了些RS SDK開發之方法,而筆者連業餘程式設計師都稱不上,僅只有在求學階段中,學習了些程式語言、程式開發之皮毛,若有介紹不周之處還請各位見諒。
筆者使用微軟提供的免費IDE工具「Visual Studio Community 2015」來開發,程式語言筆者選擇比較易懂的「C#」來編寫。若是建置新的開發專案時,須將開發環境的目標Framework設定為[.NET Framework 4],並且找到RS SDK打包好的動態連結程式庫[libpxcclr.cs.dll],這個dll檔案可以在RS SDK目錄中的bin資料夾中找到,將[libpxcclr.cs.dll]複製到開發專案的目錄當中,並在[方案總管]中透過[加入參考]的選項,將[libpxcclr.cs.dll]加入至專案當中,並且再將[libpxccpp2c.dll]複製到專案[bin→Debug]目錄當中,如此一來在開發專案時,就能直接使用RS SDK提供的class。
緊接著,筆者就以RS SDK當中提供的「Hand Viewer(C#)」專案,來研究RS SDK的開發與應用。在像Sample Code學習時,一定要先找到程式的進入點,才能從頭開始閱讀程式碼,以C#的專案來說都是寫在[Program.cs]當中,找到Main() 方法這段就是用來要求RS SDK的PXCMSession權力,擁有Session才能使用SDK提供之I/O、演算法等Class。
接著,作者將建立好的session丟給了[HandsRecognition.cs]中所建立的MailForm。在HandsRecognition的Class當中,是用來實作手勢偵測以及圖像顯示的工作,其中 [SimplePipeline] 這Function,是整個程式的核心,透過PXCMSenseManager進行資料的處理,換句話說RS SDK除了運用Session之外,還有各種SenseManager介面,來處理不同的事情。
簡而言之,RS SDK必須透過建立Session,取得裝置的使用權限,並透過SenseManager來處理各種事情,像是PXCMCaptureManager、pxcmStatus、PXCMHandModule…等等,進行手勢的捕捉、處理與顯示的動作,若要完全讀懂這些Code,以筆者目前的程式能力來看,可能要花上1個月以上的時間,但是截稿的壓力沒法給筆者這麼充裕的時間,若各位因為筆者的介紹,對Intel RealSense的開發有了興趣,不妨參考Sample程式的完整程式碼,從中更完整的了解RS SDK的開發與應用。
↑ 註冊好RS SDK後,就會收到專屬的下載連結,讓開發者能自行取用。
↑ RS SDK當中的Samples瀏覽器,有著所有RS能辦到的功能應用,對於開發者來說,透過閱讀程式碼來學習肯定是最快的一條路。
↑ Camera Explorer則可以搜尋以連接的RS裝置,並啟動Camera Viewer來觀看影像。
↑ 手勢偵測與判斷的Sample,可以測試各種手勢的偵測功能。
↑ 利用3D攝影機進行自動去背的應用,或許日後拍攝影片,不用在上綠幕當去Key用的背板了,只要靠RS 3D攝影機即可。
↑ 人眼追蹤也可以辦到喔!透過臉部特徵定位,在依據眼球觀看的方向與角度推算。
ASUS ROG G771J電競筆電
此次非常感謝,華碩大力提供搭載Inte RealSense的ROG G771J電競筆電,讓筆者可以長時間研究與測試,提到華碩ROG產品肯定會是重武裝、高效能的代名詞,ASUS ROG G771J有著17.3吋的顯示螢幕,全鋁合金的金屬機身,整體相當紮實與牢固,但也使得這台筆電有著5.3公斤的體重。
雖然厚實的點,但也搭載了最強勁的Intel Core i7-4720HQ處理器,以及NVIDIA GeForce GTX 960M / 2GB獨立顯示卡,還有8GB記憶體,讓筆者在編譯專案時,也能非常順暢,用來當作RS SDK的開發平台相當適合;此外儲存方面更是採用SSD+HDD的雙儲存組合,128G SSD當作系統碟,加速整體系統速度,而1TB HDD則當作開發專案儲存的資料硬碟使用。
整體來看效能相當強勁,有著IPS FHD霧面螢幕,花時間研究一行一行的Code時,也不會太容易造成眼睛疲勞,螢幕的顏色也相當準確、漂亮、可視角度也相當大;提供全尺寸的鍵盤,配上紅色背光,整體質感相當不錯;在連接埠上也相當齊全,顯示輸出提供HDMI與mini Display Port,以及4組USB 3.0、SD讀卡機、RJ45網路孔等介面。
雖然ROG G771J定位為電競筆電,但其強大的效能與雙儲存的空間,用來當作工作平台、專案開發也非常適合,對筆者來說效能強的筆電,不僅止於電子競技,更是能提升工作效率的好夥伴。
↑ 沉穩、霸氣的ROG G771J電競筆電。
↑ 有著全尺寸的背光鍵盤,工作上更是方便。
↑ 底部也提供相當方便的擴充機制,換RAM或者SSD、HDD都沒問題。
總結
Intel RealSense 3D攝影機有著體積小的優勢,帶給電腦裝置一個新的使用模式,不論是Windows Hello般的人臉辨認的登入機制,或者是體感遊戲、3D掃描、物件追蹤等功能,再加上微軟提供SDK讓第三方開發者,可以自行發揮創意、想法,創造出更新奇的RealSense新應用。
雖然目前搭載RealSense 3D攝影機的筆電還不多,但若Intel肯投資、挾著Win 10的人臉登入功能,日後若是中高階的筆電,搭載RealSense 3D攝影機的機會就非常的高。此外,若RealSense 3D攝影機普及,日後網上登入帳號,可能也只要跟電腦Hello一下,就能依靠人臉辨識自動登入,筆者相當期待這一天的到來。
臉書留言