ARKitで画像を認識する
まず認識したい画像を用意する。
Assets.xcassetsの下にある+メニューからNew AR Resource Groupを選択し、AR Resourcesグループを作成する。
作成したら画像をドラッグアンドドロップでimportする。
画像でwarningが起きたら下記のルールに違反しているか疑ってみる。
注意
- ARKitで使用する画像は縦横480ピクセル以上の解像度(ある一定程度の画質が必要)
- 均一の色でしか構成されていない画像は使えない(青一色とか)。ヒストグラムが広く分布している必要がある。(要はカラフルである必要がある)
現実世界でのサイズを決定する
ARSessionに画像を設定する方法(二つ存在する)
1 ARWorldTrackingConfigurationに認識したい画像を設定する(画像トラッキング)
ARSessionのトラッキングを設定するARWorldTrackingConfigurationのプロパティには下記のものが存在する
var detectionImages: Set<ARReferenceImage> { get set }
名前の通り、重複を許さない画像を認識をセットできるプロパティなのでここにAR Resource Groupをセットする
let configuration = ARWorldTrackingConfiguration()
configuration.detectionImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil)!
arView.session.run(configuration)
2 ARImageTrackingConfigurationに認識したい画像を設定する(画像検出)
trackingImagesプロパティに設定する
var trackingImages: Set<ARReferenceImage> { get set }
let configuration = ARImageTrackingConfiguration()
configuration.trackingImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil)!
arView.session.run(configuration)
画像が認識できるという点は同じですがパフォーマンスやどこまでトラッキングするかで異なる部分が多いそう。
ARWorldTrackingConfiguration < ARImageTrackingConfiguration
理由
ARWorldTrackingConfigurationは、現実世界の平面をトラッキングする設定であるため、現実世界の面の一部として設定した画像を認識する。(要は画像以外の面も検出する)
ARImageTrackingConfigurationは、画像のみのトラッキング設定であるため、2D画像だけをトラッキングする。他の面はトラッキングしない
ARアンカーの追加時に必要な処理を書く
ARSessionDelegateの下記メソッドがARアンカーが追加されたときに呼ばれるので、ここの中で必要な処理を加える。
func session(_ session: ARSession, didAdd anchors: [ARAnchor])
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
for anchor in anchors {
// 「ARImageAnchor」だけ取り出す
guard let imageAnchor = anchor as? ARImageAnchor else {
continue
}
// nameでImageAnchorの名前を取り出し、どの画像が検出されたかを調べる。
guard let name = imageAnchor.name else {
continue
}
if (name == 〇〇){
//検出された名前が指定のものだったら。。
// ここに指定したARコンテンツを画像の上に出現させる処理を書く
}
}
}
まとめ ARKitの画像を認識する流れ。
ARKitは認識した場所にARImageAnchorを配置することで実現している。
アンカーが追加された際にARResourceに追加した画像のどれが認識されたかを判断し、処理を実行する
ARImageAnchorとは
ARImageAnchorはARAnchorのサブクラス。アンカーが追
加、更新、削除されるたびにARSCNViewDelegateやARSessionDelegateのメソッドが呼ばれるので、
そこでARImageAnchorに変換して適切なプロパティを使用できる
https://developer.apple.com/documentation/arkit/arimageanchor
流れ
0 画像検出か画像トラッキングをするための画像を設定する(ARWorldTrackingConfigurationかARImageTrackingConfiguration)
1 ARSessionが開始される
2 カメラのライブ映像内の画像を認識する
3 ARKitがARImageAnchorを追加する
4 認識された画像がどれか調べる
5 必要な処理をおこうなう。