错误“超出最大允许的跟踪器数量”是什么意思?

时间:2017-09-01 03:14:40

标签: ios11 swift4 apple-vision

我正在关注this tutorial以在iOS 11上实现对象跟踪。我能够完美地跟踪对象,直到某一点,然后在控制台中出现此错误。

  

抛出:错误Domain = com.apple.vis Code = 9“内部错误:超出跟踪器类型的最大允许跟踪器数量:VNObjectTrackerType”UserInfo = {NSLocalizedDescription =内部错误:超过跟踪器允许的最大跟踪器数量类型:VNObjectTrackerType}

我是否错误地使用了API,或者Vision可能无法处理太多连续的对象跟踪任务?如果有人了解为什么会发生这种情况,那就很好奇。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

要跟踪矩形,请将后续观察结果提供给同一个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,而不是常量。

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