android - OpenGL ES 2 不适用于 Android API23

标签 android opencv opengl-es

在我的应用程序中,我正在做一些图像像素操作。 我的代码基于 THIS示例。

我所做的唯一更改是将 FRAGMENT_SHADER 更改为灰度,它看起来像这样:

private static final String FRAGMENT_SHADER =
        "#extension GL_OES_EGL_image_external : require\n" +
        "precision mediump float;\n" +      // highp here doesn't seem to matter
        "varying vec2 vTextureCoord;\n" +
        "uniform samplerExternalOES sTexture;\n" +
        "void main() {\n" +
        "    vec4 tc = texture2D(sTexture, vTextureCoord);\n" +
        "    gl_FragColor.r = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
        "    gl_FragColor.g = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
        "    gl_FragColor.b = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
        "}\n";

问题: 我从 Galaxy s7 设备录制了一段视频,录制后我拍摄了录制的视频,我正在从 2 个不同的设备(Galaxy S7 和 Galaxy s3)读取第一帧,我发现像素值在那些设备之间完全不同设备。

有人知道为什么会这样吗?由于这种差异,我的算法失败了,我该怎么做才能解决这个问题?

更新:

这是我得到的差异的示例。

银河 S3: 矩阵的一部分 213, 214, 212, 214, 216, 214, 213, 212, 212, 212, 213, 214, 214, 214, 213, 213, 214, 214, 214, 214, 212, 213, 212, 213, 212, 214, 214, 212, 212, 210, 211, 210, 211, 210, 211, 211, 214, 211, 214, 213, 213, 214, 214, 216, 216, 216, 215, 215, 216, 212, 213, 213, 214, 213, 213, 212, 211, 209, 209, 207, 208, 208, 210, 211, 209, 207, 209, 210, 217, 219, 216, 209, 209, 210, 210, 210, 211, 209, 207, 205, 205, 206, 210, 210, 220, 211, 202, 210, 211, 206, 206, 209, 210, 211, 213, 219, 222, 216, 217, 217

非零像素数:1632816

所有像素的总和:3.1834445E8

银河 S7: 与 Galaxy 3 相同的 Matrix 部分 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164

非零像素数:1063680

所有像素的总和:1.6593408E8

更新2:

我发现收到的图像完全毁了,但是视频录制的很好。 这是 Galaxy S3 的好照片: enter image description here

这是我从 Galaxy S7 获得的图像(同一帧#) enter image description here

我完全不知道这里发生了什么,但我知道最后一张图片对于所有 Marshmallow 设备(Galaxy S6、S7 和华为)都是一样的

最佳答案

Ok 经过一周的努力寻找解决方案,找到了!

正如我所说,我基于 bigflake 示例,在这个示例中有一个反转框架的选项,在示例中完成了什么。

通过将 invert 更改为 false,问题得到解决。

如果有人能向我解释框架反转的原因,以及为什么决定将其默认设置为“真”,我将不胜感激。

感谢您的帮助!

如果不够清楚,这是我所做的更改:

outputSurface.drawImage(false);

关于android - OpenGL ES 2 不适用于 Android API23,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39465637/

相关文章:

Android 尝试读取已关闭的流错误?

android - Android构建过程中的优化有详细的描述吗?

android - 如何检测Android中的键盘动画结束?或者立即隐藏没有动画的键盘

android - Opencv4Android : How to use with C++

python - 在骨架图像OpenCV python中查找线

android - 如何禁用 EditText Android 中的退格行为?

python - 将变换矩阵应用于 OpenCV 图像中的像素

opengl-es - 将 glReadBuffer()/glDrawBuffer() 调用转换为 OpenGL ES

java - 如何从脸部检测特定物体并实时添加我的图像?

java - 什么是在普通 View 和 GLsurface View 之间切换的最佳方式,Android