【发布时间】:2022-01-15 13:58:33
【问题描述】:
我正在尝试获取“AVCaptureVideoDataOutput”提要的平均 RGB 值。我在 StackOverflow 上找到了以下解决方案:
let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
let cameraImage = CIImage(CVPixelBuffer: pixelBuffer!)
let filter = CIFilter(name: "CIAreaAverage")
filter!.setValue(cameraImage, forKey: kCIInputImageKey)
let outputImage = filter!.valueForKey(kCIOutputImageKey) as! CIImage!
let ctx = CIContext(options:nil)
let cgImage = ctx.createCGImage(outputImage, fromRect:outputImage.extent)
let rawData:NSData = CGDataProviderCopyData(CGImageGetDataProvider(cgImage))!
let pixels = UnsafePointer<UInt8>(rawData.bytes)
let bytes = UnsafeBufferPointer<UInt8>(start:pixels, count:rawData.length)
var BGRA_index = 0
for pixel in UnsafeBufferPointer(start: bytes.baseAddress, count: bytes.count) {
switch BGRA_index {
case 0:
bluemean = CGFloat (pixel)
case 1:
greenmean = CGFloat (pixel)
case 2:
redmean = CGFloat (pixel)
case 3:
break
default:
break
}
BGRA_index++
}
但这会产生 Int 的平均值,但我需要保持精度的浮点格式。在我正在使用的问题域中,舍入是相当有问题的。有没有一种方法可以有效地实现 Float 平均值?
非常感谢!
【问题讨论】:
-
因为像素是 8 位,所以最大值是 255。假设浮点值是从 0.0 到 1.0,计算应该是 CGFloat(pixel) / 255.0
-
是的,问题在于它将平均值输出为 8 位整数,因此它将浮点数舍入为整数...我想要 0-255 范围内的浮点平均值,无需转换到 8 位像素值
-
你指的是什么像素值转换?像素由 8 位值表示。相当标准的东西。
-
好吧,我希望在将其转换为 8 位整数之前获得平均像素值 - 所以它不会四舍五入,因为我需要在浮点精度级别上进行那些微小的更改。
标签: swift swiftui uikit avfoundation cifilter