iPhone Coding Notes

~我的iPhone程式筆記~

AR工具系列 I:Camera

上次小秀了一段擴增實境的影片,發現大家好像對這主題很有興趣。所以打算規劃一系列的AR教學,讓大家能夠輕鬆入門。

Argumented Reality,簡稱AR,中文翻譯為擴增實境。和虛擬實境不同的地方在於,虛擬實境是在螢幕上呈現一個完全由軟體建構出來的世界。而擴增實境則是在螢幕顯示的真實世界上加入一些虛擬的資訊。舉個簡單的例子,如果各位有個二三十歳以上,應該看過七龍珠這個漫畫或卡通。裡面很多人都會在左眼或右眼掛上一個可以顯示對方戰鬥力的儀器,這個儀器的背景是真實世界,但是當它對準某個敵人時,則會顯示對方的戰鬥力和其它數值(如果戰鬥力太高,還會爆炸XD)。

除了這個,像是魔鬼終結者那些機器人看到的影像,或者戰鬥機飛行員的螢幕畫面,這些都可以算是一種擴增實境。

簡易的擴增實境,只要有個攝影機顯示真實畫面,然後利用程式把一些資訊疊在這個畫面上就好了。但如果要更有實用價值,則必需考慮到攝影機與真實世界的相對位置。

判斷攝影機與真實世界相對位置的方法,簡單來說可以分成兩大類:

  1. 影像辨識處理:這種方法是把攝影機看到的影像抓進程式裡做計算,每一個frame算一次,藉以判別現在相機和真實世界的位置。它的好處是,只要有相機就可以計算,而且非常精確。缺點在於,像iPhone這種CPU不是很強的機器,每計算一個frame需要的時間很長,結果實際上看起來就有點lag。此外,為了判別相機的相對移動,通常還需要一個參考用的圖案。程式根據該圖示在畫面中的相對位置,才能計算出相機的移動,實用性就大大被限制住了。上面的影片是ARToolkit這套開發工具在iPhone上的實測畫面。可以看到虛擬的畫面很精準的疊在真實世界中的圖示上,只是說畫面實在有些lag。當然這個問題隨著iPhone硬體的更新,會逐漸好轉。這一段影片就比較神奇了,這是由國外大學開發的一個稱為Parallel Tracking and Mapping的技術。基本上它也是影像處理,只是它不需要額外的參考圖示,程式本身會去找出畫面中屬於平面的部份,再進行相對位置的計算。他們有開放Source Code,如果有興趣可以去看看。不過code本身不是寫給iPhone用的,而且他們也明講code仍屬開發階段。我抓下來看過了,光要了解內容可能就要不少時間,如果還要讓iPhone可以用,那就….囧囧囧
  2. 姿態位置感測器:和上述方法不同,這種方法主要利用的是其它搭配的姿態感測器,用來判斷攝影機與真實世界的相對位置。以iPhone為例,GPS可以用來得知攝影機在地圖上的哪個位置,磁力計則提供水平旋轉時的角度,加速度計則用來計算攝影機的仰角或傾角。此種方法因為不需要影像判識,所以比較不會受限於CPU的能力。相反的,因為仰賴的是其它週邊的感測器,因此這些感測器的精確度就影響了整體定位上的表現。在iPhone上利用這些感測器作為攝影機姿態的判別,精確度確實是比用影像判識的方法差上一截。如果各位手上有iPhone 3GS,可以試試看。把它水平的放在桌上,打開內建的指南針程式,待它靜止後,記住北方的方向。接著,快速的把iPhone水平旋轉90或180度,然後….指南針的北方和剛剛一樣嗎? 囧

上面說了這麼多,除了簡單介紹一下擴增實境是幹什麼的外,主要是要充版面(誤)。好啦~開玩笑的。從上面的簡介可以知道,擴增實境的重點,就是把實際畫面呈現在螢幕上,並把虛擬物件疊在畫面上。所以今天就來說明一下在iPhone上要如何打開攝影機,並把物件疊在上面。

在iPhone上要開啟攝影機,我們要使用的類別是UIImagePickerController,相關程式碼如下:

