HandTrackerを使ってみた

googleがmediapipeというライブラリを公開していますが、その中のハンドトラッカーだけ抽出してiOSで使えるようにしてくれてあるHandTrackerというライブラリがあったので試してみました。

HandTrackerを導入する

Carthageでの導入

Cartfileの作成

touch Cartfile

Cartfileの中身に以下を追加

binary "https://raw.githubusercontent.com/noppefoxwolf/HandTracker/master/HandTracker.json"
carthgae update

Bridgeing Headerの作成

#import <HandTracker/HandTracker.h>

処理の流れ

setup

let tracker: HandTracker = HandTracker()!

tracker.startGraph()
tracker.delegate = self

データの送信

CVImageBufferかCVPixcelBufferをtrackerに渡します、これらの実態はCVBufferなので Core Video bufferを足していれば問題ないと思います。

tracker.processVideoFrame(CVBuffer)

⚠️注意

注意すべき点として、trackerに渡すCVBufferの色空間はRGB形式でなくてはいけません、YUV形式で渡した場合デリゲートメソッドが呼ばれません。

AVFoundationでBufferを取得した場合はRGB形式で渡ってくるので問題ありません。

ARKitを使って表示する場合おそらく、ARSCNViewからBufferを取得することになると思うのですが、YCbCr形式になっているのでRGB形式に変換してあげる必要があります。

トラッキングデータの取得

デリゲートメソッドでは以下コメントのものを取得することができます。

func handTracker(_ handTracker: HandTracker!,
           didOutputLandmarks landmarks: [Landmark]!) {
   // ハンドトラッキングの座標
}
    
func handTracker(_ handTracker: HandTracker!,
           didOutputPixelBuffer pixelBuffer: CVPixelBuffer!) {
   // mediapipeのほうでトラッキング位置に映像を付加した画像
}