Я создал приложение, которое находит и отображает ограничивающие рамки, используя 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
}
}