2016-07-25 18 views
0

schwarz ist, ich meine Frage stellen how to know pixel color using t_sampler in jocl auf eine andere Weise Ich möchte konw, ob ein Pixel schwarz oder weiß ist zu wissen, dass ich t_sampler in meinem Kernel, wie wissen, ob die Pixelfarbe von einem Schwimmer 4

const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | //Natural coordinates 
         CLK_ADDRESS_CLAMP | //Clamp to zeros 
         CLK_FILTER_NEAREST; //Don't interpolate 
bin mit

Dann habe ich

int2 coord = (int2)(get_global_id(0), get_global_id(1)); 
    float4 pixel = read_imageui(input, smp, coord); 

Meine Frage ist: wie kann der Pixelwert verwenden, um die Farbe des betreffenden Pixel wissen?

Ich bin von wenigen Tagen fest und ich versuchte viele Lösungen, um dieses Problem zu lösen, Wenn Sie irgendwelche Erläuterungen benötigen, werde ich antworten. Hier ist mein Kernel-Code

const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | //Natural coordinates 
         CLK_ADDRESS_CLAMP | //Clamp to zeros 
         CLK_FILTER_NEAREST; //Don't interpolate 
__kernel void basic(__read_only image2d_t input,__global float *result) 
{ 

    int gidX = get_global_id(0); 
    int gidY = get_global_id(1); 

int2 coord = (int2)(get_global_id(0), get_global_id(1)); 

int2 posIn = {gidX, gidY}; 

     float4 pixel = read_imagef(input, smp, posIn); 
if ((pixel.x==0.0) && (pixel.y==0.0) && (pixel.z==0.0)){ 

result[gidX]=1; 
} else result[gidX]=0; 
    } 
+0

Sie müssen wissen, welches Farbschema verwendet wird. Ohne Sie kann es nicht entschlüsseln. –

+0

Ich habe nicht verstanden, was Sie durch Farbschema denken, können Sie mir erklären, wie ich es wissen könnte. Gibt es eine Funktion dafür? –

+0

Versuchen Sie Google. Es wird helfen. Z.B. https://en.wikipedia.org/wiki/Color_scheme Ihre Hardware interpretiert den Speicher abhängig vom gewählten Farbschema. –

Antwort

0

das Pixel Lese mit read_imagef (ich es statt read_imageui empfehlen, je nach Bildformat, vor allem, da in Ihrem Beispiel Sie zu einem float4 Variable zuweisen, überprüfen Sie die Spezifikation für die ist für jedes Bildformat geeignet). Die zurückgegebenen float4-Komponenten können dann überprüft werden. pixel.x ist das Rot, pixel.y ist das Grün, pixel.z ist das Blau, und pixel.w ist das Alpha (1.0f, wenn das Quellformat nicht Alpha hat). Um nach Schwarz zu suchen (wie Sie im Betreff Ihrer Frage fragen), prüfen Sie einfach, ob .x und .y und .z alle 0.0 sind.

+0

Danke, ich habe es versucht, aber es scheint, dass es immer 0.0 Du siehst meinen Code-Kernel oben, ich habe ein farbiges Bild verwendet und das Ergebnis ist immer 0. Hier ist mein Kernel-Code, den ich read_imagef benutzt habe. Wo denkst du das Problem ist ????? –

+0

Gibt es eine Lösung zum Lesen von read_imagef-Werten ???? –

+0

Wie starten Sie den Kernel (clEnqueueNDRangeKernel)? Außerdem haben Sie eine Race Condition: Mehrere Work Items schreiben an die gleiche 'result' Position (wenn gidX gleich ist und gidY anders ist). Versuchen Sie, ein Bild als Ausgabe zu verwenden, und beginnen Sie damit, dass Sie einfach den Pixelwert kopieren oder Rot und Grün vertauschen, bis die Dinge funktionieren. Es gibt viele read_imagef-Beispiele. – Dithermaster