3

我正在按照本教程在 iOS 11 上实现对象跟踪。我能够完美地跟踪对象,直到某个点,然后控制台中出现此错误。

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

是我错误地使用了 API,还是 Vision 无法处理太多连续的对象跟踪任务?好奇是否有人能洞察为什么会发生这种情况。

4

3 回答 3

3

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

于 2017-10-16T17:28:11.023 回答
2

要跟踪矩形,您将后续观察提供给相同的 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)")
    }
}

请注意,handler不是var常数。

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

于 2017-09-22T00:45:32.173 回答
1

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

于 2017-09-20T21:08:45.950 回答