是時候來點AR

原文連接:cloud.tencent.com/developer/a…html

首先ar是什麼?java

簡單的來港,ar就是加強現實技術,它是一種將真實世界信息和虛擬世界信息「無縫」集成的新技術,是把本來在現實世界的必定時間空間範圍內很難體驗到的實體信息(視覺信息,聲音,味道,觸覺等),經過電腦等科學技術,模擬仿真後再疊加,將虛擬的信息應用到真實世界,被人類感官所感知,從而達到超越現實的感官體驗。真實的環境和虛擬的物體實時地疊加到了同一個畫面或空間同時存在。android

那麼arcore,就好理解了,嗯,是某個爲ar開發而實現的sdk,事實上ARCore 爲許多最受歡迎的開發環境提供了 SDK。 這些 SDK 爲運動跟蹤、環境理解和光估測等全部必需 AR 功能提供了原生 API。 您能夠利用這些功能構建全新的 AR 體驗,或經過 AR 功能加強現有應用。web

說的這麼好聽,來點實際的,搞一個demo看看。數據庫

添加了一個虛擬的獅子

如上圖所示,這個獅子明顯不是真實世界的動物,對比之下,這個狗狗就是真實世界中的事物了,那麼言外之意就是這個獅子的引入,加強了你對這個真實世界的感官,不是嗎?bash

1、如何一步步來搞起ar

一、首先,你須要將你的android studio升級到3.1session

二、其次,若是你想在真機調試的話,(廢話,不用真機,你如何拿去給你的小夥伴裝逼),你須要保證你的機器在一下機型之中->支持的設備app

若是不在,你將退而求其次,使用模擬器也是能夠玩的。ide

二,sdk的導入及xml文件的配置

1,xml文件的配置,很明顯攝像頭權限是必不可少的,其次還須要一個meta-data,value取值可選必須,這個值依據與你的應用是否必須啓用arcore,一般咱們選擇可選工具

<!-- AR Optional apps must declare minSdkVersion ≥ 14 -->
<uses-sdk android:minSdkVersion="14" />

<uses-permission android:name="android.permission.CAMERA" />
…

<application>
    <meta-data android:name="com.google.ar.core" android:value="optional" />
    …
</application>複製代碼

二、build.gradle修改

android {
    …
    defaultConfig {
        // Sceneform requires minSdkVersion >= 24.
        minSdkVersion 24
        …
    }
    // Sceneform libraries use language constructs from Java 8.
    // Add these compile options if targeting minSdkVersion < 26.
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    …
    // Provides ARCore Session and related resources.
    implementation 'com.google.ar:core:1.7.0'

    // Provides ArFragment, and other UX resources.
    implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.7.0'

    // Alternatively, use ArSceneView without the UX dependency.
    implementation 'com.google.ar.sceneform:core:1.7.0'
}複製代碼

注意,必需要java8.0才能夠跑起來,由於arcore依賴了java8的一些特性,不然會編譯失敗。

三,開始裝逼

一、圖像加強

這裏官方給到了一個例子,就是一個地球圖片:

demo

在這個demo中,他們用這個地球圖片構建了一個數據庫,這個構建工具是arcoreimg,簡單的比方就是這個工具會提取這張圖片的特徵信息,而後將其存放在數據庫中。

好了,數據庫構建好以後,啓動app,攝像頭去掃描這張圖片,隨後,這張圖片就被捕捉到了,而後就接下來就是給圖片四周加了個相框。效果以下所示:

找到圖像而且給這張圖像加了相框

好了,官方的demo給咱們展現了圖像加強的一個demo效果就是如此的,請注意,這個過程是離線的,並不須要聯網完成。

那麼,這個捕捉圖像的過程是怎麼作的,咱們一步步來分析:

  • 數據庫的建立

數據庫建立是使用arcoreimg這個工具建立的,命令:

./arcoreimg build-db --input_images_directory=/path/to/images \
                       --output_db_path=/path/to/myimages.imgdb複製代碼

具體的能夠看連接介紹,使用起來很是方便,可是任然須要注意兩點;

  1. 圖像的評分很重要,Google建議使用得分至少爲 75的圖像。怎麼測評得分,相信你能夠輕鬆在連接中找到。
  2. 每一個圖像數據庫能夠存儲最多 1000 張參考圖像的特徵點信息
  3. 圖像的分辨率至少應爲 300 x 300 像素

更多的注意事項請參考這裏。以上只是我實驗的過程當中遇到的問題,剛好碰到的點。

固然,你徹底能夠在現有的圖像數據庫的基礎上添加一個新的圖像數據:

Bitmap bitmap;
try (InputStream inputStream = getAssets().open("dog.jpg")) {
  bitmap = BitmapFactory.decodeStream(inputStream);
} catch (IOException e) {
  Log.e(TAG, "I/O exception loading augmented image bitmap.", e);
}
int index = imageDatabase.addImage("dog", bitmap, imageWidthInMeters);複製代碼
  • 圖像追蹤

在demo中,咱們能夠看到這樣一句代碼,他的意思就是把咱們的數據庫和ar session相關聯起來。

config.setAugmentedImageDatabase(imageDatabase);
session.configure(config);複製代碼

那麼,咱們不由也 要問一問,這個ar session是什麼呢,毫無疑問,最簡單的方式,莫過於看源碼了,如下就是建立session的全過程,這個是BaseArFragment中的一個片斷。能夠看到他封裝了權限的檢查,arcore環境的檢查,因此,Google建議先手使用ArFragment來玩arcore,這樣會簡單點,你也只須要關心本身的業務邏輯,神馬權限檢查,可用性檢查都通通交給他來作。

建立session

好,session和特徵圖像數據庫掛鉤以後:

ARCore 經過將攝像頭圖像中的特徵點匹配圖像數據庫中的特徵點來尋找圖像,

每一幀去檢查有沒有新的augmentImage,PAUSED表示發現了一個augmentImage,接下來的幀會不停跟蹤這個augmentImage,好比此時你就能夠給scene中添加相框了,添加相框也要相對一個augmentImage,嗯,就是你此時監測到的augmentImage,能夠看看代碼,相框是怎麼添加的

你會發現,你把攝像圖移開,而後等會移過去,即使那個圖像不在了,相框依然在哪裏,好像是記住了那個空間位置同樣,這是爲何呢?

答案是:雲錨點,我猜的,哈哈~~,由於我目前只能找到這個解釋,單確定不許,由於這裏彷佛並無將這個上圖紅線的位置交給雲吧,充其量只能算是僞雲錨點,本地的空間位置信息應該是有的。

四,至此,這個圖像加強的案例算是已經玩通玩懂了,基於這個點,你能玩寫什麼花樣呢?

我這裏將下我本身的一個應用吧,算是給本身學習的一個交代:

我作了一個掃王者榮耀英雄查攻略的app,具體實施的步驟是:

一、到官網去把英雄的圖片都下載下來,我使用的是爬蟲,由於仍是有點多的,代碼就懶得給了,不難,網上也有一大堆爬網站圖片的,略微改改便可。

二、使用arcoreimg工具將這些英雄圖片構建成數據庫,在構建以前,你能夠用arcoreimg檢查下圖片質量,發現,會報錯,由於你違背了,圖片至少300*300像素的規則,怎麼辦,固然是藉助工具進行圖片放大了,我用的工具是photozoom,mac試用版,有水印,略不爽,可是能用。

三、咱們發現生成數據庫的同時,會生成一個

在結合這個index

咱們就輕易的知道了,目前掃到的是哪一個英雄了,拿到則個id,就能夠去查這個英雄的攻略啦~~

相關文章
相關標籤/搜索