Upgrade to Pro — share decks privately, control downloads, hide ads and more …

作ってわかる!LiDARによるカメラの暗所オートフォーカス機能

tamaUdon
September 19, 2021

 作ってわかる!LiDARによるカメラの暗所オートフォーカス機能

こちらは iOSDC JAPAN 2021 のトーク資料です
*デモ動画はニコ生タイムシフト or 後日公開予定のYoutubeにてご確認ください

iPhone 12 Pro 以降に搭載されたLiDARスキャナにより、
ARだけでなく、カメラのオートフォーカス(以下AF)性能が飛躍的に向上しています。

特に、画像から距離情報を取り出すタイプのAFが苦手とする
暗所での撮影において、非常に高速なAFが実現されています。

この講演では、LiDARスキャナを利用したシンプルなAFと、
対象物の背景にぼかしを作る機能を盛り込んだカメラアプリを作成し、コードを中心に解説します。

AF自体はiOSに標準搭載されていますが、自分で作ってみることでAFとLiDARの理解を深めることができます。

この講演では、以下のトピックを中心にお話しします。
・各AF方式の簡単な説明
・暗所での性能比較 (iPhone12 Pro / iPhone11)
・LiDARによるオートフォーカス機能の実装方法
・動画によるデモ
・実装が困難だったところとその解決方法の提案

tamaUdon

September 19, 2021
Tweet

More Decks by tamaUdon

Other Decks in Programming

