GPUImage:如何确定六边形内的平均颜色?

时间:2016-11-05 14:11:55

标签: ios image-processing video-processing gpuimage

我正在使用GPUImage2进行视频处理。当应用程序启动时,我创建一个六边形网格并将其添加到我的cameraView。网格是全屏的,由大约100个六边形组成。 一般来说,我想要实现的是

对于每个帧,我想在网格的每个单元格中找到平均颜色(RGB或甚至更好的HSV)。 当确定颜色时,我想根据其平均颜色在每个六边形的中心绘制一些东西。

我有一个带六边形的数组,每个都知道它的顶点的坐标和中心。 我还有一个包含UIBezierPaths的数组,其中包含这些六边形的边界(以防万一)。

所以我的代码看起来像这样

class ViewController: UIViewController {
    var hexagons = [HKHexagon]()
    var hexagonsBounds = [UIBezierPath]()
    let averageColorExtractor = AverageColorExtractor()

  override func viewDidLoad() {
        super.viewDidLoad()
        do {
            camera = try Camera(sessionPreset:AVCaptureSessionPreset1920x1080)
            camera.delegate = self
            cameraView.orientation = .landscapeLeft
            camera --> cameraView

            camera.startCapture()
            drawGrid()
        } catch {
            fatalError("Could not initialize rendering pipeline: \(error)")
        }
  }
}

extension ViewController: CameraDelegate {
    func didCaptureBuffer(_ sampleBuffer: CMSampleBuffer) {
        for hexagon in hexagons {

        }
    }
}

我猜didCaptureBuffer()应该是将averageColorExtractor应用于每个六边形的地方,但不知道下一步该做什么..

我是iOS开发的新手,这是我第一次使用GPUImage2 ...请指导我正确的方向。

1 个答案:

答案 0 :(得分:0)

根本不编码您的平台,但 GPU 架构允许这样做:

  1. 将图像作为纹理传递
  2. 仅将中心点渲染为点
  3. 片段着色器中的
  4. 计算实际位置周围的十六进制的平均颜色 这是最难和最具性能要求的部分。如果你只计算内切圆,那么很容易,但对于六边形,你需要计算哪个纹素在里面,哪个不在内。对于轴对齐的六边形,您可以将十六进制划分为区域(2x矩形,4x三角形),用于旋转的六边形,您需要添加变换矩阵。
  5. 在中心点内计算/渲染输出。
  6. 我不知道你的框架可以为你做什么。如果渲染的东西比中心点大,那么你需要在渲染中使用另一个传递或使用更大的原语然后指向#2 ,但这意味着你将计算每个渲染像素的平均颜色这会减慢很多事情。

    看一下使用这种技术的 GLSL 着色器(完全不同的任务,但技术是相同的):

    如果这不适合您的平台,请忽略此答案......