使用 OpenGL 处理 Android 相机帧

标签 android opencv opengl-es android-ndk android-camera

我正在尝试在相机预览帧上应用人脸检测。我正在使用 OpenGL 和 OpenCV 在运行时处理这些相机帧。

@Override
    public void onDrawFrame(GL10 unused) {
        if (VERBOSE) {
            Log.d(TAG, "onDrawFrame tex=" + mTextureId);
        }

        mSurfaceTexture.updateTexImage();
        mSurfaceTexture.getTransformMatrix(mSTMatrix);

        // TODO: need to implement
        //JniCppManager.processFrame();

        drawFrame(mTextureId, mSTMatrix);
}

我正在尝试实现 processFrame() 的 C++ 实现。如何从转换矩阵中获取 C++ 中的 Mat 对象?谁能给我一些解决方案的建议。

最佳答案

您的管道目前是:

  • 相机(制作框架)
  • SurfaceTexture(接收帧,转换为 GLES“外部”纹理)
  • [丢失的东西]
  • 传递给 C++ 的 RGB 字节数组

您需要为 [丢失的东西] 做的是将像素渲染到屏幕外 pbuffer 并使用 glReadPixels() 读回它们。您可以从用 Java 或 native 编写的代码中执行此操作;对于前者,您希望将它们读入“直接”ByteBuffer,以便您可以轻松地从 native 代码访问像素。 GLES 使用的 EGL 上下文保存在线程本地存储中,因此在 GLSurfaceView 渲染线程上运行的 native 代码将能够访问它。

这方面的一个例子可以在 bigflake ExtractMpegFramesTest 中找到,其主要区别在于它是从视频而非相机中抓取帧。

对于 API 19+,如果您可以处理 YV12 或 NV21 而不是 RGB 中的帧,则可以将相机提供给 ImageReader。无需复制/转换即可访问数据。

关于使用 OpenGL 处理 Android 相机帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33232446/

相关文章:

matlab - 在 OpenCV 中显示傅里叶变换

Android 模拟器 vs 手机 opengl 不一致

iphone - OpenGL ES - glImageProcessing - 移除纹理

Android Studio - 应用在 AddThis.jar 上崩溃 - "Sources Not Found"消息

java - Map.clear() 与新 map : Which one will be better?

opencv - 从另一个运动物体快速跟踪运动物体

android - 帮助纠正 Android OpenGL 2.0 w/QCAR 中的线缩放

java - Android中的加密字符串

android - 将 JSONArray 转换为字符串数组

cvMatchTemple断言失败错误(VS2015+opencv2)