Swift 图像像素的RGB值

Swift 图像像素的RGB值,swift,arkit,core-image,ciimage,cvpixelbuffer,Swift,Arkit,Core Image,Ciimage,Cvpixelbuffer,我想实时访问从ARFrame获取的CVPixelBuffer特定区域的平均颜色值。我设法裁剪了图像,使用滤镜计算平均颜色,在转换为CGImage后,我从像素中获得了值,但不幸的是,它影响了我的应用程序的性能(FPS下降到30fps以下)。我认为这样做的原因是使用CGContext。有没有一种方法可以在不将CIImage转换为CGImage的情况下访问颜色? 这是我目前正在使用的代码: func fun(){ 设cropvector=CIVector(cgRect:inputImageRect)

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

func fun(){
设cropvector=CIVector(cgRect:inputImageRect)
防护罩let过滤器=过滤器(
名称:“平均值”,
参数:[kCIInputImageKey:image,kCIInputExtentKey:croppVector]
),
让outputImage=filter.outputImage,
让cgImage=context.createCGImage(
输出图像,
from:CGRect(x:0,y:0,宽度:1,高度:1)
),
让dataProvider=cgImage.dataProvider,
让data=CFDataGetBytePtr(dataProvider.data)else{return nil}
让颜色=UIColor(
红色:CGFloat(数据[0])/255,
绿色:CGFloat(数据[1])/255,
蓝色:CGFloat(数据[2])/255,
alpha:CGFloat(数据[3])/255
)
}

我认为您在这里可以做的事情不多–像这样的缩减操作非常昂贵

您可以尝试以下几点:

  • 通过将
    .workingColorSpace
    .outputColorSpace
    选项设置为
    NSNull()
    ,将
    CIContext设置为不执行任何颜色管理
  • 直接渲染到内存中,而不是通过
    CGImage
    。上下文有方法
    render(u image:CIImage,toBitmap data:UnsafeMutableRawPointer,rowBytes:Int,bounds:CGRect,format:CIFormat,colorSpace:CGColorSpace?)
    您可以使用它。在这里也将
    nil
    作为颜色空间传递。您应该能够在此处将一个“指针”作为
    data
    传递给
    simd\u uchar4
    var<我想,在这种情况下,代码>行字节数
    应该是4,格式应该是
    .BGRA8
  • 在进行平均计算之前,您还可以尝试缩小图像(这已经是一个缩小操作)。它不是相同的值,而是一个公平的近似值——而且可能更快

谢谢弗兰克的回答。不幸的是,这并没有多大帮助(可能会提高一点性能),但我仍然会遇到帧数降至18fps的情况。我使用Metal frame调试器捕获了帧,因此我遇到了一个问题:“编码器:'mainMetalEntryPoint'有未使用的纹理:'com.apple.CoreImage'问题”,关于我计算平均值的裁剪图像。您知道从CVPixelBuffer获取像素RGB值的其他方法吗?我的目标是将其值与参考RGB颜色进行比较。您可以使用
CVPixelBufferGetBaseAddress
访问原始数据。关于性能:您是否尝试过在方案设置中禁用“GPU帧捕获”和“金属API验证”?这些严重干扰了任何性能基准。