AVCaptureVideoDataOutput获取RAW图像数据相关技术疑问
关于AVCaptureVideoDataOutput获取RAW数据的疑问与解答
背景
我有丰富的AVFoundation使用经验,参与过多个相关项目,目前刚涉足图像处理领域,尝试从AVCaptureVideoDataOutput获取RAW图像数据。通过以下代理回调方法可以拿到CMSampleBuffer:
public func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { }
技术疑问
CMSampleBuffer是否为图像传感器输出的RAW数据?- 想了解
CMSampleBuffer从生成到回调的完整流程,但没找到详细说明; - 看到有开发者通过OpenCV获取到所需RAW数据,想了解该结果与
CMSampleBuffer的本质差异,为何前者是真实RAW数据? - 若设置如下视频格式,此时从SampleBuffer获取的是否为RAW数据?
if self.session.canAddOutput(self.captureOutput) { self.session.addOutput(self.captureOutput) captureOutput.videoSettings = [ kCVPixelBufferPixelFormatTypeKey : kCVPixelFormatType_32BGRA ] as [String : Any] captureOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "capture")) captureOutput.alwaysDiscardsLateVideoFrames = true }
问题解答
不一定。
CMSampleBuffer只是一个数据容器,里面的内容格式完全由AVCaptureSession的配置决定。如果没有指定RAW类型的像素格式,你拿到的是经过ISP(图像信号处理器)处理后的YUV、RGBA等编码/转换后的数据,并非传感器直接输出的RAW。只有当你配置了设备支持的RAW像素格式(比如kCVPixelFormatType_14Bayer_RGGB这类Bayer格式),CMSampleBuffer里才会包含传感器输出的原始RAW数据。CMSampleBuffer从生成到回调的完整流程:- 图像传感器捕获光信号,转换为RAW电信号;
- 若未配置RAW输出,ISP会对RAW数据进行去噪、白平衡、色彩校正、去马赛克等一系列处理;
- 处理后的(或原始RAW)数据被封装为
CVPixelBuffer; CVPixelBuffer搭配时间戳、格式描述等元数据,打包成CMSampleBuffer;AVCaptureSession将CMSampleBuffer通过AVCaptureVideoDataOutput的代理,分发到你指定的回调队列中。
两者的本质差异在于数据的处理阶段:
- OpenCV获取的RAW数据,是直接读取传感器输出的未经过ISP处理的原始Bayer格式数据,保留了每个像素的原始感光信息(每个像素只记录红、绿、蓝中的一种颜色亮度);
- 默认配置下的
CMSampleBuffer数据,是ISP处理后的成品数据——ISP已经完成了去马赛克、色彩空间转换、白平衡调整等操作,丢失了RAW数据里的原始细节。只有当你在AVFoundation中明确配置RAW输出格式,此时的CMSampleBuffer才会和OpenCV获取的是同类型的真实RAW数据。
不是。你设置的
kCVPixelFormatType_32BGRA是8位的RGBA格式,属于经过完全处理的RGB色彩空间数据,是ISP输出的最终成品格式,和传感器的RAW数据完全不同。RAW数据是单通道的Bayer原始数据,而BGRA是四通道(蓝、绿、红、透明度)的成品图像数据。
内容的提问来源于stack exchange,提问作者Hyun Bin CHo
相关产品推荐
相关产品推荐