Transcript

  1. © ZOZO Technologies, Inc. 株式会社ZOZOテクノロジーズ
 計測プラットフォーム本部 フロントエンド部 iOSチーム
 寺田 めぐみ

    ( marica @tama_Ud )
 
 2019年7月〜バリスタからエンジニアに
 2021年4月ZZT中途入社
 画像処理, XRが好き
 
 2
  2. © ZOZO Technologies, Inc. 3 このトークの目的
 🎉
 ✔ LiDARスキャナについて楽しく学ぶ!
 ✔

    実装を通してLiDARスキャナの理解を深める
 ✔ オートフォーカスをざっくり理解する

  3. © ZOZO Technologies, Inc. 5 目次
 
 1. AFの仕組みについて
 2.

    暗所AF性能比較 
 3. LiDARによるAF機能の実装
 4. デモ
 5. 実装Tips

  4. © ZOZO Technologies, Inc. 6 目次
 
 1. AFの仕組みについて 👈あ 


    2. 暗所AF性能比較 
 3. LiDARによるAF機能の実装
 4. デモ
 5. 実装Tips

  5. © ZOZO Technologies, Inc. 9 AF方式の種類
 📸
 
 アクティブ方式 


    パッシブ方式 ハイブリッド方式 AFの仕組みについて 
  6. © ZOZO Technologies, Inc. 10 アクティブ方式
 AFの仕組みについて  how
 pros
 cons


    • 超音波や赤外線による 測距
 • 暗所でのAFに強い
 • 遠距離のピント合わせに 弱い(風景写真など)
 • 間にガラスなどがあると 距離の検出を誤ることが ある

  7. © ZOZO Technologies, Inc. 11 パッシブ方式
 AFの仕組みについて  how
 pros
 cons


    • 画像のコントラストや専 用のレンズ/センサーな どを利用
 • AF動作が高速
 • コントラストが低い
 被写体、暗所でのAFに 弱い

  8. © ZOZO Technologies, Inc. 13 Focus Pixels
 AFの仕組みについて  ✔ “Apple

    用語” ✔ iPhone 6 から導入された従来のAF ✔ パッシブ方式AFの一つ?
  9. © ZOZO Technologies, Inc. 14 LiDARスキャナ
 AFの仕組みについて  ✔ 2020年3月に iPad

    Pro に初搭載 ✔ AR体験の向上 ✔ より正確かつ素早く測距することが可能に ✔ 暗所AF速度の向上 👈 今回はここを中心に話します
  10. © ZOZO Technologies, Inc. 17 ✔ Light Detection And Rangingの略

    ✔ 地質学や気象学などさまざまな分野で利用 ✔ 自動運転車用センサーとしても注目 ✔ iPhoneのLiDARスキャナは赤外線を照射して測距 👉 LiDARスキャナを利用したアクティブ方式のAF AFの仕組みについて 
  11. © ZOZO Technologies, Inc. 18 目次
 
 1. AFの仕組みについて
 2.

    暗所AF性能比較 👈
 3. LiDARによるAF機能の実装
 4. デモ
 5. 実装Tips

  12. © ZOZO Technologies, Inc. 21 目次
 
 1. AFの仕組みについて
 2.

    暗所AF性能比較
 3. LiDARによるAF機能の実装 👈
 4. デモ
 5. 実装Tips

  13. © ZOZO Technologies, Inc. 23 制約
 ✔ LiDARスキャナ付き端末 ✔ iOS14

    / ARKit 4 以上 ✔ AVCaptureSession と ARSession は同時実行不可 LiDARによるAF機能の実装 
  14. © ZOZO Technologies, Inc. 25 LiDARによるAF機能の実装  AVFoundation
 AVCaptureSession
 通常のカメラ
 ARKit


    ARSession
 LiDAR
 ①
 AVCaptureSession 
 で通常のバックカメラを起動
 (AFなし)

  15. © ZOZO Technologies, Inc. 26 LiDARによるAF機能の実装  AVFoundation
 AVCaptureSession
 通常のカメラ
 ARKit


    ARSession
 LiDAR
 ②
 ボタンタップで
 AVCaptureSession 停止
 LiDAR 起動

  16. © ZOZO Technologies, Inc. 27 LiDARによるAF機能の実装  AVFoundation
 AVCaptureSession
 通常のカメラ
 ARKit


    ARSession
 LiDAR
 ③
 深度マップから
 最もカメラに近い点を検出
 マーカーを表示

  17. © ZOZO Technologies, Inc. 28 AVFoundation
 AVCaptureSession
 通常のカメラ
 ARKit
 ARSession


    LiDAR
 * fPOI … focusPointOfInterest
 fPOI 座標
 LiDARによるAF機能の実装  ④
 再度ボタンタップで
 LiDAR 停止
 AVFoundation 側に
 fPOI* の座標を渡す

  18. © ZOZO Technologies, Inc. 31 LiDAR 対応かチェック
 LiDARによるAF機能の実装  func checkLidarIsEnable()

    -> Bool { return ARWorldTrackingConfiguration.supportsFrameSemantics( [.sceneDepth, .smoothedSceneDepth])
  19. © ZOZO Technologies, Inc. 32 let arConfiguration = ARWorldTrackingConfiguration() let

    arSession: ARSession = ARSession() ... func setupLiDAR() { if type(of: arConfiguration).supportsFrameSemantics(.sceneDepth){ arConfiguration.frameSemantics = .sceneDepth arConfiguration.isAutoFocusEnabled = false } arSession.delegate = self } LiDAR セットアップ
 LiDARによるAF機能の実装 
  20. © ZOZO Technologies, Inc. 33 ボタンタップの処理 - AVCaptureSession
 LiDARによるAF機能の実装  var

    handler: ((UIImage) -> Void)? ... func runAvCapture(_ handler: @escaping (UIImage) -> Void) { arSession.pause() // ARSessionを停止 self.handler = handler // handlerを設定 self.setMode(focusMode: .locked, exposureMode: .locked) captureSession.startRunning() if (isfPOIExist) { // fPOI設定 self.setMode(focusMode: .autoFocus, exposureMode: .autoExpose, point: CGPoint(x: x, y: y)) } ... }
  21. © ZOZO Technologies, Inc. 34 ボタンタップの処理 - ARSession
 LiDARによるAF機能の実装  var

    handler: ((UIImage) -> Void)? ... func runAR(_ handler: @escaping (UIImage) -> Void) { captureSession.stopRunning() // AVCaptureSessionを停止 self.handler = handler // handler設定 arSession.run(arConfiguration) }
  22. © ZOZO Technologies, Inc. 35 ボタンタップの処理 - UI
 LiDARによるAF機能の実装  VStack

    (alignment: .center) { ... Button(action: { if (isAvCaptureRunning) { captureWithDepth.runAR { uiImage in DispatchQueue.main.async { self.image = uiImage } } ... } else { captureWithDepth.runAvCapture { uiImage in DispatchQueue.main.async { self.image = uiImage } } ...
  23. © ZOZO Technologies, Inc. 36 ARSessionDelegateの処理
 LiDARによるAF機能の実装  extension MyClass: ARSessionDelegate

    { func session(_ session: ARSession, didUpdate frame: ARFrame) { if let handler = handler { guard let imageBuffer = frame.sceneDepth?.depthMap else ... ... if (isfPOIExist){ if let imageWithfPOI = drawfPOIOnImage(fPOI) { image = imageWithfPOI } } handler(image) DispatchQueue.global(qos: .userInitiated).async { self.computefPOI(imageBuffer: imageBuffer, image: image) } } } }
  24. © ZOZO Technologies, Inc. 38 computefPOIの処理 ①
 LiDARによるAF機能の実装  var depthArray:

    [Float32]? ... func computefPOI(imageBuffer: CVPixelBuffer, image: UIImage) { frameCounter += 1 self.buildDepthInfo(depthMap: imageBuffer) // depthArrayを取得 if (frameCounter >= 60) { ... } else { // 最もカメラに近い点の座標 x, y を計算 if let minDepthVal = depthArray.min(), let fidx = depthArray.firstIndex(of: minDepthVal) { x_sum += (fidx % Int(image.size.width)) y_sum += (fidx / Int(image.size.height)) } } }
  25. © ZOZO Technologies, Inc. 39 computefPOIの処理 ②
 LiDARによるAF機能の実装  func computefPOI(imageBuffer:

    CVPixelBuffer, image: UIImage) { frameCounter += 1 ... if (frameCounter >= 60) { // 平均 centroid_x = x_sum / frameCounter centroid_y = y_sum / frameCounter x_sum = 0 y_sum = 0 frameCounter = 0 } else { ...
  26. © ZOZO Technologies, Inc. 41 目次
 
 1. AFの仕組みについて
 2.

    暗所AF性能比較
 3. LiDARによるオートフォーカス機能の実装
 4. デモ 👈
 5. 実装Tips

  27. © ZOZO Technologies, Inc. 43 目次
 
 1. AFの仕組みについて
 2.

    暗所AF性能比較
 3. LiDARによるオートフォーカス機能の実装
 4. デモ
 5. 実装Tips 👈

  28. © ZOZO Technologies, Inc. 44 実装Tips  ✔ ARWorldTrackingConfiguration.isAutoFocusEnabled = true

    👉 セッションの切り替えなしにAF利用可能
 ✔ 現状、ARKitからAVCaptureSessionを利用不可 👉 細かなカメラの設定が難しい
  29. © ZOZO Technologies, Inc. 45 参考
 • Autofocus - Wikipedia


    • オートフォーカスを活用しましょう! | 富士フイルム
 • iPhone 12 Pro - 技術仕様
 • LiDARとは? | レーザーダイオードとは? | エレクトロニクス豆知識 | ローム株式会社 - ROHM Semiconductor • iPhone、iPad、iPod touch で計測 App を使う - Apple サポート (日本)