Почему бы вам не использовать свойство currentFrame
сеанса внутри обработчика завершения?Содержит текущий кадр сеанса.Кроме того, вам больше не нужно передавать экземпляр frame
вашему обработчику завершения.Он просто доступен, используя ваш экземпляр sceneView
.
Таким образом, вы можете изменить свой обработчик завершения, как показано ниже:
func detectTextHandler(request: VNRequest, error: Error?) {
guard let currentFrame = sceneView.session.currentFrame else { return }
...
// perform hit test using currentFrame
let hit = currentFrame.hitTest(box?.topRight - box?.bottomLeft, types: ARHitTestResult.ResultType.featurePoint )
...
}
Вы также можете использовать currentFrame
для создания обработчика запроса изображения в session(_:didUpdate:)
:
let pixelBuffer = sceneView.currentFrame.capturedImage
Также обратите внимание, что запуск perform()
метода VNImageRequestHandler
в session(_:didUpdate:)
неэффективен и занимает столько времени, поскольку он выполняется постоянно, вместо этого можно использовать Timer
, чтобы сократить количество выполняемых вами операций.процесс обнаружения изображений.
Редактировать: Поскольку обнаружение изображения является асинхронным и может потребоваться время для завершения, вы можете сохранить кадр в другом экземпляре при выполнении запроса и использовать этот экземпляр в обработчике завершения:
var detectionFrame: ARFrame?
// Timer block
detectionFrame = sceneView.session.currentFrame
let pixelBuffer = detectionFrame.capturedImage
// image detection request code
func detectTextHandler(request: VNRequest, error: Error?) {
guard let frame = detectionFrame else { return }
...
let hit = frame.hitTest(box?.topRight - box?.bottomLeft, types: ARHitTestResult.ResultType.featurePoint )
...
}