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
var<我想,在这种情况下,代码>行字节数应该是4,格式应该是simd\u uchar4
.BGRA8
- 在进行平均计算之前,您还可以尝试缩小图像(这已经是一个缩小操作)。它不是相同的值,而是一个公平的近似值——而且可能更快
CVPixelBufferGetBaseAddress
访问原始数据。关于性能:您是否尝试过在方案设置中禁用“GPU帧捕获”和“金属API验证”?这些严重干扰了任何性能基准。