4

我有一个 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)
4

2 回答 2

4

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

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

希望它可能会有所帮助

于 2019-04-22T13:16:52.570 回答
1

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

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

import VideoToolbox

var cgImage: CGImage?
VTCreateCGImageFromCVPixelBuffer(matchingPixelBuffer, options: nil, imageOut: &cgImage)
let uiImage = UIImage(cgImage: cgImage)
于 2019-04-22T16:50:43.123 回答