スーパークイックスマイルトラッキングアプリを構築する方法
ARKit は難しそうに見えるかもしれませんが、iOS アプリの基本的な作成経験があれば、それほど悪くはありません。
私はやってみるタイプなので、ARKit をいじって、慣れるために基本的なアプリを作成しています。この投稿では、単純な顔追跡アプリを作成して学んだことを復習します。
これを 3 つの部分に分けて説明します:
<オール>この記事の執筆時点では、Xcode シミュレーターは前面カメラをサポートしていませんので、アプリを実行するには実際のデバイスが必要です。デバイスには TrueDepth カメラも必要です (iPhone X 以降で問題ありません)。
最後に、Copy Paste Club の仲間のメンバーのために、すべてのコードは Github で入手できます。
初期設定
まず、Xcode を開き、「SmileTracker」という名前 (または任意の名前) の新しいプロジェクトを作成します。
フェイス トラッキングを開始する前に、次の 2 つのことを行う必要があります。
<オール>
新しいプロジェクトで、ViewController.swift
を開きます . import UIKit
の下のファイルの上部付近 、次の行を追加します:import ARKit
.これにより、Apple が提供しているフェイス トラッキングを非常に簡単にするすべての機能にアクセスできるようになります。
viewDidLoad
の中に次のコードを追加します。 :
guard ARFaceTrackingConfiguration.isSupported else {
fatalError("Device does not support face tracking")
}
ARFaceTrackingConfiguration.isSupported
アプリを実行しているデバイスがフェイス トラッキングをサポートできる場合は true、そうでない場合は false になるブール値です。この場合、デバイスがフェイス トラッキングをサポートできない場合、致命的なエラーでアプリをクラッシュさせます。
次に、カメラの使用許可を取得しましょう。 viewDidLoad
に以下を追加します guard
未満 ステートメント:
AVCaptureDevice.requestAccess(for: AVMediaType.video) { granted in
if (granted) {
Dispatch.main.sync {
// We're going to implement this function in a minute
self.setupSmileTracker()
}
} else {
fatalError("User did not grant camera permission!")
}
}
ここでは、カメラのアクセス許可を要求するようデバイスに求めています。ユーザーが権限を付与すると、笑顔の追跡をセットアップする関数が実行されます (エラーについて心配する必要はありません。この関数はすぐに実装します)。
関数を Dispatch.main.sync
でラップします この関数に UI 要素を追加するため、これはメイン スレッドでのみ実行できます。
Info.plist
に Camera Usage Description を追加する必要もあります。 . Info.plist
を開く 新しい行を追加します (これを行うには、最後の行を強調表示して enter
を押します) ).
作成した行に Privacy — Camera Usage Description
を追加します Key
に 列と Type
を確認してください 列は文字列に設定されます。 Value
を残すことができます 列を空白にするか、カメラの使用方法をユーザーに説明するメッセージを追加してください。
あなたの Info.plist
次のようになります:
これまでのアプリをテストしたい場合は、setupSmileTracker()
と呼ばれる行をコメントアウトしてください。 .後でコメントを外すことを忘れないでください。
ここでアプリを実行すると、カメラのアクセス許可を有効にするよう求めるポップアップが表示されます。 「いいえ」と答えた場合は、アプリケーションの設定に移動して、アプリを実行するためにこれらの権限を有効にする必要があります。
アプリがクラッシュした場合は、コンソールで 2 つのエラー メッセージのいずれかをチェックして、何が問題なのかを確認してください。
スマイル トラッキング
ViewController.swift
を開く 次の変数を ViewController
の先頭に追加します :
class ViewController: UIViewController {
let sceneView = ARSCNView()
override func viewDidLoad() {...}
}
ARSCNView
ARSession
が装備されています iPhone が AR 体験を調整するために使用するものです。 sceneView
を使用します の ARSession
正面カメラを通してユーザーの顔を分析します。
この関数をファイルの viewDidLoad
の下に追加します :
func setupSmileTracker() {
let configuration = ARFaceTrackingConfiguration()
sceneView.session.run(configuration)
sceneView.delegate = self
view.addSubview(sceneView)
}
ここでは、顔追跡を処理する構成を作成し、それを使用して sceneView
を実行しました。 の ARSession
.
次に、sceneView
を設定します のデリゲートを自分自身に渡し、それをビューに追加します。
Xcode は、ViewController
以降に問題があることを通知します。 ARSCNViewDelegate
に準拠していません .どこ ViewController
に行く ファイルの先頭付近で宣言されているので、その行を次のように変更します:
class ViewController: ViewController, ARSCNViewDelegate {
...
}
このARSCNViewDelegate
を追加します ViewController
の関数 クラス setupSmileTracker
:
func renderer(_renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
...
}
renderer
シーンが更新されるたびに実行され、ARAnchor
が提供されます ユーザーの顔に対応します。
フェイス トラッキング エクスペリエンスを簡単に作成できるようにするために、Apple は自動的に を作成します。 ARFaceAnchor
を使用するときにそれをセッションに追加します ARFacetrackingConfiguration
それを実行します。 この ARFaceAnchor は renderer
に渡されます ARAnchor
として .
次のコードをレンダラーに追加します:
func renderer(_renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
// 1
guard let faceAnchor = anchor as? ARFaceAnchor else { return }
// 2
let leftSmileValue = faceAnchor.blendshapes[.mouthSmileLeft] as! CGFloat
let rightSmileValue = faceAnchor.blendShapes[.mouthSmileRight] as! CGFloat
// 3
print(leftSmileValue, rightSmileValue)
}
この関数の内部では多くのことが行われているため、ステップに番号を付けました (Ray Wenderlich スタイル)。
ステップ 1 ARAnchor
を変換します ARFaceAnchor
に faceAnchor
に割り当てます
ARFaceAnchor
現在の位置と向き、トポロジー、顔の表情に関する情報が含まれています
ARFaceAnchor
顔の表情に関する情報を変数 blendShapes
に格納します . blendShapes
は、さまざまな顔の特徴に対応する係数を格納する辞書です。興味がある場合は、Apple のドキュメントで顔の特徴の完全なリストを確認することをお勧めします。 (ヒント :しかめっ面のトラッキングを追加したい場合は、ここでその方法を見つけることができます。)
ステップ 2 で 、 faceAnchor.blendShapes
を使用します キー mouthSmileLeft
を使用して、ユーザーの口の左側と右側がどれだけ笑っているかに対応する CGFloat を取得します。 そして mouthSmileRight
.
最後に、ステップ 3 2 つの値を出力するだけで、正しく機能していることを確認できます。
この時点で、アプリは次のようになっているはずです:
- ユーザーからカメラと顔追跡の許可を取得します
- ARKit を使用してユーザーの表情を追跡します
- ユーザーが口の左右でどれだけ笑っているかをコンソールに出力します
私たちは多くの進歩を遂げたので、少し時間を取って、すべてが適切に実行されていることを確認しましょう.
アプリを初めて実行すると、カメラのアクセス許可を付与するかどうかを尋ねられるはずです。はいと言ってください。
その後、空白の画面が表示されますが、CGFloat 値がコンソールに出力されているのを確認できるはずです (表示されるまで少し時間がかかる場合があります)。
携帯電話に微笑むと、表示される値が上昇していることに気付くはずです。笑顔が多ければ多いほど、数値が高くなります。
正常に動作している場合は、おめでとうございます ?!エラーが発生した場合は、デバイスがフェイス トラッキングをサポートしていることと、カメラのアクセス許可がオンになっていることを再確認してください。最初からこの記事に従っている場合、コンソールはどちらの場合もエラーを出力します。
ユーザー インターフェース
顔を追跡しているので、笑顔に反応する UI を作成しましょう。
最初に新しい UILabel
を追加します smileLabel
と呼ばれる ファイルの先頭、sceneView
のすぐ下 .
class ViewController: UIViewController {
let sceneView = ARSCNView()
let smileLabel = UILabel()
...
}
これは、ユーザーの表情に反応するビューになります。
setupSmileTracker
の末尾に次のコードを追加します。 関数:
smileLabel.text = "?"smileLabel.font = UIFont.systemFont(ofSize: 150)
view.addSubview(smileLabel)
// Set constraints
smileLabel.translatesAutoresizingMaskIntoConstraints = false
smileLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
smileLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
ここでは、基本的な UI プロパティを smileLabel
に追加しています。 画面の中央になるように制約を設定します。アプリを実行すると、巨大な ? が表示されるはずです。真ん中に絵文字。
絵文字が表示されたら、次の関数を ViewController
に追加します :
func handleSmile(leftValue: CGFloat, rightValue: CGFloat) {
let smileValue = (leftValue + rightValue)/2.0
switch smileValue {
case _ where smileValue > 0.5:
smileLabel.text = "?"
case _ where smileValue > 0.2:
smileLabel.text = "?"
default:
smileLabel.text = "?"
}
}
この関数は smileLabel
の絵文字を変更します ユーザーがどれだけカメラに向かって微笑んでいるかによって異なります。 smileValue
を計算します ARFaceAnchor
によって与えられた左右のスマイル値の平均を取ることによって (非常に科学的です、私は知っています)。
その値を switch ステートメントに差し込むと、ユーザーが笑顔になればなるほど、絵文字はより幸せになります。
最後に、renderer
に戻ります。 これを一番下に追加して、左右のスマイル値を handleSmile
に差し込みます :
DispatchQueue.main.async {
self.handleSmile(leftValue: leftSmileValue, rightValue: rightSmileValue)
}
ここでも DispatchQueue
を使用します UI に変更を加えているためです。変更はメイン スレッドで行う必要があります。
アプリを実行すると、笑顔の度合いに応じて絵文字が変化することがわかります。
下の gif では、顔を追加して、絵文字と一緒にカメラ出力で動作していることを確認できるようにしています。
アプリにはカメラ出力がありませんが、 ARSCNView
を追加することで追加できます 、 sceneView
、スーパービューに追加し、ディメンションを指定します。
まとめ
この投稿が、ARKit を使ったアプリの作成を開始するのに役立つことを願っています。
このアプリをさらに拡張したい場合は、上記のリストをチェックして、追跡できる他のすべての顔の特徴を確認してください。これを拡張してしかめっ面もチェックする方法のヒントを残しました.
戻ってきて、自分で作成したクールなプロジェクトについてコメントしてください。私はまだこのようなものに慣れていないので、もっと複雑なアプリを見るのが楽しみです.
フィードバックと質問のために、このアプリのすべてのコードを Github に投稿しました。読んでくれてありがとう。幸運を祈ります!
読んでくれてありがとう!このストーリーが気に入った場合は、Twitter でフォローしてください。私が取り組んでいるストーリーや現在行っていることに関する最新情報を投稿しています。
-
iOS 14.5 プライバシー アップデート:iPhone と iPad で広告主による追跡を制限する方法 (2022)
iOS 14.5 では、Apple は新しいプライバシー機能を強化しています 今週。同社が変更を発表してから約 7 か月後、ユーザーの追跡には同意が必須になりました。 iOS 14.5 のリリースに伴い、すべての開発者はその App Tracking Transparency を順守する必要があります。 ルールでは、ユーザーのアクティビティやその他のデータを追跡するために、ユーザーから追加のアクセス許可を取得する必要があります。 App Tracking Transparency (ATT) とは正確には何ですか? ATT 規則は、IDFA (別名 広告主の識別子 )。これは、Appl
-
MacOS Mojave でカスタマイズされたクイック アクションを作成する方法
Apple は最近、Mojave という名前の新しいデスクトップ オペレーティング システムを導入しました。ほとんどの機能は既存のものの改良版ですが、新しい OS に追加された新しいクールな機能がいくつかあります。 Mojave の最高の新機能の 1 つは、聴衆に愛されているグループ FaceTime と Continuity Camera です。ただし、Mac では、アクションの冗長性を減らすクイック アクション機能により、作業がずっと楽になりました。クイック アクションに加えて、Mojave を使用すると、Finder を離れることなく、写真を変更したり、ビデオをトリミングしたり、ドキュメ