2016-11-05 2 views
0

Ich mache Videoverarbeitung mit GPUImage2. Wenn die App startet, erstelle ich ein hexagonales Gitter und füge es meiner cameraView hinzu. Das Raster ist Vollbild und besteht aus etwa 100 Sechsecken. Im Allgemeinen, was ich versuche zu erreichen istGPUImage: Wie ermittelt man eine durchschnittliche Farbe innerhalb des Sechsecks?

Für jeden Rahmen Ich möchte eine durchschnittliche Farbe (in RGB oder sogar besser HSV) innerhalb jeder Zelle des Rasters finden. Wenn die Farbe bestimmt ist, möchte ich etwas in der Mitte jedes Sechsecks zeichnen, abhängig von der durchschnittlichen Farbe.

Ich habe ein Array mit Sechsecken, jeder von ihnen kennt die Koordinaten und die Mitte der Ecken. Ich habe auch ein Array mit UIBezierPaths, die Grenzen dieser Sechsecke enthält (nur für den Fall).

So sieht mein Code wie diese

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 { 

     } 
    } 
} 

I didCaptureBuffer erraten(), um den Ort averageColorExtractor zu jedem Sechseck sein sollte gelten, aber keine Ahnung, was als nächstes zu tun ..

I bin neu in der iOS-Entwicklung und es ist das erste Mal, dass ich GPUImage2 benutze ... Bitte, führe mich in die richtige Richtung.

Antwort

0

Nicht Codierung für Ihre Plattform überhaupt, aber GPU Architektur erlaubt es, wie dies zu tun:

  1. das Bild als Textur passieren
  2. die Mittelpunkte machen nur als Punkte
  3. im Fragment-Shader berechnen die durchschnittliche Farbe des Sechsecks um die tatsächliche Position Dies ist das härteste und leistungsfähigste ein anspruchsvoller Teil. Wenn Sie nur einen Inkreis berechnen, ist es einfach, aber für Hexagon müssen Sie berechnen, welches Texel innen ist und welches nicht. Für Achsen ausgerichtete Sechsecke können Sie hex in Regionen (2x Rechteck, 4x Dreieck) für gedrehte Sechsecke teilen, die Sie Transformationsmatrix hinzufügen müssen.
  4. berechnen/rendern Ausgabe im Mittelpunkt.

Ich weiß nicht, was Ihr Framework für Sie tun kann. Wenn du gerenderte Sachen größer als nur der Mittelpunkt bist, dann brauchst du entweder einen anderen Durchlauf in deinem Render oder benutze größere Primitive und Punkte in # 2 aber das bedeutet, dass du die durchschnittliche Farbe für jedes gerenderte Pixel berechnen wirst, was die Dinge verlangsamen kann viel.

Werfen Sie einen Blick auf GLSL Shader, die diese Technik (für ganz andere Aufgabe, aber die Technik ist das gleiche) verwendet:

Wenn dies auf Ihre Plattform nicht anpassungsfähig ist dann ignoriere diese Antwort ...

Verwandte Themen