原始数据来自avfoundation



嗨,我正在从AVCaptureVideoDataoutput获取原始图像数据。

我有很多使用avfoundation的经验,也做过很多项目,但这次我做的是图像处理项目,我没有任何经验。

public func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
}

我知道我在委托回调函数中得到了CMSampleBuffer

我的问题。

  1. CMSampleBuffer是来自图像传感器的"RAW"数据吗?
  2. 我想知道整个流程使CMSampleBuffer到这里。但是我找不到任何详细的流程。
  3. 我在stackoverflow上找到了一些可能的解决方案(来自相机的原始图像数据,如"645 PRO")

在这个问题中,作者尝试使用opencv,得到了他想要的。但. .什么是完全不同的结果由opencv从CMSamplebuffer?(为什么opencv的结果是真实的原始数据,作者说)

  1. 并且(如何从CMSampleBuffer获得AVCaptureSession产生的Y组件?)

如果我设置如下,

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
}

通过设置格式键_32BGRA,,我现在从samplebuffer获得原始数据吗?

  1. 这不是RAW在你的情况下。所有现代传感器都建立在拜耳滤波器上,所以你得到的图像是从拜耳格式转换而来的。你不能用这个api获得原始图像。有一种格式叫做kCVPixelFormatType_14Bayer_BGGR,但是相机可能不支持。

  2. 也许在WWDC 419会议上你会找到答案。我不知道

  3. 是一样的;cv::Mat只是CMSampleBuffer图像数据的包装器。如果您将数据保存为PNG,则不会损失任何质量。TIFF格式无需任何压缩即可保存,但您也可以使用PNG格式而无需压缩。

  4. 如果你使用RGBA格式,在后台它是从拜耳转换为RGBA。要获得Y通道,您需要额外应用RGBA到YUV转换并获取Y通道。或者您可以使用kCVPixelFormatType_420YpCbCr8BiPlanarFullRange格式并从第一个平面获得Y通道。还要注意VideoRange具有不同的色度输出范围。

// ObjC code
int width = CVPixelBufferGetWidth(imageBuffer);
int height = CVPixelBufferGetHeight(imageBuffer);
uint8_t *yBuffer = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);
size_t yPitch = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0);
cv::Mat yChannel(height, width, CV_8UC1, yBuffer, yPitch);

相关内容

  • 没有找到相关文章

最新更新