Сохранение изображений (с помощью CALayers) в приложении ограничительной рамки ML - PullRequest
0 голосов
/ 31 марта 2020

Я создал приложение, которое находит и отображает ограничивающие рамки, используя SSD. Я хотел бы создать видео из изображений со скриншотов, сохраненных в папке документов, но задача в вычислительном отношении дорогая. Моя идея состояла в том, чтобы вызвать takeScreenshot () [код ниже] внутри DispatchQueue.main.async {}, но у меня возникают проблемы с памятью в моей функции прогнозирования [код ниже].

Кто-нибудь нашел способ сохранить изображения, которые требуют доступа к пользовательскому интерфейсу (и, следовательно, должны находиться в главной очереди) или есть ли лучший способ для меня sh сохранить скриншоты? Спасибо.

func takeScreenshot() {
    var screenshotImage :UIImage?
    let layer = UIApplication.shared.windows.filter {$0.isKeyWindow}.first!.layer
    let scale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale);
    guard let context = UIGraphicsGetCurrentContext() else { return }
    layer.render(in:context)
    screenshotImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    if let image = screenshotImage {
        let unixtime = Int(Date().timeIntervalSince1970*1000)
        let name = "\(unixtime).png"
        let url = saveImage(image, name: name)
        print(">>> URL of saved image: \(url)")
    }
}
func predict(sampleBuffer: CMSampleBuffer) {
    if currentBuffer == nil, let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) {
        currentBuffer = pixelBuffer
        bufferForShotLocation = pixelBuffer
        DispatchQueue.main.async {
            self.takeScreenshot()
        }
        var options: [VNImageOption : Any] = [:]
        if let cameraIntrinsicMatrix = CMGetAttachment(sampleBuffer, key: kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, attachmentModeOut: nil) {
            options[.cameraIntrinsics] = cameraIntrinsicMatrix
        }
        let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .up, options: options)
        do {
            try handler.perform([self.visionRequest])
        } catch {
            print("Failed to perform Vision request: \(error)")
        }
        currentBuffer = nil
    }
}
...