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