2017-02-01 4 views
0

Ich arbeite an einem Projekt mit Vuforia. Ich verwende VideoPlayback Probe von Vuforia.Vuforia ChromaKey auf Video-Overlay

Wenn Vuforia einen Marker erkennt, wird ein Video als Überlagerung auf diesem Marker abgespielt. Ich versuche, ein Chromakey auf Video-Overlay anwenden. Ich finde diesen Artikel http://pilcrowpipe.blogspot.fr/2013/03/chroma-keying-transparent-background.html

Ich versuche, den Code zu implementieren, aber nichts funktioniert. Ich denke, dass dieses Beispiel Video-Hintergrund für Chromakey verwendet, aber ich möchte Chromakey auf Overlay-Video. Habe ich recht ?

In Vuforia Beispiel, ich denke, ich muss etwas in renderFrameWithState Funktion ändern.

if (NOT_READY != currentStatus) { 
     // Convert trackable pose to matrix for use with OpenGL 
     // ... 

     /// TEST doesn't work 
     //glDepthFunc(GL_LEQUAL); 
     //glEnable(GL_BLEND); 
     //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
     /// 

     // ... 

     glUseProgram(shaderProgramID); 

     glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices); 
     glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals); 
     glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, texCoords); 

     glEnableVertexAttribArray(vertexHandle); 
     glEnableVertexAttribArray(normalHandle); 
     glEnableVertexAttribArray(textureCoordHandle); 

     // I think I must change something in code above... 
     // But what and where ???? 
     glActiveTexture(GL_TEXTURE0); 
     glBindTexture(GL_TEXTURE_2D, frameTextureID); 
     glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionVideo.data[0]); 
     glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/); 
     glDrawElements(GL_TRIANGLES, kNumQuadIndices, GL_UNSIGNED_SHORT, quadIndices); 

     glDisableVertexAttribArray(vertexHandle); 
     glDisableVertexAttribArray(normalHandle); 
     glDisableVertexAttribArray(textureCoordHandle); 

     glUseProgram(0); 
    } 

Ich bin völlig neu mit OpenGL ES.

Jeder kann mir helfen?

Dank

Antwort

0

OK,

Ich finde Lösung für chromakey aber ich habe ein neues Problem.

Im Fragment-Shader, verwende ich Code oben:

precision mediump float; 
varying vec2 texCoord; 

uniform sampler2D texSampler2D; 

void main() 
{ 
    // Keying for green color 
    vec3 keying_color = vec3(0., 1., 0.); 
    float thresh = 0.8; 
    float slope = 0.2; 
    vec3 input_color = texture2D(texSampler2D, texCoord).rgb; 
    float d = abs(length(abs(keying_color.rgb - input_color.rgb))); 
    float edge0 = thresh * (1.0 - slope); 
    float alpha = smoothstep(edge0, thresh, d); 
    gl_FragColor = vec4(input_color, alpha); 
} 

In VideoPlaybackEAGL.mm, füge ich diesen Code in renderFrameWithState Funktion.

if (NOT_READY != currentStatus) { 
    // Convert trackable pose to matrix for use with OpenGL 
    // ... 

    /// It's work 
    glDepthFunc(GL_LEQUAL); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    /// 

    // ... 

    glUseProgram(shaderProgramID); 

    glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices); 
    glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals); 
    glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, texCoords); 

    glEnableVertexAttribArray(vertexHandle); 
    glEnableVertexAttribArray(normalHandle); 
    glEnableVertexAttribArray(textureCoordHandle); 

    // I think I must change something in code above... 
    // But what and where ???? 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, frameTextureID); 
    glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionVideo.data[0]); 
    glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/); 
    glDrawElements(GL_TRIANGLES, kNumQuadIndices, GL_UNSIGNED_SHORT, quadIndices); 

    glDisableVertexAttribArray(vertexHandle); 
    glDisableVertexAttribArray(normalHandle); 
    glDisableVertexAttribArray(textureCoordHandle); 

    glUseProgram(0); 
} 

Aber jetzt, mein VideoBackground Stop-Rendering, vollständig Einfrieren. Und mein Overlay Video invertiert Positionen. Wenn ich Telefon nach oben orientiere, orientiert sich das Video-Overlay nach unten. Gleiches für links und rechts ...

Haben Sie eine Idee oder eine Lösung. Danke!

+0

Haben Sie bei der Protokollierung nach gl-Fehlern gesucht? Es könnte Ihnen helfen zu sehen, ob etwas nicht stimmt.Außerdem würde ich versuchen, den vorherigen Fragment-Shader zu überprüfen, um herauszufinden, wo das Problem liegt (wenn es im Shader ist oder nicht), da dieses neue Orientierungsproblem seltsam erscheint – yakobom

0

Nach der Suche fand ich die Lösung!

In VideoPlaybackEAGL.mm, füge ich diesen Code in renderFrameWithState Funktion.

if (NOT_READY != currentStatus) { 
    // Convert trackable pose to matrix for use with OpenGL 
    // ... 

    /// It's work 
    glDepthFunc(GL_LEQUAL); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    /// 

    // ... 

    glUseProgram(shaderProgramID); 

    glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices); 
    glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals); 
    glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, texCoords); 

    glEnableVertexAttribArray(vertexHandle); 
    glEnableVertexAttribArray(normalHandle); 
    glEnableVertexAttribArray(textureCoordHandle); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, frameTextureID); 
    glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionVideo.data[0]); 
    glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/); 
    glDrawElements(GL_TRIANGLES, kNumQuadIndices, GL_UNSIGNED_SHORT, quadIndices); 

    glDisableVertexAttribArray(vertexHandle); 
    glDisableVertexAttribArray(normalHandle); 
    glDisableVertexAttribArray(textureCoordHandle); 

    glUseProgram(0); 

    // Adding code above to resolve the problem... 
    glDepthFunc(GL_LEQUAL); 
    glEnable(GL_BLEND); 
} 

Und es ist Arbeit! Ich ändere ein wenig den Vertex-Shader, um die Z-Achse zu korrigieren.

0

die letzten

glEnable(GL_BLEND); 

werden soll:

glDisable(GL_BLEND); 

, um den Hintergrund nicht einfrieren.

Danke für den Code!

Verwandte Themen