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 包含在我的项目中只是为了扩展感觉是错误的,但是......目前。
| 归档时间: |
|
| 查看次数: |
1684 次 |
| 最近记录: |