2016-11-05 1 views
0

Я занимаюсь обработкой видео с помощью GPUImage2. Когда приложение запускается, я создаю гексагональную сетку и добавляю ее в свой CameraView. Сетка полноэкранная и состоит из около 100 шестиугольников. В общем, я пытаюсь достичьGPUImage: Как определить средний цвет в шестиугольниках?

Для каждого кадра я хочу найти средний цвет (в 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 для каждого шестиугольника, но не имеет представления о том, что делать дальше ..

I я новичок в разработке iOS, и это первый раз, когда я использую GPUImage2 ... Пожалуйста, направляйте меня в правильном направлении.

ответ

0

Не кодирования для вашей платформы на всех, но GPU архитектуры позволяет сделать это следующим образом:

  1. передать изображение в качестве текстуры
  2. оказывать центральные точки только как точки
  3. в фрагментном шейдере вычисляет средний цвет гексагона вокруг фактического положения Это самый сложный и самый перфорированный ormance требующая часть. Если вы вычисляете только вписанный круг, это легко, но для шестиугольника вам нужно вычислить, какой тексель внутри, а какой нет. Для шестиугольников, выровненных по оси, вы можете разделить гекс на области (2x прямоугольник, 4x треугольник) для вращающихся гексов, вам нужно добавить матрицу преобразования.
  4. вычислить/сделать вывод внутри центральной точки.

Я не знаю, что ваш каркас может сделать для вас от этого. Если вы предоставили материал больше, чем просто центр, тогда вам нужно либо использовать другой проход в рендере, либо использовать более крупный примитив, а затем указать в # 2, но это означает, что вы будете вычислять цвет avg для каждого отображаемого пикселя, что может замедлить работу много.

Взгляните на GLSL шейдер, который использует эту технику (для совершенно иной задачи, но техника та же):

Если это не адаптируется к вашей платформе затем проигнорируйте этот ответ ...

Смежные вопросы