繁体   English   中英

使用OpenGL处理​​Android相机帧

[英]Android camera frame processing using OpenGL

我正在尝试在相机预览帧上应用人脸检测。 我正在使用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或本机编写的代码执行此操作; 对于前者,您需要将它们读入“直接”ByteBuffer,以便您可以轻松地从本机代码访问像素。 GLES使用的EGL上下文保存在线程本地存储中,因此在GLSurfaceView呈现线程上运行的本机代码将能够访问它。

这种情况的一个例子可以在bigflake找到ExtractMpegFramesTest ,其不同之处主要在于它是从一个视频而不是摄像机抓取的帧。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM