如何从由 CMSampleBuffer 数据生成的 CIImage 有效地读取像素值?

Pat*_*yer 5 core-image ios avcapturesession

我正在从 iOS AVCaptureSesion 读取示例缓冲区,对它们执行一些简单的图像处理,然后分析结果图像中的像素。我已经使用 openCV 进行图像处理,但我想切换到核心图像,我希望对于这些简单的操作会更有效。但是,我完全坚持如何从生成的 CIImage 中读取像素值。

当我有一个由 CGImage 支持的 UIImage 时,我可以使用 cgImage dataProvider 来访问底层像素数据(下面的示例)。但是 CIImage 的模拟是什么?

这是我的一般流程:

    // Getting sample video data
    var session : AVCaptureSession = AVCaptureSession()

    // processing the sample buffer with core image
    func handleSampleBuffer(sampleBuffer: CMSampleBuffer) 
    {      
       let cvImage: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
       let ciImage: CIImage = CIImage(cvPixelBuffer: cvImage)

       let filteredImage = processWithCoreImage(image: ciImage)

       //
     // How can I efficiently get pixel values from filtered image here?
       //
    }

    func processWithCoreImage(image: CIImage) -> CIImage
    {
      // process with a core image filter chain
        let filter1 = CIFilter(name: “…”)!
        filter1.setValue(image, forKey: kCIInputImageKey)
        filter1.setValue(…, forKey: …)
      …
        let outputImage = filter.outputImage
        return outputImage
    }

  // With a regular UIImage I was doing something like this to get pixel data
  // However CIImage does not have a cgImage backing it in this case.
  public extension UIImage {
      func getPixelValueGrayscale(x: Int, y: Int) -> UInt8 {
          let pixelData = self.cgImage!.dataProvider!.data
          let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
          let pixelInfo: Int = ((Int(self.size.width) * Int(y)) + Int(x)) 
          return data[pixelInfo]
      }     
  }
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用 CIContext 来获得一个 CGImage 支持的 UIImage 如下,但事实证明这非常低效 - 每帧花费了好几分之一秒(比等效的 openCV 操作长数百倍)。

// re-used CIContext
let cgImage = context.createCGImage(filteredImage, from: ciImage.extent)
let img = UIImage(cgImage: cgImage!)
Run Code Online (Sandbox Code Playgroud)

我还应该提到我的过滤图像很小(我正在缩小它)。我不知道这是否造成了一些问题。

我错过了什么?谢谢。

更新:经过一些实验,结果证明 CI 中的缩放选项比 OpenCV 中可用的选项慢很多。将 OpenCV 包含在我的项目中只是为了扩展感觉是错误的,但是......目前。