連続するフレームで物体を追跡できます。
物体位置をCGRectで指定すると、次のフレームで追跡します。
###手順
1、追跡用のシーケンスハンドラをつくります。
let requestHandler = VNSequenceRequestHandler()
2、物体を囲むCGRectで、物体観測をつくります。
var inputObservation = VNDetectedObjectObservation(boundingBox: cgrect)
3、「1、」で作った物体観測で、追跡リクエストをつくります。
let request = VNTrackObjectRequest(detectedObjectObservation: inputObservation)
4、シーケンスハンドラでフレームを追跡リクエストに渡して実行します。
do {
try requestHandler.perform([request], on: pixelBuffer, orientation: videoOrientation)
} catch {
print("Tracking failed.")
}
5、追跡結果観測が返ってきたら、その観測で次のリクエストを作って、次のフレームで実行します(3〜5の繰り返し)。
guard let observation = request.results?.first as? VNDetectedObjectObservation else { return }
inputObservation = observation
###Tips
-
指定する物体観測は、手動でCGRectを指定することもできますし、Visionの顔・胴体・手・動物などの検出結果、Core MLの物体検出結果を直接指定することもできます。
-
リクエストは追跡レベルを「速さ優先」「精度優先」を指定できます。
request.trackingLevel = .fast
-
複数の物体も追跡できます。それぞれリクエストを作って配列でハンドラに渡します。
-
リアルタイムでカメラフレームを追跡するときはAVCaptureVideoOutputのデリゲートメソッドで、動画ファイルで追跡するときはAVAssetReaderでそれぞれフレームを取得できます。
-
メインスレッドで実行すると重くなるので、別キューで実行しましょう。
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。
Twitter
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
Medium