快速检索实时摄像机预览的最后一帧

时间:2019-04-12 01:33:19

标签: ios swift ciimage core-video cvpixelbuffer

我有一个AR应用程序,其中的视图不断显示后置摄像头所看到的内容,并将每个帧发送给VisionRequest。

识别出对象后,我想捕获该特定的最后一帧并将其保存为常规UIImage,然后将其沿segue链发送到最终的视图控制器,在其中显示最后一帧。我在捕获最后一帧并显示它时遇到了问题。

这是我到目前为止尝试过的:

当以足够高的可信度识别图像时,我尝试从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)

2 个答案:

答案 0 :(得分:4)

实际上,您有更多机会无法获得所需的确切输出。因为您永远不知道捕获的最后一帧与您想要的完全相同。可能会出现错误的结果,例如相机在运动中,并且所获得的帧根据需要模糊或不正确。

可能是我错了。但是我的建议或解决方案将保留10个图像或像素缓冲区的数组并存储最后10个帧或像素缓冲区。当您从视觉中识别出对象时,请再次检查该阵列并获得最高质量(置信度)框架,或者可以向用户显示一个收集视图作为选择正确图像的选项。

希望这会有所帮助

答案 1 :(得分:1)

当前的最后一帧可能不是触发成功的图像识别的帧,因此您可能需要保留触发它的pixelBuffer。

然后您可以像这样从pixelBuffer获取UIImage:

import VideoToolbox

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