错误 "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)")
}
}
请注意 handler
是 var
,不是常数。
此外,如果新的观察对象无效,您可以在实际处理函数(如func handleVisionRequestUpdate(_ request: VNRequest, error: Error?)
)中重新实例化handler
。
您似乎达到了系统中可激活的跟踪器数量的限制。首先要注意的是,每次使用新的 -uuid 属性 进行新的观察时都会创建一个新的跟踪器。您应该回收启动跟踪器时使用的初始观察,直到您不想再使用它为止,方法是将您从时间 T 的“结果”中获得的内容提供给您为时间 T+1 发出的后续请求。当您不想再使用该跟踪器时(可能置信度得分太低),可以设置一个“lastFrame”属性,它让 Vision 框架知道您已完成该跟踪器的使用。释放序列请求处理程序时也会释放跟踪器。
我正在跟随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)")
}
}
请注意 handler
是 var
,不是常数。
此外,如果新的观察对象无效,您可以在实际处理函数(如func handleVisionRequestUpdate(_ request: VNRequest, error: Error?)
)中重新实例化handler
。
您似乎达到了系统中可激活的跟踪器数量的限制。首先要注意的是,每次使用新的 -uuid 属性 进行新的观察时都会创建一个新的跟踪器。您应该回收启动跟踪器时使用的初始观察,直到您不想再使用它为止,方法是将您从时间 T 的“结果”中获得的内容提供给您为时间 T+1 发出的后续请求。当您不想再使用该跟踪器时(可能置信度得分太低),可以设置一个“lastFrame”属性,它让 Vision 框架知道您已完成该跟踪器的使用。释放序列请求处理程序时也会释放跟踪器。