8
8

More than 3 years have passed since last update.

Sep-01-2020 12-34-38.gif
連続するフレームで物体を追跡できます。
物体位置を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チャンネル
Medium

相棒
note

8
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8