UIImagePickerController* imagePicker =
[[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.navigationBarHidden = YES;
imagePicker.toolbarHidden = YES;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.showsCameraControls = NO;
imagePicker.cameraOverlayView = the view you want to attach;

首先先建立一個UIIMagePickerController的物件,接著把delegate指到你想指的地方,然後如果不想要navigationbar和toolbar的話,記得把它們關掉。在sourceType的部份,設定為IImagePickerControllerSourceTypeCamera,因為UIImagePickerController除了提供相機供能外,相片圖庫也是由它提供。接著則是把最底下有快門按鈕的工具列也關掉。最後最重要的一件事,把想要疊在螢幕上的物件(必須為UIView)設定給cameraOverlayView,這樣該物件就會出現在攝影機的畫面上了。
另外,因為剛剛把相機底下含快門按鈕的工具列給關了,所以畫面顯示的時候,底下會留下一段黑色的橫條,不是很好看。所以我們要把相機顯示的畫面放大一點,讓它填滿整個螢幕。

float bandWidth = 54;
float screenHeight = 480;
float zoomFactor = screenHeight / (screenHeight - bandWidth);

imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, zoomFactor, zoomFactor);

工具列的高度大約是54pixel,所以把相機畫面的寬和高各放大約1.13倍,就會填滿整個螢幕了。

最後,我們要把剛剛建立的UIImagePickerController物件叫出來。如果剛剛的UIImagePickerController是寫在某個UIViewController裡面,那麼只要把UIImagePickerController用modal view的方式叫出來就可以了。

[self presentModalViewController:imagePicker animated:NO];

OK!大功告成,這次就先講到這裡囉~

(咦?沒了?教學的部份有點短說@@還好前面有寫些東西充版面XD…)

32 Responses to AR工具系列 I:Camera

  1. will424 2010/06/06 at 14:02:22

    太感謝你了版主!!!!!! (跪)
    自從看你的部落格到現在~ 每篇文章我都感動到想哭不誇張XD
    真的是太感謝你了!!!

  2. Saicsw 2010/06/28 at 09:00:11

    Hello,

    我好喜歡你的文章,請問可以交個朋友嗎???

    • bonjouryentinglai 2010/06/28 at 09:23:02

      OK啊~已寄msn給您囉~

      • phenix 2010/07/27 at 00:43:08

        您好,我也想認識您,因為我是打算做AR研究的大學生,目前全部都是自己在摸索,不知道國內有哪位教授在做,希望可以交個朋友

  3. bonjouryentinglai 2010/07/27 at 09:34:28

    phenix :

    您好,我也想認識您,因為我是打算做AR研究的大學生,目前全部都是自己在摸索,不知道國內有哪位教授在做,希望可以交個朋友

    大學就在學AR啊~真好真好。
    已經寄msn到您信箱囉~

  4. N 2010/08/06 at 22:03:42

    版主你好,我本身也是大學生,專題需要做關於AR方面的研究

    但是苦苦找不到AR的相關範例來研究,好急= =

    希望版主能提供幾個簡單的範例供參考

    謝謝

    • bonjouryentinglai 2010/08/06 at 22:42:11

      怎麼這麼多大學生專題都是AR啊@@“
      其實AR不是我的專長,只是做好玩的。
      網路上搜尋Augmented Reality + iphone就有很多東西囉~~

      • N 2010/08/08 at 13:54:08

        但是網路上很多都太複雜了,想要先從基礎的小範例慢慢熟悉,希望大大能夠割愛 ORZ

        真的很想學QQ

  5. Will 2010/08/09 at 06:54:52

    N :
    但是網路上很多都太複雜了,想要先從基礎的小範例慢慢熟悉,希望大大能夠割愛 ORZ
    真的很想學QQ

    呵呵,我想您就別再為難版主囉,一來版主也說了這不是他得長處,二來可能範例中多少會牽涉到版主自己幫別人做的Case可能有的商業技術等等~

    其實他這幾篇文章幾乎已經都把必要的核心程式碼提供出來了,
    如果你全部把他們練習熟,加上本身如果對 Objective-C 跟 iPhone 開發有做過功課跟努力,應該是OK的! 可以多從書本跟網路去搜尋料,也可以把你練習過程中遇到的問在這邊貼出來~ 可能會比你只拿到範例,幫助來得大囉!

    AR目前網路上幾乎都是原文的資料比較多,也有提供Open Source Code 可以下載,你可以GOOGLE 搜尋 “iPhoneARKit” ,這個範例跟版主作的Demo很類似~ 提供你參考囉!

    • 2010/08/09 at 12:59:44

      嗯,只是我從網路上找的一些資料慢慢拼湊,還是有一些錯誤,但是不是很瞭解為什麼錯,所以想從簡單範例來參考起

      大大能講解 在版主”我也來AR一下“ 這篇文章中的效果是如何製作的呢?

      主要是想了解如何利用方位來顯示出 一個一個的標籤

      • bonjouryentinglai 2010/08/09 at 13:04:46

        Hello~不知道你所說的錯誤是錯在什麼地方呢?
        至於影片中的效果,首先你得會OpenGLES,然後blender製作SIO2使用的場景。最後把iPhone的攝影機打開,把場景疊上去,使用iphone的磁力計和加速度計去判斷iphone的姿態,調整場景裡的視角,大概就是這樣囉~
        最近比較忙,我看看八月有沒有空稍微簡介一下那個app吧。。。。

  6. 2010/08/09 at 13:10:49

    錯的地方應該是我本身不夠熟練… 請問OPEN GLES 與blender入門該從哪裡下手呢?

    感謝板大的回答 麻煩你了

  7. 2010/08/09 at 13:27:42

    :
    錯的地方應該是我本身不夠熟練… 請問OPEN GLES 與blender入門該從哪裡下手呢?
    感謝板大的回答 麻煩你了

    不太了解 opengles 主要的功能是作用在什麼地方,創建一個新專案都會看到一個立方體

    為什麼需要用到呢?

  8. 阿福 2010/09/07 at 13:19:28

    你好啊!! 想問個小問題 如果我把AR功能處理好了!!
    但是要把 GPS 功能整合進去 目前我只找到這一個範例
    http://www.theiphonedev.com/SourceCode/GPS/tabid/167/Default.aspx

    不知道有沒參有考資料或書籍?? 或著能跟你交換MSN 呢?? 謝謝

    • bonjouryentinglai 2010/09/07 at 20:39:17

      其實坊間書店裡的書,找一本自己看的順眼的中文工具書,應該都會有教怎麼使用GPS功能。內容大同小異,不會太困難的^^

  9. 大瘋 2010/09/28 at 12:23:12

    很有啓發性的一篇短文

    謝謝板主

  10. bg 2010/10/22 at 02:20:00

    我也是研究AR的,目前遇到一些瓶頸可以AR出東西以及GPS定位,
    但是要結合一些互動還是有問題,希望能與版主交換MSN多多交流。

  11. Ileen 2010/11/02 at 23:32:06

    版大您好!
    我也是在研究AR的相關應用,雖然跟版大您不一樣我是寫於android上,
    這邊遇到一寫問題想要請教您的觀念。我看完您的文章和給其他人的意見,我大概作了一個整理

    這擴增實境部分,是不是像先建立出一個場景,然後紛紛製作出那些標籤將它們放至於空間的各個座標位置,而場景是用camera把場景疊在上頭,就像場景的背景圖,然後再藉由視角來看到目前可視的範圍中的標籤這樣?

    那這樣推測沒錯的話,我建立了一個OpenGL ES 的四方形圖,但是我應該要怎麼作才有辦法把它變得像一個物件那樣,可以產生touch事件呢?我目前就卡這部份

    不好意思丟了這麼多不成熟的問題,方便的話請您不嗇指教了,謝謝

    • bonjouryentinglai 2010/11/03 at 11:15:08

      Hello,前半段你說的沒錯,我的demo影片很偷懶,先把場景和標籤做好,再由OpenGL調整視角去看而已。

      至於touch事件嘛~如果你從頭到尾都是用OpenGL ES自己寫的,那要做的事可真不少,因為我自己是用SIO2 engine去處理的,touch event他都寫好了,所以我也沒辦法幫你囉~~

      • Ellis 2011/01/21 at 15:57:17

        請問版大 SIO2 的engine也能拿來Android使用嗎?
        小弟目前也在研究Android的AR,
        目前卡在如何在攝影機畫面上顯示標籤,
        煩請大大指導了!

      • bonjouryentinglai 2011/01/22 at 09:06:07

        之前看SIO2作者是說會有Android版,不過到現在都還沒看到就是了。

    • s5346 2011/02/22 at 11:01:08

      我的做法是….建一個UIViewController
      將裡面的self.view = 妳建openGLES的view
      就可以將touch事件實現了

  12. 2010/12/08 at 15:19:59

    我想請問妳問題 可以給我你的MSN嗎~? 3Q

  13. en 2011/02/23 at 16:47:05

    板主最近還有空在更新網站嘛@@?
    我大學專題也是在iPhone上面開發AR
    但幾乎沒有頭緒
    想請問能不能家板主的msn問些問題呢?
    謝謝!

    • bonjouryentinglai 2011/03/14 at 14:08:38

      我剛忙完結婚和蜜月旅行,最近才比較有空。
      AR我不是專家,專題要的東西其實網路找就會有了,我也都只是網路上看來的。
      有什麼問題再跟我說吧 ~
      ganymede0123@gmail.com

發表迴響

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

連結到 %s

Follow

Get every new post delivered to your Inbox.