2016-11-05 59 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适用于每个六边形的地方,但没有一个想法,下一步怎么办..

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

回答

0

可言,但GPU架构不编码为您的平台允许做这样的:

  1. 通过图像纹理
  2. 渲染中心点只为点
  3. 在片段着色器中计算围绕实际位置的十六进制的平均颜色 这是最难和最多的要求苛刻的部分。如果计算刚刚刻出的圆圈,很容易,但对于六边形,需要计算哪个纹理元素在里面,哪些不是。对于轴对齐的六边形,您可以将十六进制分为多个区域(2x矩形,4x三角形),以便旋转的六边形需要添加变换矩阵。
  4. 在中心点内计算/渲染输出。

我不知道你的框架可以为你做些什么。如果你渲染的东西比较大,那么只需要中心点,那么你需要在你的渲染中使用另一个传递,或者使用更大的基元,然后指向#2,但这意味着你将计算每个渲染像素的平均颜色,这会降低速度很多。

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

如果这不是适用于您的平台然后忽略这个答案...