Sobel-filter in C/C++ unter Verwendung von OpenGL ES
Ich würde lieber nicht das Rad neu, wenn ich nicht und muss dies getan haben, bevor. Gibt es irgendwelche Implementierungen der Sobel-filter mit OpenGL ES?
- haben Sie gesehen, link: Sobel-filter Beispiel (royger.org/opencl/?p=22). Aber das ist in OpenCL obwohl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Objective-C ist akzeptabel, könnten Sie Blick auf meine GPUImage framework und seine GPUImageSobelEdgeDetectionFilter. Dies gilt Sobel edge detection using OpenGL ES 2.0 fragment-Shader. Sie können die Ausgabe von der "Skizze" Beispiel in diese Antwort.
Wenn Sie nicht wollen, zu Graben, in die Objective-C-code, die kritische Arbeit, die hier durchgeführt wird, durch zwei Sätze von Shadern. In einem ersten Durchlauf, reduziere ich das Bild auf seine Leuchtdichte und speichern Sie den Wert in die rot -, grün-und blau-Kanäle. Ich mache das mit dem folgenden vertex-shader:
- und fragment-shader:
Nach, dass ich tatsächlich die Sobel-Kantenerkennung (mit helleren Pixel als Kanten in diesem Fall) mit diesem vertex-shader:
und dieses fragment-shader:
Den
imageWidthFactor
undimageHeightFactor
sind lediglich die kehrwerte der Eingabe-Bild-Größe in Pixel.Werden Sie feststellen, dass diese zwei-pass-Ansatz ist komplexer als die in der oben verlinkten Antwort. Das ist, weil die ursprüngliche Umsetzung war nicht am effizientesten, wenn Sie unter mobile GPUs (zumindest die von der PowerVR-Vielfalt bei iOS-Geräten). Durch die Beseitigung aller abhängigen textur liest und Vorberechnung der Leuchtdichte, so dass ich nur die Probe von der rot-Kanal in den letzten shader, diese abgestimmt edge-detection-Methode ist 20X schneller in meinem Maßstäbe als die naive eine, die hat das alles in einem Durchgang.