ARの使い道が思いつかない人へ　ARとはセンシングであるという考え方と、具体例 ARで紙を切り取る

#ARの使い道の考え方と、その具体例です。
具体例では、画像を登録して、現実の紙からその部分を切り取ります。
<img src=https://user-images.githubusercontent.com/23278992/124336683-e158a000-dbd9-11eb-8a00-5c2943daefcb.gif>
#ARってなかなか使い道がわからない
ARって楽しそうなものの、イマイチどういうアプリケーションに使えばいいかわからない。

#現実のものとどうインタラクトするかが鍵
リアリティを拡張するもの、ということは、ベースとなるリアルの理解が鍵となります。


#ARはセンシングである

現実を拡張するためには、現実を理解する必要があります。

ARとは、コンテンツを表示するもの、というのに加えて、
「センシングである」
というところから考えてみます。

ARコンテンツの配置は、あくまで現実を拡張する手段の一つであって、
コンテンツを現実のどこに配置するか、それによって何の現実を拡張しているか、がARの目的を形作るのではないでしょうか。

となると、**まずは現実をどのように認識するのか、というセンシングの部分が重要になります**。

ARKitはワールドトラッキングやフェイストラッキングから始まり、最近ではLidarによるオブジェクト理解など、
現実をセンサーによって把握する部分が鍵となっています。

#現実から考えよう

バーチャルコンテンツではなく、まずは理解すべき現実から考えてみましょう。
あなたの周りにはどんな現実のものがありますか？
それは、コンピュータによってどのようにセンシングして理解することが可能でしょうか？
最後に、その現実をどのように拡張すれば、面白い効果、便利な効果が得られるでしょうか？

#例
画像を登録して、現実の紙からその部分を切り取ります。

私たちの周りには、様々な画像があります。
雑誌の表紙、ポスター、広告。

そこには、多くの人の顔が写っています。

幸い、機械学習のおかげで、画像を認識し、顔を検出することができます。
ここがセンシングの部分です。

顔という現実をARに与え、拡張してみましょう。

拡張は、何も加えることだけではありません。
それを無くす（減らす）ことも拡張と言えます。

把握した顔を、切り取って無くしてみましょう。
まずは顔の把握フェーズです。

Visionで、カメラフレームから顔を検出して、顔だけの画像を作成します。

```swift
let request = VNDetectFaceRectanglesRequest()
let pixelBuffer = frame.capturedImage
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer)
do {
    try handler.perform([self.qualityRequest])
    guard let result = request?.results?.first as? VNFaceObservation else { return }
        
    let boundingBox = result.boundingBox
    let ciImage = CIImage(cvImageBuffer: pixelBuffer)
    let faceRect = VNImageRectForNormalizedRect((boundingBox),Int(ciImage.extent.size.width), Int(ciImage.extent.size.height))
    let croppedImage = ciImage.cropped(to: faceRect) 
} catch let error {
    print(error)
}
```

作成した顔の画像をARReferenceImageとして登録します。
これによって、ARKitは顔の画像を認識し、画像アンカーを作成してコンテンツを配置できるようになります。

```swift
guard let cgImage = context.createCGImage(croppedImage, from: croppedImage.extent),
      let imageData = UIImage(cgImage: cgImage).pngData(),
      let url = try? FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("temp.png"),
      ((try? imageData.write(to: url)) != nil) else {isRequesting = false; return}
            
let referenceImage = ARReferenceImage(cgImage, orientation: .up, physicalWidth: 0.1)
let config = ARImageTrackingConfiguration()
config.trackingImages = [referenceImage]
arView.session.run(config, options: [.removeExistingAnchors])
```

ARKitで登録した顔を認識し、そこに顔画像を貼り付けたボックスを置いて、移動させることで切り抜きに見せます。

```swift
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
    for anchor in anchors {
        guard let imageAnchor = anchor as? ARImageAnchor else {continue}
        Timer.scheduledTimer(withTimeInterval: 3, repeats: false) { timer in
            let anchorEntity = AnchorEntity(anchor: imageAnchor)
            var material = UnlitMaterial(color: .white)
            let texture = try? TextureResource.load(contentsOf: self.url!)
            material.baseColor = MaterialColorParameter.texture(texture!)
            let faceBox = ModelEntity(mesh: .generateBox(size: [0.1,0.02,Float(imageAnchor.referenceImage.physicalSize.height)]), materials: [material])
                
            let croppedBox = ModelEntity(mesh: .generateBox(size: [0.1,0.02,Float(imageAnchor.referenceImage.physicalSize.height)]), materials: [SimpleMaterial(color: .black, isMetallic: true)])
            croppedBox.position = [0,-0.01,0]
            anchorEntity.addChild(croppedBox)
            anchorEntity.addChild(faceBox)
            self.arView.scene.addAnchor(anchorEntity)
            faceBox.move(to: Transform(translation:[0,0,0.3]), relativeTo: faceBox, duration: 3, timingFunction: .easeInOut)
        }    
    }
}
```
<img src=https://user-images.githubusercontent.com/23278992/124336683-e158a000-dbd9-11eb-8a00-5c2943daefcb.gif>

#身の回りからはじめよう

あなたの周りにあるもので、コンピュータによって把握できるものはなんですか？
コンピュータはどのようにそれらのものを認識しますか？
そして、あなたはそれをどのように拡張できますか？

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)