错误 "Exceeded maximum allowed number of Trackers" 是什么意思?

What does the error "Exceeded maximum allowed number of Trackers" mean?

我正在跟随this tutorial在iOS11上实现对象跟踪。我能够完美地跟踪对象,直到某个点,然后这个错误出现在控制台中。

Throws: Error Domain=com.apple.vis Code=9 "Internal error: Exceeded maximum allowed number of Trackers for a tracker type: VNObjectTrackerType" UserInfo={NSLocalizedDescription=Internal error: Exceeded maximum allowed number of Trackers for a tracker type: VNObjectTrackerType}

我是否使用了 API 不正确,或者 Vision 可能无法处理太多连续的对象跟踪任务?好奇是否有人知道为什么会发生这种情况。

我的问题是我有一个函数调用 perform... 在同一个 VNSequenceRequestHandler 上,跟踪也在调用 perform,因为我同时处理了太多 try self.visionSequenceHandler.perform(trackRequests, on: ciimage)。确保 VNSequenceRequestHandler 不会同时被多个执行击中....

为了跟踪矩形,您将后续观察结果提供给同一个 VNSequenceRequestHandler 实例,例如 handler。当矩形丢失时,即在你的处理函数/回调中新观察是 nil,或者你得到一些其他跟踪错误,只需重新实例化 handler 并继续,例如(展示想法的示例代码):

private var handler = VNSequenceRequestHandler()

// <...>

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard
        let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer),
        let lastObservation = self.lastObservation
    else { 
        self.handler = VNSequenceRequestHandler()
        return
    }

    let request = VNTrackObjectRequest(detectedObjectObservation: lastObservation, completionHandler: self.handleVisionRequestUpdate)
    request.trackingLevel = .accurate

    do {
        try self.handler.perform([request], on: pixelBuffer)
    } catch {
        print("Throws: \(error)")
    }
}

请注意 handlervar,不是常数。

此外,如果新的观察对象无效,您可以在实际处理函数(如func handleVisionRequestUpdate(_ request: VNRequest, error: Error?))中重新实例化handler

您似乎达到了系统中可激活的跟踪器数量的限制。首先要注意的是,每次使用新的 -uuid 属性 进行新的观察时都会创建一个新的跟踪器。您应该回收启动跟踪器时使用的初始观察,直到您不想再使用它为止,方法是将您从时间 T 的“结果”中获得的内容提供给您为时间 T+1 发出的后续请求。当您不想再使用该跟踪器时(可能置信度得分太低),可以设置一个“lastFrame”属性,它让 Vision 框架知道您已完成该跟踪器的使用。释放序列请求处理程序时也会释放跟踪器。