使用OpenGL处理​​Android相机帧

时间:2015-10-20 09:07:04

标签: 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对象?任何人都可以向我提供解决方案的一些指示。

1 个答案:

答案 0 :(得分:3)

您的管道目前正在:

  • 相机(生产框架)
  • SurfaceTexture(接收帧,转换为GLES"外部"纹理)
  • [缺少的东西]
  • 传递给C ++的RGB字节数组

你需要为[缺失的东西]做的是将像素渲染到屏幕外的pbuffer并用glReadPixels()读回来。您可以使用Java或本机编写的代码执行此操作;对于前者,你想把它们读成一个"直接" ByteBuffer,您可以轻松地从本机代码访问像素。 GLES使用的EGL上下文保存在线程本地存储中,因此在GLSurfaceView呈现线程上运行的本机代码将能够访问它。

这个例子可以在bigflake ExtractMpegFramesTest中找到,其主要区别在于它从视频而不是摄像机中抓取帧。

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