swift - CIImage 像素的 RGB 值

标签 swift arkit core-image ciimage cvpixelbuffer

我想访问 CVPixelBuffer 特定区域的平均颜色值我从 ARFrame 得到的实时。我设法裁剪图像,使用过滤器计算平均颜色,然后转换为 CGImage我从像素中获取值,但不幸的是,它影响了我的应用程序的性能(FPS 低于 30fps)。我认为这样做的原因是使用 CGContext。有没有办法在不转换的情况下访问颜色 CIImageCGImage ?
这是我目前正在使用的代码:

func fun() {
  let croppVector = CIVector(cgRect: inputImageRect)

  guard let filter = CIFilter(
    name: "CIAreaAverage",
    parameters: [kCIInputImageKey: image, kCIInputExtentKey: croppVector]
  ),
    let outputImage = filter.outputImage,
    let cgImage = context.createCGImage(
      outputImage,
      from: CGRect(x: 0, y: 0, width: 1, height: 1)
    ),
    let dataProvider = cgImage.dataProvider,
    let data = CFDataGetBytePtr(dataProvider.data) else { return nil }

  let color = UIColor(
    red: CGFloat(data[0]) / 255,
    green: CGFloat(data[1]) / 255,
    blue: CGFloat(data[2]) / 255,
    alpha: CGFloat(data[3]) / 255
  )
}

最佳答案

我认为您在这里无能为力——像这样的还原操作很昂贵。

您可以尝试以下几点:

  • 设置您的 CIContext通过设置 .workingColorSpace 不执行任何颜色管理和 .outputColorSpace NSNull() 的选项.
  • 直接渲染到一块内存中,而不是通过CGImage .上下文具有方法 render(_ image: CIImage, toBitmap data: UnsafeMutableRawPointer, rowBytes: Int, bounds: CGRect, format: CIFormat, colorSpace: CGColorSpace?)你可以用它。也通nil作为这里的色彩空间。您应该能够将“指针”传递给 simd_uchar4 var as data这里。 rowBytes将是 4,格式将是 .BGRA8在这种情况下,我认为。
  • 您还可以尝试在进行平均计算之前缩小图像(这已经是一种缩减操作)。它不会是相同的值,而是一个公平的近似值——而且可能会更快。
  • 关于swift - CIImage 像素的 RGB 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59396448/

    相关文章:

    ios - Swift 中的 NSUserDefaults 选项

    iOS 问题检查蓝牙是否打开

    ios - 导航 LeftBarButtonItem 未正确呈现,框架不起作用

    augmented-reality - 我们可以使用 ARKit 和 SceneKit 开发 LiDAR 应用程序吗?

    iphone - iOS 6 上的 CIGaussianBlur 和 CIAffineClamp

    ios - 放养 UIImages 然后转换为电影

    swift - 如何在 JSON 模型 swift 中添加自定义变量?

    swift - RealityKit 和 Reality Composer——图像识别

    swift - 我正在尝试检测 ARKit SceneKit 中两个节点之间的接触

    ios - 带 GLKView 的核心图像