在Swift中检索实时相机预览的最后一帧

4
我有一个AR应用程序,视图一直显示后置摄像头所看到的内容,并将每个帧发送到VisionRequest进行分析。
当识别出对象时,我想捕获该特定的最后一个帧并将其保存为常规UIImage,然后将其发送到最终视图控制器中,在那里我会显示该最后一个帧。我在捕获和显示最后一个帧时遇到了问题。
迄今为止,我尝试过以下方法:
当以高足够的置信度识别图像时,我尝试从CVPixelBuffer中检索当前的最后一个帧,并将其保存在本地变量中,稍后在segue中传递给后续的视图控制器。
这是正确的方法吗?还是我需要向会话添加第二个输出(除视频数据输出外还有照片输出)?
 //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)

我还没有深入研究AR,但是你不能只是重复使用你发送的视觉请求的框架吗? - Sean Lintern
2个回答

4

实际上,你得到的输出结果很可能不是你所需要的精确输出。因为你无法知道所捕捉的最后一帧是否与你想要的完全相同。有可能出现虚假结果,比如相机在运动中或者获取的帧模糊或者不符合你的需求。

也许我理解有误。但我的建议或解决方案是:保留10个图像或像素缓冲区,并存储最近的10个帧或像素缓冲区。当你从视觉检查中识别出你的对象时,再次检查该数组并获取最高质量(置信度)的帧,或向用户显示一个选项集合以选择正确的图像。

希望这会有所帮助。


1
当前的最后一帧可能不是触发成功图像识别的那一帧,因此您可能希望保留触发它的像素缓冲区。
然后,您可以通过以下方式从像素缓冲区获取UIImage:
import VideoToolbox

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接