Получить последний кадр предварительного просмотра камеры в быстром - PullRequest
4 голосов
/ 12 апреля 2019

У меня есть приложение AR, в котором вид постоянно показывает то, что видит задняя камера, и отправляет каждый кадр для анализа в VisionRequest.

Когда объект был идентифицирован, я хотел бы захватить этот конкретный последний кадри сохраните его как обычный UIImage и отправьте его по цепочке переходов на контроллер окончательного вида, где я отображаю последний кадр.У меня проблемы с захватом последнего кадра и его отображением.

Вот что я пробовал до сих пор:

Когда изображение распознается с достаточно высокой достоверностью, я пытаюсь извлечь текущий последний кадр из CVPixelBuffer и сохранить его влокальная переменная, которая позже передается в последующих контроллерах представления.

Это правильный способ сделать это?или мне нужно добавить второй вывод в сеанс (вывод фотографий в дополнение к выводу видеоданных)?

 //attempting to get the current last frame of captured video
let attachments = CMCopyDictionaryOfAttachments(allocator: kCFAllocatorDefault, target: self.currentlyAnalyzedPixelBuffer!, attachmentMode: kCMAttachmentMode_ShouldPropagate)

let ciImage = CIImage(cvImageBuffer: self.currentlyAnalyzedPixelBuffer!, options: attachments as? [CIImageOption : Any])

self.image = UIImage(ciImage: ciImage)

Ответы [ 2 ]

4 голосов
/ 22 апреля 2019

На самом деле, есть больше шансов, что вы получите не тот результат, который вам нужен.Потому что вы никогда не знаете, что последний отснятый кадр имеет именно то, что вы хотели.Могут быть возможности, когда вы можете получить ложные результаты, например, если камера находится в движении, а полученная рамка размыта или не соответствует вашим потребностям.

Может быть, я ошибаюсь.Но мое предложение или решение будет содержать массив из 10 изображений или пиксельных буферов и хранить последние 10 кадров или пиксельных буферов.Когда вы идентифицируете свой объект по зрению, проверьте этот массив еще раз и получите рамку высочайшего качества (достоверность) или вы можете показать пользователю коллекционный вид в качестве опции для выбора правильного изображения.

Надеюсь, это может помочь

1 голос
/ 22 апреля 2019

Текущий последний кадр, возможно, не является тем, который инициировал успешное распознавание изображения, поэтому вы можете захотеть удержать буфер pixelBuffer, который его вызвал.

Тогда вы можете получить UIImage из pixelBuffer следующим образом:

import VideoToolbox

var cgImage: CGImage?
VTCreateCGImageFromCVPixelBuffer(matchingPixelBuffer, options: nil, imageOut: &cgImage)
let uiImage = UIImage(cgImage: cgImage)
...