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