我正在关注this tutorial以在iOS 11上实现对象跟踪。我能够完美地跟踪对象,直到某一点,然后在控制台中出现此错误。
抛出:错误Domain = com.apple.vis Code = 9“内部错误:超出跟踪器类型的最大允许跟踪器数量:VNObjectTrackerType”UserInfo = {NSLocalizedDescription =内部错误:超过跟踪器允许的最大跟踪器数量类型:VNObjectTrackerType}
我是否错误地使用了API,或者Vision可能无法处理太多连续的对象跟踪任务?如果有人了解为什么会发生这种情况,那就很好奇。
答案 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)")
}
}
请注意,handler
为var
,而不是常量。
此外,如果新观察对象无效,您可以在实际处理函数(如handler
)中重新实例化func handleVisionRequestUpdate(_ request: VNRequest, error: Error?)
。