Vuforia ChromaKey视频叠加

时间:2017-02-01 15:00:18

标签: ios video opengl-es-2.0 vuforia chromakey

我与Vuforia合作开展一个项目。 我使用 Vuforia 中的 VideoPlayback 示例。

当Vuforia检测到标记时,视频会在此标记上显示为叠加层。我尝试在视频叠加层上应用色度键。我找到了这篇文章http://pilcrowpipe.blogspot.fr/2013/03/chroma-keying-transparent-background.html

我尝试实现代码但没有任何效果。我认为这个例子使用视频背景为抠像,但我想在叠加视频上使用chromakey。我是对的吗?

在Vuforia Sample中,我想我必须在 renderFrameWithState 函数中更改一些内容。

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);
    }

我完全不喜欢OpenGL ES。

任何人都可以帮助我?

由于

3 个答案:

答案 0 :(得分:0)

行,

我找到了抠像的解决方案,但我遇到了一个新问题。

在片段着色器中,我使用上面的代码:

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);
}

在VideoPlaybackEAGL.mm中,我在 renderFrameWithState 函数中添加此代码。

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);
}

但是现在,我的VideoBackground停止呈现,完全冻结。我的叠加视频反转位置。当我将手机定位到顶部时,视频覆盖方向朝向底部。左右相同......

您有任何想法或解决方案吗? 谢谢!

答案 1 :(得分:0)

搜索后,我找到了解决方案!

VideoPlaybackEAGL.mm 中,我在 renderFrameWithState 函数中添加此代码。

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);
}

它的工作!我改变了一点顶点着色器以纠正z轴。

答案 2 :(得分:0)

最后一次

glEnable(GL_BLEND);

应该是:

glDisable(GL_BLEND);

为了不冻结背景。

感谢您的代码!