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

Ios11 错误是什么;超出了允许的最大跟踪器数量“;什么意思?,ios11,swift4,apple-vision,Ios11,Swift4,Apple Vision,下面我将在iOS 11上实现对象跟踪。我能够完美地跟踪对象,直到某一点,然后这个错误出现在控制台中 抛出:Error Domain=com.apple.vis Code=9“内部错误:超出跟踪程序类型VNObjectTrackerType允许的最大跟踪程序数”UserInfo={NSLocalizedDescription=内部错误:超出跟踪程序类型VNObjectTrackerType允许的最大跟踪程序数} 我是否错误地使用了API,或者Vision在处理太多连续的对象跟踪任务时遇到了问题?我

下面我将在iOS 11上实现对象跟踪。我能够完美地跟踪对象,直到某一点,然后这个错误出现在控制台中

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


我是否错误地使用了API,或者Vision在处理太多连续的对象跟踪任务时遇到了问题?我很好奇是否有人知道为什么会发生这种情况。

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

要跟踪将后续观察结果馈送到同一VNSequenceRequestHandler实例的矩形,例如,
handler
。当矩形丢失时,即处理程序函数/回调中的新观察值为
nil
,或者您遇到其他一些跟踪错误,只需重新实例化
处理程序
,然后继续,例如(示例代码以显示想法):

private var handler=VNSequenceRequestHandler()
// 
func captureOutput(\uOutput:AVCaptureOutput,didOutput sampleBuffer:CMSampleBuffer,from connection:AVCaptureConnection){
警卫
让pixelBuffer:CVPixelBuffer=CMSampleBufferGetImageBuffer(sampleBuffer),
让lastObservation=self.lastObservation
否则{
self.handler=VNSequenceRequestHandler()
返回
}
let request=VNTrackObjectRequest(detectedObjectObservation:lastObservation,completionHandler:self.handleVisionRequestUpdate)
request.trackingLevel=.correct
做{
尝试self.handler.perform([request],on:pixelBuffer)
}抓住{
打印(“抛出:\(错误)”)
}
}
请注意,
handler
var
,而不是常量


此外,如果新观察对象无效,您可以在实际处理程序函数中重新实例化
处理程序
(如
func handleVisionRequestUpdate(\urequest:VNRequest,error:error?
)。首先要注意的是,每次使用新的观测值时,都会创建一个新的跟踪器,该跟踪器具有new-uuid属性。您应该循环使用启动跟踪器时使用的初始观察,直到您不再想使用它为止,方法是将时间T的“结果”中得到的结果输入到您对时间T+1的后续请求中。当您不想再使用该跟踪器时(可能置信度得分太低),可以设置“lastFrame”属性,让Vision框架知道您已使用该跟踪器。当序列请求处理程序被释放时,跟踪器也会被释放。

在此处添加生成exceptionsame问题的行。看起来我很可能是做错了什么,但是,我还不确定这可能是什么。@nathan对我来说,导致这个问题的代码行是:try self.visionSequenceHandler.perform(trackRequests,on:ciimage)你所说的“回收初始观察”是什么意思?这在中有详细解释。还有一个指向示例应用程序的链接,该应用程序使用Vision.framework实现了电影解析跟踪序列。我对如何/为什么解决此错误感到有点困惑。你能详细说明一下吗?
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)")
    }
}